「毎日Unity」の技術ブログ

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

【Processing】ソーベルフィルタ

Processingでソーベルフィルタを作ったので残しておくことにしました。

[ 使用例 ]

使用前
使用後

[ プログラム ]

プログラムを実行するとpdeファイルと同じディレクトリ内にフィルタリングされた画像が保存されます。

//縦カーネル
float[][] k_v = new float[][]
{
    {1, 2, 1},
    {0, 0, 0},
    {-1, -2, -1},
};
//横カーネル
float[][] k_h = new float[][]
{
    {-1, 0, 1},
    {-2, 0, 2},
    {-1, 0, 1},
};
//閾値
int th = 4000;

void setup()
{
    PImage i = loadImage("入力画像.png");

    int w = i.width;
    int h = i.height;

    float g[][] = new float[w][h];
    for(int x = 0; x < w; x++)
    {
        for(int y = 0; y < h; y++)
        {
            color c = i.get(x, y);

            g[x][y] = 0.3 * red(c) + 0.59 * green(c) + 0.11 * blue(c);
        }
    }

    for(int x1 = 1; x1 < w - 1; x1++) 
    {
        for(int y1 = 1; y1 < h - 1; y1++) 
        {  
            float sv = 0;
            float sh = 0;

            for(int x2 = -1; x2 < 1 + 1; x2++)
            {
                for(int y2 = -1; y2 < 1 + 1; y2++)
                {
                    sv += (k_v[x2 + 1][y2 + 1] * g[x1 + x2][y1 + y2]);

                    sh += (k_h[x2 + 1][y2 + 1] * g[x1 + x2][y1 + y2]);
                }
            }

            float s = sqrt(pow(sv, 2) * pow(sh, 2));

            if(s > th)
            {
                s = 255;
            }
            else
            {
                s = 0;
            }

            i.set(x1, y1, color(s));
        }
    }

    i.save("出力画像.png");
}