2015年3月23日月曜日

Javaによる画像処理

この記事はイトナブ開発合宿にて作成されました。
イトナブ開発合宿を知らない方はまずこちらを御覧ください。
イトナブ開発合宿in滝沢市を開催しました。

自己紹介+合宿の感想
初めまして!
岩手県立大学ソフトウェア情報学部2年
溝渕俊樹です。
このたびは、イトナブ開発合宿に参加させていただき貴重な体験をさせていただきました。
各、一人一人が独自のテーマを決め、深く研究するというもので開発というものが初体験の私は緊張しながらの参加でしたが、みなさん温かく個性豊かなニックネームなどもあり、楽しむことができました。
そこで私が決めたテーマはImage processing(画像処理)です。
画像処理といっても幅が広いので今回は色を検証するということに重点を置き開発を行いました。
[開発環境]
Eclipse


[ソースコード]
package img;
import static img.Colors.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Processing {
    public static void main(String[] args) throws IOException {
        File f = new File("Apple.jpg"); //実行したい画像 
        BufferedImage read=ImageIO.read(f);
        int w = read.getWidth(),h=read.getHeight();
        BufferedImage write =
                new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        for(int y=0;y<h;y++){
            for(int x=0;x<w;x++){
                int c = read.getRGB(x, y); 
                int r = r(c);
                int g = g(c);
                int b = b(c);
                if((r > 200) && (g > 200) && (b > 200)){
                    r = 0;}
                if( r < 90){
                r = 0;
                }
                if( g > 110){
                r = 0;
                }
                if( b > 110){
                r =0;
                }
                g = 0;
                b = 0;   //チャンネルの値を検出したいものに変更
                int rgb = rgb(r,g,b);
                write.setRGB(x,y,rgb);
            }
        }
        File f2 = new File("red.jpg");
        ImageIO.write(write, "jpg", f2);
    }
}


package img;
public class Colors{
    public static int a(int c){
        return c>>>24; //Alpha
    }
    public static int r(int c){
        return c>>16&0xff; //Red
    }
    public static int g(int c){
        return c>>8&0xff;   //Green
    }
    public static int b(int c){
        return c&0xff;     //Blue
    }
    public static int rgb
    (int r,int g,int b){
        return 0xff000000 | r <<16 | g <<8 | b;
    }
    public static int argb
    (int a,int r,int g,int b){
        return a<<24 | r <<16 | g <<8 | b;
    }
}



[実行結果]
比較画像





このように赤い色素の部分だけをうまく検出することができました。
活用事例+可能性としては、画像処理の際にその画像にはどのような色素の割合が多く含まれているかなどがわかり、色弱などの目に障害を持つ人も助けになると考える。

[総括]
画像処理について研究を進める上で、色の重要さに気づくことができました。
今回は一つの検出方法しか試すことができなかったので、また機会があれば、他の方法で検証してみたいと思います。

参考URL
http://d.hatena.ne.jp/nodamushi/20111012/1318436587

0 件のコメント:

コメントを投稿