圖像處理之邊緣檢測

Canny邊緣檢測算法一直是邊緣檢測的經典算法,出自論文:《A Computational Approach to Edge Detection》

Canny邊緣檢測算法的處理流程:

  1. 使用高斯濾波器,以平滑圖像,濾除噪聲。
  2. 計算圖像中每個像素點的梯度強度和方向。
  3. 應用非極大值抑制,以消除邊緣檢測帶來的雜散響應。
  4. 應用雙閾值檢測來確定真實的和潛在的邊緣。
  5. 通過抑制孤立的弱邊緣最終完成邊緣檢測。

1.高斯濾波去燥

任何邊緣檢測算法都不可能在未經處理的原始數據上很好地處理,所以第一步是對原始數據與高斯核作卷積,得到輕微模糊的去燥圖像。

2. Sobel算子計算像素梯度

Sobel算子是兩個3*3的矩陣,分別爲Sx和Sy。前者用於計算圖像x方向像素梯度矩陣Gx,後者用於計算圖像y方向像素梯度矩陣Gy。假設x和y方向的Sobel算子分別爲:

Gx和Gy的值爲(其中*爲卷積符號,sum表示矩陣中所有元素相加求和):

根據公式可以確定像素點的梯度G和方向theta:

(其中G爲梯度強度, theta表示梯度方向,arctan爲反正切函數)

3. 非極大值抑制

非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制爲0。

1) 將當前像素的梯度強度與沿正負梯度方向上的兩個像素進行比較。

2) 如果當前像素的梯度強度與另外兩個像素相比最大,則該像素點保留爲邊緣點,否則該像素點將被抑制。

在跨越梯度方向的兩個相鄰像素之間使用最近鄰插值來得到要比較的像素梯度,現舉例如下:

 將梯度分爲8個方向,分別爲E、NE、N、NW、W、SW、S、SE,其中0代表0度~45度,1代表45度~90度,2代表-90度~-45度,3代表-45度~0度。像素點P的梯度方向爲θ,則像素點P1和P2的梯度線性插值爲:

因此非極大值抑制的過程就是用Gp 與Gp1 和Gp2 進行比較,如果Gp 最大則保留,否值刪除。

4. 雙閾值法篩選邊緣點

非極大值抑制之後,剩餘的像素可能並不能準確表示圖像實際邊緣,由於噪聲和顏色變化引起的一些邊緣像素會干擾邊緣檢測的有效檢測。爲了解決這些雜散響應,可以通過選擇高低閾值來解決。如果邊緣像素的梯度值高於高閾值,則將其標記爲強邊緣像素;如果邊緣像素的梯度值小於高閾值但大於低閾值,則將其標記爲弱邊緣像素;如果邊緣像素的梯度值小於低閾值,則會被抑制。閾值的選擇取決於給定輸入圖像的內容。

5.抑制孤立低閾值點

針對若邊緣點,通過查看弱邊緣像素及其8個鄰域像素來判斷是否保留該像素。只要其中一個爲強邊緣像素,則該弱邊緣點就可以保留爲真實的邊緣。

舉個例子:

Code:

img = cv2.GaussianBlur(img, (3, 3))

canny = cv2.Canny(img, 50, 200)

高斯濾波後進行canny邊緣檢測,其中低閾值爲50高閾值爲200。下方左圖爲原始圖像右圖爲canny邊緣檢測後的圖像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章