Canny邊緣檢測原理及C 程式實現

2021-09-07 03:37:25 字數 2245 閱讀 1071

canny邊緣檢測是被公認的檢測效果最好的邊緣檢測方法,是由john f. canny於2023年提出,演算法目標是找出乙個最優的邊緣檢測的方法,所謂最優即:1.好的檢測:演算法能夠盡可能的標識出影象的邊緣;2.好的定位:標識出的邊緣要盡可能的與實際邊緣相接近;3.最小響應:影象中的邊緣只能標識一次,並且不能把雜訊標識成邊緣。同時我們也要滿足3個準則:訊雜比準則、定位精度準則、單邊緣響應準則。

canny邊緣檢測演算法可分為4步:

高斯濾波器平滑、計算梯度、非極大值抑制、雙閾值邊緣檢測和邊緣連線。

(經典不會隨著時間褪色,演算法也是一樣)

下面將逐步講解並給出程式:

第一步:高斯平滑

為什麼要對影象(灰度影象)進行高斯平滑預處理呢?高斯濾波器對去除服從正態分佈的的雜訊很有效,我做過實驗,隨著高斯模板的增大,被識別的邊緣會逐漸減少,所以通過選著適合大小的高斯模板平滑,可以比較有效的去除一些偽邊緣點。

第二步:計算梯度

首先,由一階導數運算元(一般用sobel模板)計算灰度影象每個畫素點在水平和豎直方向上的導數gx、gy,得出梯度向量(gx,gy),計算梯度的值g和方向theta:

g=sqrt(gx*gx+gy*gy)  theta=arctan(gy/gx)

然後,將每個畫素點的梯度的值和方向分別放入兩個陣列中,程式如下:

[csharp]view plain

copy

"font-size:16px;">byte orients = new byte[width * height];// 梯度方向陣列  

float[,] gradients = new float[width, height];// 梯度值陣列  

double gx, gy;  

for (int i = 1; i 

else  

else  

//只保留成4個方向  

if (orientation 

orientation = 0;  

else if (orientation 

orientation = 45;  

else if (orientation 

orientation = 90;  

else if (orientation 

orientation = 135;  

else orientation = 0;  

}  orients[i*width+j] = (byte)orientation;  

}  } 

第三步:非極大值抑制

如果直接把梯度作為邊緣的話,將得到乙個粗邊緣的影象,這不滿足上面提到的準則,我們希望得到定位準確的單畫素的邊緣,所以將每個畫素點的梯度與其梯度方向上的相鄰畫素比較,如果不是極大值,將其置0,否則置為某一不大於255的數,程式如下:

[csharp]view plain

copy

"font-size:16px;"> float leftpixel = 0, rightpixel = 0;  

for (int y = 1; y 

if ((gradients[x, y] 

else  

}    

}   

第四步:雙閾值邊緣檢測

由上一步得到的邊緣還有很多偽邊緣,我們通過設定高低雙閾值的方法去除它們,具體思想是:梯度值大於高閾值的畫素點認為其一定是邊緣,置為255,梯度值小於低閾值的畫素點認為其一定不是邊緣置為0,介於兩閾值之間的點畫素點為待定邊緣。然後,考察這些待定邊緣點,如果其畫素點周圍8鄰域的梯度值都小於高閾值,認為其不是邊緣點,置為0;至於,如何設定雙閾值大小,我們可以根據實際情況設定,如設成100和20,也可以根據影象梯度值的統計資訊設定,一般小閾值是大閾值的0.4倍即可。程式如下:

[csharp]view plain

copy

"font-size:16px;">fmean = fmean / maxgradient * 255;//某統計資訊  

highthreshold = (byte)(fmean);//高閾值  

lowthreshold = (byte)(0.4 * highthreshold); //低閾值                                

for (int y = 0; y 

else  

}  }  }  }

最後,效果圖如下:

原圖:灰度圖:

邊緣圖:

Canny邊緣檢測原理及C 程式實現

原文 canny邊緣檢測原理及c 程式實現 canny邊緣檢測是被公認的檢測效果最好的邊緣檢測方法,是由john f.canny於1986年提出,演算法目標是找出一 個最優的邊緣檢測的方法,所謂最優即 1.好的檢測 演算法能夠盡可能的標識出影象的邊緣 2.好的定位 標識出的 邊緣要盡可能的與實際邊緣...

Canny邊緣檢測原理及C 程式實現

canny邊緣檢測是被公認的檢測效果最好的邊緣檢測方法,是由john f.canny於1986年提出,演算法目標是找出乙個最優的邊緣檢測的方法,所謂最優即 1.好的檢測 演算法能夠盡可能的標識出影象的邊緣 2.好的定位 標識出的邊緣要盡可能的與實際邊緣相接近 3.最小響應 影象中的邊緣只能標識一次,...

Canny邊緣檢測

1.canny邊緣檢測基本原理 1 圖象邊緣檢測必須滿足兩個條件 一能有效地抑制雜訊 二必須盡量精確確定邊緣的位置。2 根據對訊雜比與定位乘積進行測度,得到最優化逼近運算元。這就是canny邊緣檢測運算元。3 類似與marr log 邊緣檢測方法,也屬於先平滑後求導數的方法。2.canny邊緣檢測演...