Matlab 邊緣檢測實現與比較

邊緣檢測包括三個基本內容:

  • 抽取出反映灰度變化的邊緣點
  • 剔除某些邊界點或填補邊界間斷點
  • 將這些邊緣連接成完整的線

邊緣檢測算子

基於一階導數

梯度:
G(x,y)=[GxGy]=[fxfy]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)=Gx2+Gy22|G(x,y)|=\sqrt {G_x^2+G_y^2},2範數梯度

G(x,y)=Gx+Gy1|G(x,y)|=|G_x|+|G_y|,1範數梯度

G(x,y)max(Gx,Gy)|G(x,y)|\approx max(|G_x|,|G_y|),\infty範數梯度

(1)Roberts交叉算子:利用局部差分算子尋找邊緣,兩個卷積核分別爲

Gx=[1001]Gy=[0110]G_x=\begin{bmatrix}1&0\\0&-1\end{bmatrix},G_y=\begin{bmatrix}0&1\\-1&0\end{bmatrix}

採用1範數衡量梯度的幅度,對具有陡峭的低噪聲圖像處理效果較好。

(2)Prewitt算子:卷積核:

Gx=[101101101]Gy=[111000111]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}

採用第三個範數衡量梯度的幅度,對灰度漸變和噪聲較多的圖像效果較好。

(3)Sobel算子:卷積核:

Gx=[101202101]Gy=[121000121]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}

採用第三個範數衡量梯度的幅度,對灰度漸變和噪聲較多的圖像效果較好。

(4)Canny算子:使用高斯濾波器的導數計算的,以尋找圖像梯度的局部極大值。使用兩個閾值分別來檢測強邊緣與弱邊緣,當且僅當強弱邊緣相連時,弱邊緣才包含在輸出中。因此該方法不易受噪聲干擾,但其檢測邊界連續性不如LOG算子。

Canny算法步驟如下:
① 用高斯濾波器平滑圖像;
② 計算濾波後圖像梯度的幅值和方向;
③ 對梯度幅值應用非極大值抑制,其過程爲找出圖像梯度中的局部極大值點,把其他非局部極大值點置零以得到細化的邊緣;
④ 用雙閾值算法檢測和連續邊緣,使用兩個閾值T1和T2(T1>T2),T1用來找到每條線段,T2用來在這些線段的兩個方向上延伸尋找邊緣的斷裂處,並連接這些邊緣。

(5)零交叉方法:先用指定濾波器對圖像濾波,然後尋找零交叉點作爲邊緣。

基於二階導數

圖像灰度二階導數的過零點對應邊緣點
在這裏插入圖片描述
(1)Laplacian算子

2f=2fx2+2fy2\nabla^2f=\frac{\partial^2f}{\partial x^2}+\frac{ \partial^2f}{\partial y^2}

2fx2=[f(i,j+1)2f(i,j)]+f(i,j1)\frac{\partial^2f}{\partial x^2}=[f(i,j+1)-2f(i,j)]+f(i,j-1)

2fy2=[f(i+1,j)2f(i,j)]+f(i1,j)\frac{ \partial^2f}{\partial y^2}=[f(i+1,j)-2f(i,j)]+f(i-1,j)

表示爲卷積模板:

2=[010141010]\nabla^2=\begin{bmatrix}0&1&0\\1&-4&1\\0&1&0\end{bmatrix}

由於是二階導數,因此它對於噪聲有極高的敏感性,而且對雙邊緣帶不易檢測出邊緣的方向。

(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)=[2g(x,y)]f(x,y)h(x,y)=[\nabla^2g(x,y)]*f(x,y)

其中,f爲圖像,g爲高斯函數,

g(x,y)=12πσ2exp[x2+y22σ2]g(x,y)=\frac{1}{2\pi\sigma^2}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]

2g(x,y)=(x2+y22σ2σ4)ex2+y22σ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}}

2G(x,y)x2=12πσ4exp[x2+y22σ2](x2σ21)\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)

2G(x,y)y2=12πσ4exp[x2+y22σ2](y2σ21)\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)

故:

2G(x,y)=12πσ4(x2+y2σ22)exp[x2+y22σ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]

用差分高斯函數(DOG)簡化代替LOG算子:

DOG(σ1,σ2)=12πσ1exp[x2+y22σ12]12πσ2exp[x2+y22σ22]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]

差分高斯算子較好地符合人的視覺特性。根據二階導數性質,檢測邊界就是尋找▽^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年

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