キー | 画像 | 意味 | 特徴 |
---|---|---|---|
0 | 元.bmp | 元画像 | |
1 | 1ノイズ.png | 元画像にノイズを加えた画像 | 全体の1%のピクセルが元画像と明度反転している |
2 | 2収縮1.png | ノイズ画像にfilter関数で収縮処理を加えた画像 | 黒ノイズが大きくなり、白ノイズが消える |
3 | 2収縮2.png | ノイズ画像に周囲のピクセルとの比較で収縮処理を加えた画像 | 2キーの画像と全く同じもの |
4 | 3膨張1.png | ノイズ画像にfilter関数で膨張処理を加えた画像 | 白ノイズが大きくなり、黒ノイズが消える |
5 | 3膨張2.png | ノイズ画像に周囲のピクセルとの比較で膨張処理を加えた画像 | 4キーの画像と全く同じもの |
// 画像用の変数 PImage[] img = new PImage[6]; // 出力ファイル名 String[] fName = {"元", "1ノイズ", "2収縮1", "2収縮2", "3膨張1", "3膨張2"}; int w=400; int h=200; void setup() { size(800, 400); noSmooth(); boolean isRightSize = true; boolean isBW = true; img[0] = loadImage("元.bmp"); // サイズ判定 if (img[0].width != w || img[0].height != h) { isRightSize = false; } // 白黒判定 for (int j=0; j<h; j++) { for (int i=0; i<w; i++) { if (img[0].pixels[i+j*w]!=color(0) && img[0].pixels[i+j*w]!=color(255)) { isBW = false; } } } if (!isRightSize || !isBW) { println("サイズが違うか、白黒画像ではありません"); exit(); } else { addNoise(1); // ノイズを追加した画像をimg[1]に保存 erode1(2); // filter関数で収縮した画像をimg[2]に保存 erode2(3); // 周囲のピクセルとの比較で収縮した画像をimg[3]に保存 dilate1(4); // filter関数で膨張した画像をimg[4]に保存 dilate2(5); // 周囲のピクセルとの比較で膨張した画像をimg[5]に保存 println("完了"); textFont(createFont("MS Pゴシック", 48)); background(0); image(img[0], 0, 0, width, height); } } void draw() { } // ノイズ追加(課題1) void addNoise(int n) { // n番を元画像と同じ画像にする img[n] = img[0].get(); // 画素数の1/100回の繰り返し for (int i=0; i<w*h/100; i++) { // 0~w*h-1の範囲の乱数をint rに入れる // n番目の画像のr番目のピクセルの明度をfloat bに入れる // n番目の画像のr番目のピクセルに明度255-bの色を設定する } img[n].save("data/"+ fName[n] +".png"); // 2~5番をノイズ画像と同じ画像にする for (int i=2; i<img.length; i++) { img[i] = img[1].get(); } } // ノイズ画像の(x, y)のピクセルの色を返す String getC(int x, int y) { if (x<0 || x>=w || y<0 || y>=h) { return ""; } if (brightness(img[1].pixels[x+y*w]) == 0) { return ""; } return ""; } // filter関数による収縮(課題2) void erode1(int n) { img[n].save("data/"+ fName[n] +".png"); } // 周囲のピクセルとの比較による収縮(課題2) void erode2(int n) { for (int j=0; j<h; j++) { for (int i=0; i<w; i++) { // (i, j)のピクセルの上下左右のどれかが黒なら(i, j)を黒にする } } img[n].save("data/"+ fName[n] +".png"); } // filter関数による膨張(課題3) void dilate1(int n) { img[n].save("data/"+ fName[n] +".png"); } // 周囲のピクセルとの比較による膨張(課題3) void dilate2(int n) { for (int j=0; j<h; j++) { for (int i=0; i<w; i++) { // (i, j)のピクセルの上下左右のどれかが白なら(i, j)を白にする } } img[n].save("data/"+ fName[n] +".png"); } void keyPressed() { int k = key-'0'; if (k>=0 && k<=5) { background(0); image(img[k], 0, 0, width, height); fill(255, 0, 0); text(fName[k], 30, height-30); fill(255); } }