講義科目「画像工学」では画像処理の演習課題として、プログラミング言語 Processing を用いてプログラムの作成を行います。ここでは、参考となる基礎的な画像処理プログラムを記載します。
このプログラムについて
Processing version 3.3 で動作確認している。画像ファイルは自分で用意せよ。
プログラムの解説は講義の配付テキストを参照せよ。
変数宣言,型変換,文字出力
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { int a; float x; a = 12; x = 3.0/2; println( "Hello" ); println( a ); println( a, x ); a = int( x ); println( "a=", a, ", x=", x ); } |

画像ファイルの読み込みと表示
1 2 3 4 5 6 7 8 9 10 11 12 |
PImage f; void settings() { f = loadImage("cat.jpg"); size(f.width, f.height); } void setup() { image(f, 0, 0); } |

画像の濃淡変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
PImage f; void settings() { f = loadImage("cat.jpg"); size(f.width, f.height); } void setup() { int x, y; float R, G, B; color c; for(y = 0; y < f.height; y++){ for(x = 0; x < f.width; x++){ R = red( f.get(x, y) ); G = green( f.get(x, y) ); B = blue( f.get(x, y) ); R += 100; G += 100; B += 100; c = color(R, G, B); f.set(x, y, c); } } f.save("cat2.jpg"); image(f, 0, 0); } |

平均値フィルタ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
PImage f, g; void settings() { f = loadImage("cat.jpg"); g = createImage(f.width, f.height, RGB); f.filter(GRAY); size(f.width*2, f.height); } void setup() { int x, y; float a; for(y = 1; y < f.height-1; y++){ for(x = 1; x < f.width-1; x++){ a = red(f.get(x-1,y-1)) + red(f.get(x,y-1)) + red(f.get(x+1,y-1)) + red(f.get(x-1,y )) + red(f.get(x,y )) + red(f.get(x+1,y )) + red(f.get(x-1,y+1)) + red(f.get(x,y+1)) + red(f.get(x+1,y+1)); a = a / 9; g.set(x, y, color(a)); } } image(f, 0, 0); image(g, f.width, 0); } |

1次微分フィルタ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
PImage f, g1, g2, g3; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); g1 = createImage(f.width, f.height, RGB); g2 = createImage(f.width, f.height, RGB); g3 = createImage(f.width, f.height, RGB); size(f.width*2, f.height*2); } void setup() { int x, y; float dx, dy, norm; for(y = 1; y < f.height-1; y++){ for(x = 1; x < f.width-1; x++){ dx = red(f.get(x+1,y )) - red(f.get(x,y)); dy = red(f.get(x ,y+1)) - red(f.get(x,y)); norm = sqrt(dx*dx + dy*dy); dx = abs(dx); dy = abs(dy); g1.set(x, y, color(dx)); g2.set(x, y, color(dy)); g3.set(x, y, color(norm)); } } image(f, 0, 0); image(g1, f.width, 0); image(g2, 0, f.height); image(g3, f.width, f.height); } |

2次微分フィルタ(ラプラシアンフィルタ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
PImage f, g; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); g = createImage(f.width, f.height, RGB); size(f.width*2, f.height); } void setup() { int x, y; float a; for(y = 1; y < f.height-1; y++){ for(x = 1; x < f.width-1; x++){ a = + red(f.get(x,y-1)) + red(f.get(x-1,y)) - 4*red(f.get(x,y )) + red(f.get(x+1,y)) + red(f.get(x,y+1)); a = abs(a); g.set(x, y, color(a)); } } image(f, 0, 0); image(g, f.width, 0); } |

画像の平行移動
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
PImage f, g; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); g = createImage(f.width, f.height, RGB); size(f.width*2, f.height); } void setup() { int X, Y; int x, y; float a; for(y = 0; y < g.height; y++){ for(x = 0; x < g.width; x++){ X = x - 80; Y = y - 30; a = red(f.get(X, Y)); g.set(x, y, color(a)); } } image(f, 0, 0); image(g, f.width, 0); } |

画像の拡大縮小(最近傍内挿)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
PImage f, g; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); g = createImage(f.width, f.height, RGB); size(f.width*2, f.height); } void setup() { int X, Y; int x, y; float a, Xf, Yf; for(y = 0; y < g.height; y++){ for(x = 0; x < g.width; x++){ Xf = x / 1.5; Yf = y / 0.8; X = int(Xf + 0.5); Y = int(Yf + 0.5); a = red(f.get(X, Y)); g.set(x, y, color(a)); } } image(f, 0, 0); image(g, f.width, 0); } |

画像の拡大縮小(バイリニア補間)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
PImage f, g; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); g = createImage(f.width, f.height, RGB); size(f.width*2, f.height); } void setup() { int X, Y; int x, y; float a, Xf, Yf, s, t; for(y = 0; y < g.height; y++){ for(x = 0; x < g.width; x++){ Xf = x / 1.5; Yf = y / 0.8; X = int(Xf); Y = int(Yf); s = Xf - X; t = Yf - Y; a = (1-s)*(1-t) * red(f.get(X , Y )) + s *(1-t) * red(f.get(X+1, Y )) + (1-s)* t * red(f.get(X , Y+1)) + s * t * red(f.get(X+1, Y+1)); g.set(x, y, color(a)); } } image(f, 0, 0); image(g, f.width, 0); } |

