Processingで細線化フィルタを作ったので残しておくことにしました。
[ 使用例 ]
[ プログラム ]
プログラムを実行するとpdeファイルと同じディレクトリ内にフィルタリングされた画像が保存されます。
//左上カーネル float[][][] k_ul = new float[][][] { { {0, 0, -1}, {0, 1, 1}, {-1, 1, 1}, }, { {0, -1, 1}, {0, 1, 1}, {0, -1, 1}, }, { {0, 0, 0}, {-1, 1, -1}, {1, 1, 1}, }, { {0, 0, 0}, {0, 1, 1}, {0, 0, 1}, }, { {0, 0, 0}, {0, 1, 0}, {0, 1, 1}, }, }; //右下カーネル float[][][] k_lr = new float[][][] { { {1, 1, -1}, {1, 1, 0}, {-1, 0, 0}, }, { {1, 1, 1}, {-1, 1, -1}, {0, 0, 0}, }, { {1, -1, 0}, {1, 1, 0}, {1, -1, 0}, }, }; //右上カーネル float[][][] k_ur = new float[][][] { { {-1, 0, 0}, {1, 1, 0}, {1, 1, -1}, }, { {0, 0, 0}, {-1, 1, -1}, {1, 1, 1}, }, { {1, -1, 0}, {1, 1, 0}, {1, -1, 0}, }, { {0, 0, 0}, {0, 1, 0}, {1, 1, 0}, }, { {0, 0, 0}, {1, 1, 0}, {1, 0, 0}, } }; //左下カーネル float[][][] k_ll = new float[][][] { { {-1, 1, 1}, {0, 1, 1}, {0, 0, -1}, }, { {0, -1, 1}, {0, 1, 1}, {0, -1, 1}, }, { {1, 1, 1}, {-1, 1, -1}, {0, 0, 0}, }, }; //フィルタを行う回数 int th = 100; void setup() { PImage i = loadImage("入力画像.png"); int w = i.width; int h = i.height; for(int l = 0; l < th; l++) { color p[][] = new color[w][h]; for(int x = 0; x < w; x++) { for(int y = 0; y < h; y++) { p[x][y] = i.get(x, y); } } for(int x1 = 1; x1 < w - 1; x1++) { for(int y1 = 1; y1 < h - 1; y1++) { if(red(p[x1][y1]) == 255) { boolean b = false; //左上 if(!b) { for(int j = 0; j < k_ul.length; j++) { int tmp = 0; for(int x2 = -1; x2 < 1 + 1; x2++) { for(int y2 = -1; y2 < 1 + 1; y2++) { if(k_ul[j][x2 + 1][y2 + 1] == -1 || k_ul[j][x2 + 1][y2 + 1] * 255 == red(p[x1 + x2][y1 + y2])) { tmp += 1; } } } if(tmp == 9) { b = true; break; } } } //右下 if(!b) { for(int j = 0; j < k_lr.length; j++) { int tmp = 0; for(int x2 = -1; x2 < 1 + 1; x2++) { for(int y2 = -1; y2 < 1 + 1; y2++) { if(k_lr[j][x2 + 1][y2 + 1] == -1 || k_lr[j][x2 + 1][y2 + 1] * 255 == red(p[x1 + x2][y1 + y2])) { tmp += 1; } } } if(tmp == 9) { b = true; break; } } } //右上 if(!b) { for(int j = 0; j < k_ur.length; j++) { int tmp = 0; for(int x2 = -1; x2 < 1 + 1; x2++) { for(int y2 = -1; y2 < 1 + 1; y2++) { if(k_ur[j][x2 + 1][y2 + 1] == -1 || k_ur[j][x2 + 1][y2 + 1] * 255 == red(p[x1 + x2][y1 + y2])) { tmp += 1; } } } if(tmp == 9) { b = true; break; } } } //左下 if(!b) { for(int j = 0; j < k_ll.length; j++) { int tmp = 0; for(int x2 = -1; x2 < 1 + 1; x2++) { for(int y2 = -1; y2 < 1 + 1; y2++) { if(k_ll[j][x2 + 1][y2 + 1] == -1 || k_ll[j][x2 + 1][y2 + 1] * 255 == red(p[x1 + x2][y1 + y2])) { tmp += 1; } } } if(tmp == 9) { b = true; break; } } } if(b) { i.set(x1, y1, color(0)); } } } } } i.save("出力画像.png"); }