Processingで空間フィルタリングをしてみる(仮)
Post date: May 23, 2013 2:36:37 PM
時間がないのでソースだけ。
float fil[][]=
{ { -1, 0, 1},
{ -2, 0, 2},
{ -1, 0, 1}};
float mat_pre[][]=new float[640][480];
int mat_now[][]=new int[640][480];
size(640, 240);
PImage img1=loadImage("test.png");
img1.loadPixels();
//1時配列→2時配列
for (int x=0;x<640;x++) {
for (int y=0;y<480;y++) {
mat_pre[x][y]=blue(img1.pixels[x+y*640]);
}
}
println((int)blue(img1.pixels[100+100*640]));
//空間フィルタリング
for (int x=1;x<640-1;x++) {
for (int y=1;y<480-1;y++) {
float sum=0;
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {
sum+=mat_pre[x+i-1][y+j-1]*fil[j][i];
}
}
mat_now[x][y]=(int)sum;
if (mat_now[x][y]<0)mat_now[x][y]=0;
if (mat_now[x][y]>255)mat_now[x][y]=255;
}
}
PImage img2=createImage(640, 480, RGB);
img2.loadPixels();
//1時配列→2時配列
for (int x=0;x<640;x++) {
for (int y=0;y<480;y++) {
img2.pixels[x+y*640]=color(mat_now[x][y]);
}
}
img2.updatePixels();
//表示
image(img1, 0, 0, 320, 240);
image(img2, 320, 0, 320, 240);
プログラムの単純化のため、入力画像は白黒でサイズ640x480に固定。
余分な機能を吐き捨ててるため、滅茶苦茶ソースは読みやすいはず。