next up previous
Next: スライダーイベント Up: 5 画像処理 Previous: 5.2 メディアンフィルタ

5.3 色抽出処理

以下に知能機械情報学専攻のTAの鈴木義久君による 画像処理プログラムの例を紹介する.
図 11: 色抽出処理
\includegraphics[width=13cm]{/home/inaba/eps/lecture/fig/Facecolor1.eps} \includegraphics[width=13cm]{/home/inaba/eps/lecture/fig/Facecolor2.eps}
// FaceColor.java
import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
import java.lang.Math.*;

/*<applet code="FaceColor.class"
  width="750" height="400">
  <param name="img_" value="h6.jpg">
  </applet>*/


public class FaceColor extends Applet{
  Image img_;
  Image img;
  MediaTracker mt;
  int w=410,h=307;
  int[][] color= new int[w*h][3];
    
  Scrollbar bright_min =
  new Scrollbar(Scrollbar.HORIZONTAL,
                128,1,0,255*3+1);
  Scrollbar bright_max =
  new Scrollbar(Scrollbar.HORIZONTAL,
                255*3,1,0,255*3+1);
  Scrollbar red_min =
  new Scrollbar(Scrollbar.HORIZONTAL,
                400,1,0,1000+1);
  Scrollbar red_max =
  new Scrollbar(Scrollbar.HORIZONTAL,
                1000,1,0,1000+1);
  Scrollbar green_min =
  new Scrollbar(Scrollbar.HORIZONTAL,
                0,1,0,1000+1);
  Scrollbar green_max =
  new Scrollbar(Scrollbar.HORIZONTAL,
                400,1,0,1000+1);
  Scrollbar blue_min =
  new Scrollbar(Scrollbar.HORIZONTAL,
                0,1,0,1000+1);
  Scrollbar blue_max =
  new Scrollbar(Scrollbar.HORIZONTAL,
                400,1,0,1000+1);
  