画像の回転
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
PImage f, g; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); g = createImage(f.width, f.height, RGB); size(f.width*2, f.height); } void setup() { int X, Y; int x, y; float a, Xf, Yf, s, t; float rad; rad = radians(20); for(y = 0; y < g.height; y++){ for(x = 0; x < g.width; x++){ Xf = x*cos(rad) + y*sin(rad); Yf = -x*sin(rad) + y*cos(rad); X = int(Xf); Y = int(Yf); s = Xf - X; t = Yf - Y; a = (1-s)*(1-t) * red(f.get(X , Y )) + s *(1-t) * red(f.get(X+1, Y )) + (1-s)* t * red(f.get(X , Y+1)) + s * t * red(f.get(X+1, Y+1)); g.set(x, y, color(a)); } } image(f, 0, 0); image(g, f.width, 0); } |

2値図形の面積
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
PImage f; void settings() { f = loadImage("cat.jpg"); f.filter(GRAY); size(f.width, f.height); } void setup() { int x, y; int S = 0; f.filter(THRESHOLD, 0.2); for(y = 0; y < f.height; y++){ for(x = 0; x < f.width; x++){ if( red(f.get(x, y)) == 255 ){ S++; } } } println("Image Area =", f.width*f.height); println("Object Area =", S); image(f, 0, 0); } |


相違度SSD(差分2乗和)の計算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
PImage f, t; void settings() { f = loadImage("cat.jpg"); t = loadImage("cat_lossy.jpg"); f.filter(GRAY); t.filter(GRAY); size(f.width*2, f.height); } void setup() { int x, y; float a, ssd = 0; for(y = 0; y < f.height; y++){ for(x = 0; x < f.width; x++){ a = red(f.get(x, y)) - red(t.get(x, y)); ssd += a*a; } } println("SSD =", ssd); image(f, 0, 0); image(t, f.width, 0); } |


SSDによるテンプレートマッチング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
PImage f, t; void settings() { f = loadImage("cat.jpg"); t = loadImage("cat_template.jpg"); f.filter(GRAY); t.filter(GRAY); size(f.width+t.width, f.height); } void setup() { int x, y, X, Y; int mx=0, my=0; float a, ssd, ssdmin = 3e+38; for(Y = 0; Y < f.height - t.height; Y++){ for(X = 0; X < f.width - t.width; X++){ ssd = 0; for(y = 0; y < t.height; y++){ for(x = 0; x < t.width; x++){ a = red(f.get(x+X, y+Y)) - red(t.get(x, y)); ssd += a*a; } } if(ssd < ssdmin){ mx = X; my = Y; ssdmin = ssd; } } } image(f, 0, 0); image(t, f.width, 0); stroke(255, 0, 0); noFill(); rect(mx, my, t.width, t.height); } |

3DCGにおけるシェーディング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void settings() { size(400, 400, P3D); } void setup() { background(0); noStroke(); translate(200, 200, 0); ambientLight(120, 120, 120); lightSpecular(255, 255, 255); directionalLight(255, 255, 255, -1, 1, -1); specular(250, 250, 250); shininess(10.0); fill(0, 180, 0); sphere(120); } |

3DCGにおけるテクスチャマッピング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
float rx = -0.5; float ry = 0.5; float rz = 0.0; PImage tex1, tex2, tex3; void setup() { size(400, 400, P3D); noStroke(); tex1 = loadImage("texture1.jpg"); tex2 = loadImage("texture2.jpg"); tex3 = loadImage("texture3.jpg"); textureMode(NORMAL); } void draw() { background(255); translate(200, 200, 0); rotateX(rx); rotateY(ry); rotateZ(rz); scale(100); beginShape(QUADS); texture(tex3); vertex(-1,-1, 1, 0, 0); vertex(-1, 1, 1, 0, 1); vertex( 1, 1, 1, 1, 1); vertex( 1,-1, 1, 1, 0); endShape(); beginShape(QUADS); texture(tex3); vertex(-1,-1,-1, 0, 0); vertex(-1, 1,-1, 0, 1); vertex( 1, 1,-1, 1, 1); vertex( 1,-1,-1, 1, 0); endShape(); beginShape(QUADS); texture(tex1); vertex(-1,-1, 1, 0, 1); vertex( 1,-1, 1, 1, 1); vertex( 1,-1,-1, 1, 0); vertex(-1,-1,-1, 0, 0); endShape(); beginShape(QUADS); texture(tex1); vertex(-1, 1, 1, 0, 0); vertex( 1, 1, 1, 1, 0); vertex( 1, 1,-1, 1, 1); vertex(-1, 1,-1, 0, 1); endShape(); beginShape(QUADS); texture(tex2); vertex(-1,-1, 1, 0, 0); vertex(-1, 1, 1, 0, 1); vertex(-1, 1,-1, 1, 1); vertex(-1,-1,-1, 1, 0); endShape(); beginShape(QUADS); texture(tex2); vertex(1,-1, 1, 0, 0); vertex(1, 1, 1, 0, 1); vertex(1, 1,-1, 1, 1); vertex(1,-1,-1, 1, 0); endShape(); } void keyPressed() { if (key == 'a') { ry = ry - 0.04; } else if (key == 'd') { ry = ry + 0.04; } else if (key == 'w') { rx = rx + 0.04; } else if (key == 's') { rx = rx - 0.04; } else if (keyCode == LEFT) { rz = rz - 0.04; } else if (keyCode == RIGHT){ rz = rz + 0.04; } } |
