1、兩種算法原理和區別
關於邊緣檢測算法,網上有很多種,其中提得最多的就是sobel邊緣檢測算法和canny邊緣檢測算法。那兩者有什么區別呢?網上有這兩種邊界檢測算法方面資料有很多,但是講兩者的區別沒有,而且概念很容易混餚,比如canny邊界檢測算法中也會用到sobel算子,所以感覺有必要寫個文來澄清一下,讓喜歡圖像處理朋友們能夠懂這兩個邊界檢測算法,少走彎路。
sobel邊緣檢測算法兩個步驟:首先用到sobel算子,提取灰度差值信息,也就是圖像梯度值,然后用單閥值進一步提取邊界信息。
canny邊緣檢測算法包含四個步驟:高斯濾波,同樣計算灰度差值信息,即梯度信息和方向,后面檢測邊界信息這一塊,不是用簡單的單閾值方法,而是用了非極大值抑制法排除了不是邊界點的信息,同時進一步用了雙閾值法提取出強邊界和弱邊界,為最后做邊界連接提供有用的邊界點信息。
從上述介紹的sobel邊界檢測算法和canny邊界檢測算法,可以看出來,這兩種算法都是計算梯度信息和方向,最后根據這個梯度信息進行檢測邊界,總體流程上師一致的。不同點就是檢測這一塊,cannny算法給出了非極大值抑制和雙閾值法可以排除不是邊界點的干擾,更好的能夠提取出邊界。
了解了sobel檢測算法和canny邊界檢測算法的不同和共同之后,我還想進一步解釋一些基本概念,就是什么師sobel算子,什么是x方向梯度幅值,什么是y方向梯度值,什么是圖像梯度值,什么是梯度方向,什么是非極大值抑制,什么是雙閾值法。了解了這些基本概念,就清楚了sobel邊界檢測法和canny檢測法。
2、梯度相關的基本概念
其中sobel算子有兩個方向算子,soble水平和垂直算子。題外話,也可以有45度方向的sobel算子。
利用soble水平和垂直算子與輸入圖像卷積計算dx、dy,具體公式如下:
進一步可以得到圖像梯度的幅值:
為了簡化計算,幅值也可以作如下近似:
角度為:
3、非極大值抑制的實現注意點
沿着梯度方向對幅值進行非極大值抑制,而非邊緣方向。所以要實現非極大值抑制算法,需要輸入梯度的幅值信息和梯度的方向信息。下面是梯度方向和邊緣方向的關系圖:
圖 1
由於梯度的方向信息是0度~360度的,所以在這個梯度方向上沒有正好對應的梯度信息,因為像素值本身就是離散的,所以這里需要進行插值,或者近似取得想過值進行比較。
3.1 插值方法:
圖 2
進行非極大值抑制,就首先要確定像素點C的灰度值在其8值鄰域內是否為最大。圖2中藍色的線條方向為C點的梯度方向,這樣就可以確定其局部的最大值肯定分布在這條線上,也即出了C點外,梯度方向的交點dTmp1和dTmp2這兩個點的值也可能會是局部最大值。因此,判斷C點灰度與這兩個點灰度大小即可判斷C點是否為其鄰域內的局部最大灰度點。如果經過判斷,C點灰度值小於這兩個點中的任一個,那就說明C點不是局部極大值,那么則可以排除C點為邊緣。這就是非極大值抑制的工作原理。
但實際上,我們只能得到C點鄰域的8個點的值,而dTmp1和dTmp2並不在其中,要得到這兩個值就需要對該兩個點兩端的已知灰度進行線性插值,也即根據圖2中的g1和g2對dTmp1進行插值,根據g3和g4對dTmp2進行插值,這要用到其梯度方向.
3.2、近似比較法
邊緣可以划分為垂直、水平、45°、135°4個方向,同樣,梯度反向也為四個方向(與邊緣方向正交)。因此為了進行非極大值,將所有可能的方向量化為4個方向,如下圖:
量化化情況可總結為:
水平邊緣--梯度方向為垂直,設置為0:
垂直邊緣--梯度方向為水平,設置為1:
135°邊緣--梯度方向為45°,設置為2:
45°邊緣--梯度方向為135°,設置為3:
在每一點上,領域中心 x 與沿着其對應的梯度方向的兩個像素相比,若中心像素為最大值,則保留,否則中心置0,這樣可以抑制非極大值,保留局部梯度最大的點,以得到細化的邊緣。