邊緣檢測包括三個基本內容:
抽取出反映灰度變化的邊緣點
剔除某些邊界點或填補邊界間斷點
將這些邊緣連接成完整的線
邊緣檢測算子
基於一階導數
梯度:
G ( x , y ) = [ G x G y ] = [ ∂ f ∂ x ∂ f ∂ y ] G(x,y)=
\begin{bmatrix}
G_x\\
G_y
\end{bmatrix}=
\begin{bmatrix}
\dfrac{\partial f}{\partial x}\\
\\
\dfrac{\partial f}{\partial y}
\end{bmatrix}
G ( x , y ) = [ G x G y ] = ⎣ ⎢ ⎢ ⎢ ⎡ ∂ x ∂ f ∂ y ∂ f ⎦ ⎥ ⎥ ⎥ ⎤
可以用三種範數衡量梯度的幅值:
∣ G ( x , y ) ∣ = G x 2 + G y 2 , 2 範 數 梯 度 |G(x,y)|=\sqrt {G_x^2+G_y^2},2範數梯度 ∣ G ( x , y ) ∣ = G x 2 + G y 2 , 2 範 數 梯 度
∣ G ( x , y ) ∣ = ∣ G x ∣ + ∣ G y ∣ , 1 範 數 梯 度 |G(x,y)|=|G_x|+|G_y|,1範數梯度 ∣ G ( x , y ) ∣ = ∣ G x ∣ + ∣ G y ∣ , 1 範 數 梯 度
∣ G ( x , y ) ∣ ≈ m a x ( ∣ G x ∣ , ∣ G y ∣ ) , ∞ 範 數 梯 度 |G(x,y)|\approx max(|G_x|,|G_y|),\infty範數梯度 ∣ G ( x , y ) ∣ ≈ m a x ( ∣ G x ∣ , ∣ G y ∣ ) , ∞ 範 數 梯 度
(1)Roberts交叉算子:利用局部差分算子尋找邊緣,兩個卷積核分別爲
G x = [ 1 0 0 − 1 ] , G y = [ 0 1 − 1 0 ] G_x=\begin{bmatrix}1&0\\0&-1\end{bmatrix},G_y=\begin{bmatrix}0&1\\-1&0\end{bmatrix} G x = [ 1 0 0 − 1 ] , G y = [ 0 − 1 1 0 ]
採用1範數衡量梯度的幅度,對具有陡峭的低噪聲圖像處理效果較好。
(2)Prewitt算子:卷積核:
G x = [ − 1 0 1 − 1 0 1 − 1 0 1 ] , G y = [ 1 1 1 0 0 0 − 1 − 1 − 1 ] G_x=\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix},G_y=\begin{bmatrix}1&1&1\\0&0&0\\-1&-1&-1\end{bmatrix} G x = ⎣ ⎡ − 1 − 1 − 1 0 0 0 1 1 1 ⎦ ⎤ , G y = ⎣ ⎡ 1 0 − 1 1 0 − 1 1 0 − 1 ⎦ ⎤
採用第三個範數衡量梯度的幅度,對灰度漸變和噪聲較多的圖像效果較好。
(3)Sobel算子:卷積核:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] , G y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] G_x=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix},G_y=\begin{bmatrix}1&2&1\\0&0&0\\-1&-2&-1\end{bmatrix} G x = ⎣ ⎡ − 1 − 2 − 1 0 0 0 1 2 1 ⎦ ⎤ , G y = ⎣ ⎡ 1 0 − 1 2 0 − 2 1 0 − 1 ⎦ ⎤
採用第三個範數衡量梯度的幅度,對灰度漸變和噪聲較多的圖像效果較好。
(4)Canny算子:使用高斯濾波器的導數計算的,以尋找圖像梯度的局部極大值。使用兩個閾值分別來檢測強邊緣與弱邊緣,當且僅當強弱邊緣相連時,弱邊緣才包含在輸出中。因此該方法不易受噪聲干擾,但其檢測邊界連續性不如LOG算子。
Canny算法步驟如下:
① 用高斯濾波器平滑圖像;
② 計算濾波後圖像梯度的幅值和方向;
③ 對梯度幅值應用非極大值抑制,其過程爲找出圖像梯度中的局部極大值點,把其他非局部極大值點置零以得到細化的邊緣;
④ 用雙閾值算法檢測和連續邊緣,使用兩個閾值T1和T2(T1>T2),T1用來找到每條線段,T2用來在這些線段的兩個方向上延伸尋找邊緣的斷裂處,並連接這些邊緣。
(5)零交叉方法:先用指定濾波器對圖像濾波,然後尋找零交叉點作爲邊緣。
基於二階導數
圖像灰度二階導數的過零點對應邊緣點
(1)Laplacian算子
∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^2f=\frac{\partial^2f}{\partial x^2}+\frac{
\partial^2f}{\partial y^2} ∇ 2 f = ∂ x 2 ∂ 2 f + ∂ y 2 ∂ 2 f
∂ 2 f ∂ x 2 = [ f ( i , j + 1 ) − 2 f ( i , j ) ] + f ( i , j − 1 ) \frac{\partial^2f}{\partial x^2}=[f(i,j+1)-2f(i,j)]+f(i,j-1) ∂ x 2 ∂ 2 f = [ f ( i , j + 1 ) − 2 f ( i , j ) ] + f ( i , j − 1 )
∂ 2 f ∂ y 2 = [ f ( i + 1 , j ) − 2 f ( i , j ) ] + f ( i − 1 , j ) \frac{
\partial^2f}{\partial y^2}=[f(i+1,j)-2f(i,j)]+f(i-1,j) ∂ y 2 ∂ 2 f = [ f ( i + 1 , j ) − 2 f ( i , j ) ] + f ( i − 1 , j )
表示爲卷積模板:
∇ 2 = [ 0 1 0 1 − 4 1 0 1 0 ] \nabla^2=\begin{bmatrix}0&1&0\\1&-4&1\\0&1&0\end{bmatrix} ∇ 2 = ⎣ ⎡ 0 1 0 1 − 4 1 0 1 0 ⎦ ⎤
由於是二階導數,因此它對於噪聲有極高的敏感性,而且對雙邊緣帶不易檢測出邊緣的方向。
(2)LOG算子:先用高斯函數濾波,然後進行拉普拉斯運算,算得的值等於0的點認爲是邊界點。
LOG運算:
h ( x , y ) = ∇ 2 [ g ( x , y ) ] ∗ f ( x , y ) h(x,y)=\nabla^2[g(x,y)]*f(x,y) h ( x , y ) = ∇ 2 [ g ( x , y ) ] ∗ f ( x , y )
根據卷積求導法則:
h ( x , y ) = [ ∇ 2 g ( x , y ) ] ∗ f ( x , y ) h(x,y)=[\nabla^2g(x,y)]*f(x,y) h ( x , y ) = [ ∇ 2 g ( x , y ) ] ∗ f ( x , y )
其中,f 爲圖像,g 爲高斯函數,
g ( x , y ) = 1 2 π σ 2 e x p [ − x 2 + y 2 2 σ 2 ] g(x,y)=\frac{1}{2\pi\sigma^2}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right] g ( x , y ) = 2 π σ 2 1 e x p [ − 2 σ 2 x 2 + y 2 ]
∇ 2 g ( x , y ) = ( x 2 + y 2 − 2 σ 2 σ 4 ) e − x 2 + y 2 2 σ 2 \nabla^2g(x,y)=\left(\frac{x^2+y^2-2\sigma^2}{\sigma^4}\right)e^{-\dfrac{x^2+y^2}{2\sigma^2}} ∇ 2 g ( x , y ) = ( σ 4 x 2 + y 2 − 2 σ 2 ) e − 2 σ 2 x 2 + y 2
∂ 2 G ( x , y ) ∂ x 2 = 1 2 π σ 4 e x p [ − x 2 + y 2 2 σ 2 ] ( x 2 σ 2 − 1 ) \frac{\partial^2 G(x,y)}{\partial x^2}=\frac{1}{2\pi\sigma^4}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]\left(\frac{x^2}{\sigma^2}-1\right) ∂ x 2 ∂ 2 G ( x , y ) = 2 π σ 4 1 e x p [ − 2 σ 2 x 2 + y 2 ] ( σ 2 x 2 − 1 )
∂ 2 G ( x , y ) ∂ y 2 = 1 2 π σ 4 e x p [ − x 2 + y 2 2 σ 2 ] ( y 2 σ 2 − 1 ) \frac{\partial^2 G(x,y)}{\partial y^2}=\frac{1}{2\pi\sigma^4}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]\left(\frac{y^2}{\sigma^2}-1\right) ∂ y 2 ∂ 2 G ( x , y ) = 2 π σ 4 1 e x p [ − 2 σ 2 x 2 + y 2 ] ( σ 2 y 2 − 1 )
故:
∇ 2 G ( x , y ) = 1 2 π σ 4 ( x 2 + y 2 σ 2 − 2 ) e x p [ − x 2 + y 2 2 σ 2 ] \nabla^2G(x,y)=\frac{1}{2\pi\sigma^4}\left(\frac{x^2+y^2}{\sigma^2}-2\right)exp\left[-\frac{x^2+y^2}{2\sigma^2}\right] ∇ 2 G ( x , y ) = 2 π σ 4 1 ( σ 2 x 2 + y 2 − 2 ) e x p [ − 2 σ 2 x 2 + y 2 ]
用差分高斯函數(DOG)簡化代替LOG算子:
D O G ( σ 1 , σ 2 ) = 1 2 π σ 1 e x p [ − x 2 + y 2 2 σ 1 2 ] − 1 2 π σ 2 e x p [ − x 2 + y 2 2 σ 2 2 ] DOG(\sigma_1,\sigma_2)=\frac{1}{\sqrt{2\pi}\sigma_1}exp\left[-\frac{x^2+y^2}{2\sigma_1^2}\right]-\frac{1}{\sqrt{2\pi}\sigma_2}exp\left[-\frac{x^2+y^2}{2\sigma_2^2}\right] D O G ( σ 1 , σ 2 ) = 2 π σ 1 1 e x p [ − 2 σ 1 2 x 2 + y 2 ] − 2 π σ 2 1 e x p [ − 2 σ 2 2 x 2 + y 2 ]
差分高斯算子較好地符合人的視覺特性。根據二階導數性質,檢測邊界就是尋找▽^2*f的過零點。有兩種等效計算方法:
①圖像與高斯函數卷積,再求卷積的Laplace微分;
②求高斯函數的Laplace微分,再與圖像卷積。
LOG算子能有效檢測邊界,但存在兩個問題:
①會產生虛假邊界;
②定位精度不高。
實際中,應考慮:σ的選擇,模板尺寸N的確定,邊界強度和方向,提取邊界的精度。
Matlab實現
BW= edge( I, 'method' , thresh, direction)
採用method的方法進行邊緣檢測,指定閾值thresh,可指定算子的方向direction=‘horizontal’、‘vertical’、‘both’。各詳細參數含義參見Matlab官方頁面。
算子比較
(1)Roberts算子
邊緣定位精度較高,但容易丟失一部分邊緣,同時圖像未經平滑處理,不能抑制噪聲。對具有陡峭邊緣且噪聲低的圖像處理效果較好。
(2)Prewitt和Sobel算子
都是對圖像先做加權平滑處理,然後再微分,所撥通的是平滑部分的權值有差異,因此對噪聲具有抑制作用,但不能完全排除檢測結果中出現的徐家邊緣。邊緣定位效果不錯,但是檢測的邊緣易出現多像素寬度。
(3)Laplacian算子
是不依賴於邊緣方向的二階微分算子,對圖像中的階躍型邊緣點定位準確,對噪聲非常敏感,使噪聲成分得到加強。因此使得該算子易丟失一部分邊緣的方向信息,造成一些不連續的檢測邊緣,抗噪能力差。
(4)LOG算子
克服了Laplacian算子抗噪能力差的缺點,但在抑制噪聲的同時也將原有的尖銳邊緣平滑化了,造成尖銳邊緣無法被檢測出。
(5)Canny算子
雖然是基於最優化思想而推導出來的,但是實際效果並不一定最優。同樣採用高斯函數對圖像平滑化,因此具有較強的抑制噪聲能力,但也會將高頻邊緣平滑掉,造成邊緣丟失。Canny算子採用雙閾值算法檢測和連接邊緣,採用的多尺度檢測和方向性搜索比LOG算子好。
Reference
張德豐 數字圖像處理(MATLAB版)第二版 2015年