  public void init(){
    mt=new MediaTracker(this);
    setBackground(Color.white);
    setBackground(Color.white);

    img_ = getImage(getDocumentBase(),
                    getParameter("img_"));

    getColor(img_, color, w, h);

    img=img_;

    // ボタン設置
    Button btn_color = new Button("色抽出");
    Button btn_reset = new Button("リセット");
        
    setLayout(new BorderLayout());

    Panel p = new Panel(new GridLayout(8,1));
    p.setBackground(Color.white);        

    Panel p_color1 =
      new Panel(new GridLayout(2,3));
    p_color1.setBackground(Color.white);

    Panel p_color_btn =
      new Panel(new FlowLayout(FlowLayout.LEFT));
    p_color_btn.setBackground(Color.white);
    p_color_btn.add(btn_color);
    p_color1.add(p_color_btn);
    p_color1.add(new Label("bright            min"));
    p_color1.add(bright_min);
    p_color1.add(new Label(""));
    p_color1.add(new Label("bright            max"));
    p_color1.add(bright_max);
    p.add(p_color1);


    Panel p_color2 = new Panel(new GridLayout(2,3));
    p_color2.setBackground(Color.white);
    p_color2.add(new Label(""));
    p_color2.add(new Label("R'                min"));
    p_color2.add(red_min);
    p_color2.add(new Label(""));
    p_color2.add(new Label("R'                max"));
    p_color2.add(red_max);
    p.add(p_color2);

    Panel p_color3 = new Panel(new GridLayout(2,3));
    p_color3.setBackground(Color.white);
    p_color3.add(new Label(""));
    p_color3.add(new Label("G'                min"));
    p_color3.add(green_min);
    p_color3.add(new Label(""));
    p_color3.add(new Label("G'                max"));
    p_color3.add(green_max);
    p.add(p_color3);

    Panel p_color4 = new Panel(new GridLayout(2,3));
    p_color4.setBackground(Color.white);
    p_color4.add(new Label(""));
    p_color4.add(new Label("B'                min"));
    p_color4.add(blue_min);
    p_color4.add(new Label(""));
    p_color4.add(new Label("B'                max"));
    p_color4.add(blue_max);
    p.add(p_color4);


    Panel p_reset =
      new Panel(new FlowLayout(FlowLayout.LEFT));
    p_reset.setBackground(Color.white);
    p_reset.add(btn_reset);
    p.add(p_reset);


    add("East",p);

    btn_reset.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          img_ = reset();
          repaint();
          getColor(img_, color, w, h);

        }
      });

    btn_color.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          img_ = color(bright_min,bright_max,
                       red_min,red_max,
                       green_min,green_max,
                       blue_min,blue_max,
                       w,h);
          repaint();
          getColor(img, color, w, h);
        }
      });

   /*
    * <<<<< スライダーイベント処理登録 >>>>>>
    */

  }

  public void paint(Graphics g) {
    g.drawImage(img_,0,0,this);                
  }

  public Image reset() {
    return img;
  }

  public Image color(Scrollbar bright_min,
                     Scrollbar bright_max,
                     Scrollbar red_min,
                     Scrollbar red_max,
                     Scrollbar green_min,
                     Scrollbar green_max,
                     Scrollbar blue_min,
                     Scrollbar blue_max,
                     int w,   // 画像の幅
                     int h   // 画像の高さ
  ){
    int tmp;
    int[] pix= new int[w*h];
    double r_min,g_min,b_min,br_min;
    double r_max,g_max,b_max,br_max;
    double r,g,b,bright;
 
    r_min=red_min.getValue();
    r_max=red_max.getValue();
    g_min=green_min.getValue();
    g_max=green_max.getValue();
    b_min=blue_min.getValue();
    b_max=blue_max.getValue();

    br_min=bright_min.getValue();
    br_max=bright_max.getValue();

    for(int i=0;i<h;i++){
      for(int j=0;j<w;j++){
        bright=
          color[j+i*w][0]+
          color[j+i*w][1]+
          color[j+i*w][2];
        r=(double)(1000*color[j+i*w][0])/bright;
        g=(double)(1000*color[j+i*w][1])/bright;
        b=(double)(1000*color[j+i*w][2])/bright;

        if(br_min > bright ||
           br_max < bright ||
           r_min > r ||
           r_max < r ||
           g_min > g ||
           g_max < g ||
           b_min > b ||
           b_max < b){
                   
          for(int k=0;k<3;k++){
            color[j+i*w][k]= 0;
          }
        }
      }
    }

    return makeImage(color, w , h);
  }

  // 色情報(0~255)をしまう配列 color[h*w][3]
  Image makeImage(int color[][],
                  int w,   // 画像の幅
                  int h   // 画像の高さ
  ){
    int[] pix = new int[w*h];
        
    for(int i=0;i<h;i++){
      for(int j=0;j<w;j++){
        pix[j+i*w]=(255<<24)|
          (color[j+i*w][0]<<16)|
          (color[j+i*w][1]<<8)|
          (color[j+i*w][2]);
      }
    }
    return createImage(new
      MemoryImageSource(w,h,pix,0,w));
  }

  // 画像から色情報を取り出す。
  // 色情報(0~255)をしまう配列 color[h*w][3]
  void getColor(Image img_,  // 元の画像
                int color[][],
                int w,   // 画像の幅
                int h   // 画像の高さ
  ) {
    int[] pix= new int[w*h];
    PixelGrabber pg=
      new PixelGrabber(img_,0,0,w,h,pix,0,w);
    try{pg.grabPixels();}catch(Exception e){}
    for(int i=0;i<h;i++){
      for(int j=0;j<w;j++){
        color[j+i*w][0]=
          (pix[j+i*w] & 0xff0000)>>16;   // 赤色
        color[j+i*w][1]=
          (pix[j+i*w] & 0xff00)>>8;   // 緑色
        color[j+i*w][2]=
          pix[j+i*w] & 0xff;   // 青色
      }
    }
  }
}


generated through LaTeX2HTML. M.Inaba 平成18年5月7日