1. 程式人生 > >kirsch邊緣檢測運算元

kirsch邊緣檢測運算元

之前在專案中檢測劃痕的時候用到了Kirsch邊緣檢測運算元,但是是用halcon,現在用opencv實現了一遍,不難,就是計算過程要花時間。
Kirsch運算元是R.Kirsch提出來一種邊緣檢測演算法,它採用8個3*3的模板對影象進行卷積,這8個模板代表8個方向,並取最大值作為影象的邊緣輸出,8個模板如下,它在保持細節和抗噪聲方面都有較好的效果:
這裡寫圖片描述

實現程式碼如下:
static int a0[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}};
static int a1[3][3]={{-3,+5,+5},{-3,0,+5},{-3,-3,-3}};
static int a2[3][3]={{-3,-3,+5},{-3,0,+5},{-3,-3,+5}};
static int a3[3][3]={{-3,-3,-3},{-3,0,+5},{-3,+5,+5}};
static int a4[3][3]={{-3,-3,-3},{-3,0,-3},{+5,+5,+5}};
static int a5[3][3]={{-3,-3,-3},{+5,0,-3},{+5,+5,-3}};
static int a6[3][3]={{+5,-3,-3},{+5,0,-3},{+5,-3,-3}};
static int a7[3][3]={{+5,+5,-3},{+5,0,-3},{-3,-3,-3}};

for (i=1;i<r-2;i++)
{
    for (j=1;j<c-2;j++)
    {
        for (int x = 0; x < 8; x++)
        {
            sumKirsch[x] = 0;
        }
        for (k=0;k<=2;k++)
        {
            for (l=0;l<=2;l++)
            {
                sumKirsch[0] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a0[k][l];
                sumKirsch[1] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a1[k][l];
                sumKirsch[2] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a2[k][l];
                sumKirsch[3] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a3[k][l];
                sumKirsch[4] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a4[k][l];
                sumKirsch[5] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a5[k][l];
                sumKirsch[6] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a6[k][l];
                sumKirsch[7] += (int)img1.at<uchar>(i - 1 + k, j - 1 + l)*a7[k][l];
            }
        }
        max = sumKirsch[0];
        for (m=1;m<8;m++)
        {
            if (max<sumKirsch[m])
                max=sumKirsch[m];
        }
        if (max<0)
            max=0;
        if(max>255)
            max=255;
        img2.at<uchar>(i,j)=max;
    }
}

結果如下,邊緣提取效果還可以。
這裡寫圖片描述