Next: スライダーイベント
Up: 5 画像処理
Previous: 5.2 メディアンフィルタ
以下に知能機械情報学専攻のTAの鈴木義久君による
画像処理プログラムの例を紹介する.
// 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日