kirsch邊緣檢測運算元
阿新 • • 發佈:2019-01-04
之前在專案中檢測劃痕的時候用到了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; } }
結果如下,邊緣提取效果還可以。