【圖像處理算法】Canny邊緣檢測

Canny邊緣檢測

本文主要參考:

岡薩雷斯 《數字圖像處理》第二版

邊緣檢測是數字圖像處理中應用十分廣泛的一類算法,它能夠將圖像信息簡化爲線條特徵供後續的圖像算法使用,在電子元件自動檢測、虹膜識別等方向都發揮了較大作用。Canny邊緣檢測算子是John F. Canny於1986年開發出來的一個多級邊緣檢測算法。目前,Canny算子是傳統邊緣檢測算法中使用最廣泛、效果最好的一種算法。本文將分享本人在學習Canny算子過程中的筆記和思路。Canny邊緣檢測算法基本步驟如下:
Canny步驟

1. 高斯平滑

要想對圖像進行邊緣檢測,首先要知道邊緣在圖像中的表現形式。下圖引用自《數字圖像處理》,顯示的是放大後的邊緣區域。(a)圖顯示的是理想的邊緣數字模型,在理想情況下,邊緣兩端圖像灰度級會產生跳變,能夠清晰地看到邊界的存在,從灰度剖面圖可以看到,邊緣兩邊的灰度級相差較大,並存在躍變。但是,在現實情況下,由於光學系統、取樣和其他圖像採集的不完善性得到的圖像邊緣是模糊的,模糊程度與圖像獲取過程以及圖像質量有關。在這種模糊圖像中,邊緣處的灰度級將不會存在大的跳變,而是一種斜坡式的變化,斜坡部分與邊緣的模糊程度成正比,如圖(b)所示。
圖像邊緣數字模型
考慮到灰度級在邊緣處存在較大的變化,檢測邊緣的基本思路就是在邊緣處對灰度級進行求導,得到灰度的變化情況。如下圖展示的是灰度在邊緣處的一階導數和二階導數情況。可以看到,在邊緣兩側由於灰度級變化不大,因此灰度的一階導數趨近於零,而在斜坡部分的導數大於零,因此我們可以通過一階導數確定邊緣的存在情況。而由於灰度剖面圖存在斜坡部分,無法準確定位邊緣位置,我們通過求灰度的二階導數可以看到,在斜坡的開始和結束位置二階導數存在跳變,我們可以通過連接二階導數的極大和極小值點,取該直線與零軸相交的點座標作爲邊緣處座標。
邊緣處灰度導數
上述討論確定了使用灰度的導數信息進行邊緣檢測。然而,在實際的圖像數據中,往往存在噪聲干擾,而求導操作又是一種對噪聲十分敏感的操作。如下圖展示了在邊緣處加入不同程度的噪聲後,在對圖像灰度進行求導操作得到的一階和二階導數曲線圖。可以看到,加入噪聲後,由於求導操作對噪聲的敏感性,導致導數信息無法使用的問題。因此,在進行邊緣檢測前,需要對圖像進行高斯平滑,減少噪聲對求導操作的影響。
在這裏插入圖片描述
高斯平滑是數字圖像處理中比較基礎的算法,這裏暫時不作介紹。

2. 計算梯度信息

數字圖像的一階導數是灰度值分別在x,y方向上的梯度近似值。圖像像素f(x,y)在位置(x,y)處的梯度定義向量:
在這裏插入圖片描述
梯度向量指向在座標(x,y)處 f 的最大變化率方向。
其大小爲:
在這裏插入圖片描述
方向爲:
在這裏插入圖片描述
在計算圖像梯度時,我們使用常用的Sobel梯度算子,其通過增加中心點的重要性實現了某種程度的平滑效果。Sobel算子模版如下圖所示(引用自《數字圖像處理》):
在這裏插入圖片描述
上圖(f)爲求圖像x方向的導數,圖(g)求導y方向。分別使用上述的Sobel兩個方向算子對圖像進行處理,可以得到如下圖效果。圖(a)爲原圖,圖(b)和圖©分別是使用x、y方向對圖進行卷積處理,得到的結果。可以看到,圖(b)主要保留了圖像中橫向的邊緣,而圖©則更多地保留了豎直方向的邊緣。圖(d)展示的是同時使用兩個算子對原圖進行處理,可以看到保留了圖像中大量的邊緣信息。從圖(d)可以看出,如果直接使用梯度算子對圖像進行處理,得到的結果將保留許多我們不需要的邊緣點。由於我們對圖像進行邊緣檢測時,更希望提取圖像中比較突出的邊緣,因此,我們對圖像進行模糊處理去除噪聲影響的同時,能夠去除不明顯邊界點的影響。
在這裏插入圖片描述

3. 非極大值抑制

由於邊緣附近的梯度值都會較大,因此僅用梯度算子對圖像進行處理後,邊緣會有一定的寬度。如下圖,白色像素爲邊緣,但是由於在邊緣處都有較大的梯度值,所以利用梯度算子計算後,這些像素都被保留了下來。在實際應用中,我們更希望得到更精準的邊緣位置(即讓計算得到的邊緣更細)。這裏就需要用到非極大值抑制的方法。
在這裏插入圖片描述
由上圖可以觀察到,其實邊緣的寬度方向是和邊緣的梯度方向一致的(與邊緣前進方向垂直)。因此,可以利用在梯度方向上尋找極大值處像素進行保留作爲邊緣的精確位置。
在上述計算梯度信息的過程中,我們獲得了圖像梯度大小和方向信息,而在梯度的方向上我們能得到梯度的局部極大值。如下圖點c,藍色線方向爲該點梯度方向,如果點c處的梯度值比dTmp1和dTmp2點處梯度值小的話,那麼它就會被排除,不作爲邊緣點。此處計算dTmp1和dTmp2點處梯度值需要利用g1,g2,g3,g4點進行線性插值得到。

在這裏插入圖片描述
對梯度圖像進行非極大值抑制以後,我們將得到更細的邊緣圖(理論上我們會得到只有一個像素寬度的邊緣)。這樣就可以進行下一個步驟–雙閾值算法。

4. 雙閾值算法

對梯度圖像進行非極大值抑制以後,我們保留了圖像局部梯度極大值處的像素,接下來我們能想到應該用一個閾值去篩選真實的邊緣點,即保留較大的梯度值處的像素。但是這種做法會導致某些邊緣存在斷裂的情況。如下圖,一條邊緣可能存在梯度大小不同的線段(在圖中用較粗的部分表示梯度較大的邊緣),如果閾值選擇不準確會導致邊緣斷裂。
在這裏插入圖片描述
雙閾值算法的思想就是:通過高閾值開始搜索邊緣,利用低閾值延長邊緣點。具體的做法是,設置一個高閾值h和一個低閾值l,然後分情況討論:

  1. 如果像素梯度大於h,保留。
  2. 如果像素梯度小於l,刪除。
  3. 如果像素梯度介於l和h之間,則判斷該處像素8領域內像素梯度是否存在高於閾值h的點,如果存在,保留。

至此,Canny邊緣檢測算法就算完成了。值得一提的是,雖然當前計算機視覺和圖像處理領域深度學習的方法(特別是卷積神經網絡)得到了很好的發展,也得到了較爲顯著的成果。但是上個世紀八十年代出現的Canny邊緣檢測算法在今天仍然被廣泛使用,且發揮着重要作用。而且,各種經典的數字圖像處理傳統算法,其中都存在了大量基礎的、值得斟酌的技巧和方法。因此希望我們在學習深度學習這種熱門方法的同時,不要忽視了對計算機視覺和數字圖像處理傳統方法的學習和應用。

本文僅作爲學習筆記交流分享用。由於本人水平有限,文章可能出現紕漏,歡迎大家進行交流指正。謝謝閱讀!

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