「毎日Unity」の技術ブログ

開発で役立つ情報を発信する

【Processing】細線化フィルタ

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");
}