胡 松,黃志遠,鄧 磊,李壯豪,范潔瀅,曾 維
(成都理工大學,四川 成都 610000)
對圖像通過技術手段進行一系列的處理,從而得到想要的圖像或達到預期的目的稱為圖像處理?,F如今,圖像處理已經應用到了各個領域,比如生活當中的PS技術、科研中的遙感攝像技術、軍事中的間諜衛星技術、工業中的CAD技術、安防中的監控技術等等。可以發現,圖像處理已經存在于生活的方方面面,也使得人們的生活質量得到了極大的提高。
在圖像處理中,圖像分割是圖像處理技術中的一顆皇冠,而邊緣檢測則是圖像分割中的一顆明珠,邊緣檢測技術是通過搜索圖像區域中的各個邊界,從而達到圖像分割的目的。圖像邊緣提取是圖像分割的基礎,也是圖像識別中的一個重要屬性。
邊緣上的信息在進行圖像處理時是重要的圖像特征信息,因此在圖像分析研究中,邊緣檢測方法研究是一個特別引人注目的課題。在圖像處理中,當對圖像進行分割時,應用如Sobel算子、梯度算子、Prewitt算子等的時候,因為邊緣上的信息和圖像中存在的噪聲都屬于高頻信號[1],有時會將噪聲和邊緣上的信息一起過濾掉,這樣會遺失重要的邊緣信息,并不能達到進行圖像處理的目的——得到想要的信息。
所以Canny于1986年提出了一個特別經典并且有效的算子——Canny最佳邊緣檢測算子。這個算法的本質是一個多級邊緣檢測算子,通過設置雙閾值檢測方法來達到既不會因為閾值過高檢測出圖像重要邊緣的同時存在過多的異常值,也不會因為閾值過低檢測出圖像所有邊緣的同時存在過多的孤立點即不重要的邊緣這兩個目的。
可是原始的Canny算子在進行第一步——高斯濾波的時候,因為高斯濾波在去除噪聲平滑邊緣的時候,不可避免地會使圖像的邊緣信息損失掉一些,使邊緣減弱[2],那么在最后得到的邊緣圖像中,會損失掉一些重要的邊緣。當然,也可以由此推論出,若將高斯濾波的半徑不斷增大,在最后得到的邊緣圖中,看見的邊緣也將會越來越少,所以基于這個原因,提出了Canny算法第一步的改進思路——選擇性平滑濾波。也注意到,Canny算子在選擇閾值時是靠經驗選擇的,這樣選擇閾值比較困難也不具有適應性,所以提出了采用迭代算法來改進閾值選擇問題。
Canny算法是John F. Canny在1986年提出的一個基于Sobel算子的最佳邊緣檢測算子[3],該算子被他收錄在他所寫的邊緣檢測計算理論中。Canny算子中最精華的一點是使用一個高閾值和一個低閾值來確定圖像中哪些點是屬于邊緣的。
一般的二值圖像有兩個缺點[4],第一缺點是:選取的閾值過低會包含許多偽邊緣,不能準確地檢測出重要邊緣,而如果選取的閾值過高,又會漏掉一些邊緣,造成邊緣破裂。第二個缺點是檢測出來的邊緣過粗而導致不能準確地得到某些細節邊緣,無法完成圖像的精確定位。
Canny為了解決上述問題,提出了Canny邊緣檢測算法。
Canny算法的一般步驟為:首先對圖像進行高斯濾波[5],即去掉圖像中的噪聲,然后利用差分一階偏導計算出圖像梯度的幅值與方向,接著對圖像進行非極大值抑制,最后利用雙閾值法對閾值進行滯后并連接邊緣,形成一個完整的邊緣輪廓[6]。
流程框圖如圖1所示。

圖1 Canny算法流程
1.2.1 高斯濾波(去噪聲)
高斯濾波是一種線性平滑濾波,它使用高斯函數進行濾波,是一種低通濾波,雖然效率比不上其他的濾波方法,但是由于它對噪聲優越的處理能力使得人們將它視作是一種優秀的濾波方法。
高斯濾波的核心原理依然是鄰域平均法[7]。首先設定一個模板,然后對這個模板內的像素灰度求加權平均值,再將這個加權平均值賦值給中心像素點的灰度,按照這個步驟,高斯濾波掃描整個圖像的像素點,然后分別進行加權平均,由于高斯濾波經過傅里葉變換得到另一種不一樣的高斯函數,所以高斯濾波是一種低通濾波。由于高斯濾波不斷減弱了圖像邊緣的頻率變化,所以對消除正態分布形狀的噪聲效果很好。
1.2.2 梯度計算
計算梯度幅值和方向的步驟如下所示:
(1)使用X方向和Y方向的卷積陣列。
(1)
(2)
(2)計算梯度幅值與方向。
(3)
(4)
1.2.3 非極大值抑制
使用3×3窗口在8個方向的鄰域對M(i,j)的所有元素沿梯度方向進行梯度幅值的插值。對每個點,將鄰域中心元素M(i,j)與沿梯度方向的2個梯度插值進行比較,如果M(i,j)的值小于梯度上的兩個插值結果,則將M(i,j)上的邊緣標志位賦值為0。
至于為什么要在沿梯度方向進行插值,是因為在Canny提出的方法中,非極大值抑制[8]是在0,45,90,135四個梯度方向上進行[9],每個像素點的梯度方向按照相近程度用這四個梯度方向來代替,所以,非極大值抑制比較的相鄰兩個像素就是:0:左邊和右邊;45:右上和左下;90:上邊和下邊;135:左上和右下。
1.2.4 雙閾值檢測
雙閾值檢測[10]又稱為雙門限方法檢測。用一個低閾值和一個高閾值對經過非極大值抑制的圖像進行幅值處理,將梯度低于閾值的像素點灰度值置為0[11],由此將圖像的邊緣提取出來。設低閾值提取出來的邊緣圖像為T1,高閾值提取出來的邊緣圖像為T2。因為T1為低閾值提取出來的圖像,所以包含的邊緣比較連續,但是也含有較多的虛假邊緣;T2為高閾值提取出來的圖像,包含的邊緣比較斷斷續續,但不含虛假邊緣,因此需要結合T1和T2來得到一個完整的邊緣圖像(見圖2),T1圖像為圖(a),T2圖像為圖(b),具體步驟如下:先在T2圖像中找到一個灰度值不為0的P點,然后沿著邊緣線一直延續到終點Q,在T1圖像的Q'附近的8-鄰域尋找非零像素R',把它填充到T2圖像中作為R,接著把R點作為起始點繼續重復上述的步驟,一直循環,直到在T1和T2圖像中都無法進行,這樣一個以P點為起始點的完整邊緣線形成(Deriche et al. 1987)。然后在T2圖像中尋找新的邊緣線,重復上述步驟,直到T2中再也找不到新的邊緣線為止。

圖2 邊緣圖像
2.1.1 高斯濾波會將邊緣信息減弱,造成重要信息的丟失
Canny邊緣檢測算法采用的高斯濾波[12]方法是一種非常優秀的濾波方法,能夠很好地濾除掉高斯噪聲和椒鹽噪聲,可是,高斯濾波有一個不可避免的缺陷,就是它在進行圖像去噪處理的時候,會將圖像的邊緣信息減弱。
如果邊緣信息被減弱,那么在后續的處理中,這些重要的邊緣會被當作和噪聲一樣的信息被之后的雙閾值處理和連通計算過濾掉,尤其是有一些比較弱的邊緣和孤立邊緣。那么這樣最后得到的邊緣圖像會漏掉一些重要的邊緣,不利于對其進行分析。
基于這個原因,現在考慮,既然是所有的高頻信息都會參與平滑濾波[12],那么可以設置一個合理的閾值,讓鄰域內的像素點的灰度值與中心點像素灰度值的差值小于這個閾值的像素點進行平滑濾波,而不是讓鄰域內所有的像素點參與濾波,這樣便使得邊緣信息不會參與計算,避免了邊緣信息的削弱,也很好地濾去了噪聲。基于這個想法,提出了具有保留邊緣信息的選擇性平滑濾波方法。
2.1.2 憑借經驗選取閾值,會造成誤差
Canny算法的雙閾值步驟中,閾值是自己憑經驗選擇,一般將高閾值的0.5倍或者0.4倍作為所選取的低閾值??墒菓{經驗選擇不一定是準確的,有時需要多次試驗才能確定一個最好的高低閾值。這樣選取的閾值是不能很好地適應每一次邊緣提取的要求的,所以需要找到一個有很好適應性的閾值算法,于是想到了利用迭代算法[13]來得到合理的閾值。
這里設定Canny算法中高閾值為100,低閾值為50,增大高斯半徑,增大值分別為2,3,5,得到的Canny邊緣檢測圖像如圖3所示。

高斯半徑為2 高斯半徑為3 高斯半徑為5
明顯看到,隨著高斯半徑不斷增大,所得到的邊緣數量在不斷減少。從中證明了,在進行高斯濾波的同時,也將邊緣信息削弱了。
在使用均值選擇性濾波后,同樣設定Canny算法中高閾值為100,低閾值為50,設定均值選擇性濾波閾值為30,增大均值選擇性濾波半徑,增大值分別為:2,5,15,這里得到的Canny邊緣檢測圖像如圖4所示。

高斯半徑為2 高斯半徑為5 高斯半徑為15
從中可以看出,在使用均值選擇性濾波之后,設定了均值選擇性濾波的閾值并保持這個閾值不變的情況下,增大均值半徑,最后所得到的Canny邊緣檢測圖像的邊緣細節差別并無太大區別。
而若是保持均值半徑不變,Canny算法高低閾值不變,增大設定的均值選擇性濾波閾值,得到的Canny邊緣檢測圖像如圖5所示。

圖5 Canny邊緣檢測圖
因為將設定的閾值增大,表明有更多的像素點參與了平滑濾波,受到削弱的邊緣信息也就更多,所以這里增大設定的閾值,可以看到設定閾值為40的圖像的邊緣細節比設定閾值為50的圖像的邊緣細節更好。
最后,通過這種方法,能夠很好地解決高斯濾波使得邊緣信息減弱的問題,同時,這種方法在選擇鄰域半徑方面的要求也明顯沒有高斯濾波選擇鄰域半徑的要求嚴格。
Canny算法在最后一步雙閾值法中,閾值是依靠經驗選擇,而且高低閾值比值是固定的。在實際操作中,受環境、光照等原因制約,原始Canny算法的高低閾值比值因為是固定的并不適用于所有需要進行邊緣提取的場合。所以需要找到一個能計算出最佳高低閾值的算法,這時想到了迭代算法。
迭代算法總的思路如下:
假設一幅混有噪聲的圖像G(x,y)由原始圖像f(x,y)和噪聲z(x,y)組成,即:
G(x,y)=f(x,y)+z(x,y)
(5)
通過閾值分割將這幅混有噪聲的圖像分為G1(x,y)和G2(x,y),由于噪聲是隨機分布的,所以依然認為這兩部分圖像是混有噪聲的,表達式如下:
G1(x,y)=f1(x,y)+z(x,y)
(6)
G2(x,y)=f2(x,y)+z(x,y)
(7)
進行迭代運算的時候,要將這兩部分圖像分別求它們的灰度均值,即:
E{G1(x,y)}=E{f1(x,y)+z(x,y)}=
E{f1(x,y)}
(8)
E{G2(x,y)}=E{f2(x,y)+z(x,y)}=
E{f2(x,y)}
(9)
從這兩個表達式可以得出,進行迭代運算的次數增加時,所求得平均灰度值越來越接近真實值,也證明了采用迭代運算計算出來的最佳高低閾值是不會受到噪聲的干擾的。
在進行迭代運算時,總的步驟是:先用直方圖統計出圖像的最小灰度值和最大灰度值,然后將這個最小灰度值和最大灰度值求和求均值,求出來的均值作為這次閾值分割的最原始閾值。這個原始閾值將圖像分為高于這個閾值的部分和低于這個閾值的部分。然后將高于這個閾值部分的圖像求出它的灰度均值,同樣的,將低于這個閾值部分的圖像求出它的灰度均值,之后將求出的這兩個灰度均值求和求均值,新求出來的均值和最原始的閾值進行比較,若是等于最原始的閾值或者說和最原始的閾值的差值等于某個值,便結束這次迭代運算。這次得到的閾值和最原始的閾值便是最佳高低閾值。若是不滿足,便將這次得到的這個閾值再次將圖像進行分割,按照上述步驟再次計算,直到得出最佳高低閾值。
具體步驟為[14]:
(1)使用直方圖統計出最小灰度和最大灰度,計算出最原始閾值T0。
T0={TK|K=0}
(10)
(11)
其中,K表示進行迭代的次數,Zmax和Zmin分別表示最大灰度值和最小灰度值。
(2)用得出來的閾值TK將圖像分為兩部分H1和H2。
H1={f(x,y)| ≥TK}
(12)
H2={f(x,y)}
(13)
(3)計算H1和H2這兩部分圖像的灰度均值[15]。
(14)
(15)
其中,f(i,j)是圖像中各個點的灰度值,NH(i,j),NL(i,j)滿足:
(16)
(17)
(4)計算新的閾值TK+1。
(18)
(5)如果TK=TK+1或者說滿足指定的要求時,迭代結束,否則,K=K+1,再次按照步驟2進行迭代計算。
(6)迭代算法停止,求得的M1和M2即為最佳高低閾值。
根據前文所述,可以把Canny邊緣檢測算法的步驟修改為:
(1)對圖像進行濾波處理;
(2)計算梯度的幅值和方向;
(3)進行非極大值抑制;
(4)運用迭代算法求出最佳高低閾值;
(5)將求出來的最佳高低閾值代入到雙閾值法中進行圖像處理。
將Canny算法和改進的Canny算法分別用Matlab求邊緣圖像[15],效果如圖6所示。

圖6 邊緣圖像
可以看到,直接運用Canny算子得到的邊緣圖像會存在雙邊緣的情況,而改進后的Canny算法較好地去除掉了雙邊緣的情況。
不漏檢真實存在的邊緣,也不把非邊緣點作為邊緣點檢出,使輸出的信噪比最大。
信噪比的數學表達式為:
(19)
計算兩張圖片的信噪比,結果如表1所示。

表1 傳統Canny算子與改進Canny算子信噪比對比
分析表1可以知道,改進后算法信噪比提高了14%,去噪效果更好。
該文采取林卉等人提出的邊緣檢測評價方法[16],計算出圖片的邊緣像素總數、四連通域數八連通域數,并對其值進行比較。容易推斷,比值1為八連通域數和邊緣點數的比值,比值越小,表示邊緣連續性越好;比值2為八連通域數和四連通域數的比值,比值越小,表明單像素邊緣所占比例越大,越符合單邊緣響應準則。
計算兩張圖片的相關信息,結果如表2所示。

表2 傳統Canny算子與改進Canny算子實驗結果
分析表2易知,改進后的Canny算子,其連續性和準確性都比原來有了很大幅度的提升。
能夠得出,通過迭代算法改進的Canny算法,不僅能夠改善原始Canny算法高低閾值選擇的困難與不確定性,還能夠將Canny算法提取的邊緣進行優化,去除掉一些不必要的雙邊緣,更有利于分析圖像。
在圖像處理中,圖像分割是圖像處理中最關鍵的步驟之一,而邊緣檢測是圖像分割中的一種方法,通過搜索圖像區域中的各個邊界,從而達到圖像分割的目的。圖像的邊緣提取是圖像分割領域的基礎,同時在圖像識別中,也是提取圖像特征的一個重要屬性。而在邊緣提取中,最引人矚目的無意是最優檢測算子——Canny邊緣檢測算法,它在處理高斯白噪聲方面明顯優于其他算子,所以提取出的邊緣又細又銳利,并且邊緣連續。然而由于原始Canny算子采取的高斯濾波不僅能濾去噪聲,也能將邊緣平滑,弱化邊緣信息,所以采取選擇性濾波方式,設定一個閾值,讓和中心像素灰度差值小于這個閾值的像素參與計算,和中心像素灰度差值大于這個閾值的像素被認為是有效信息,不會被當作噪聲除去,從而保留了這個高頻信號,邊緣信息也得以保留。從上述實驗可以看出,選擇性濾波效果很優秀,在設定的閾值不變的情況下,無論選擇的模糊半徑多大,最終保留下來的邊緣細節并無明顯差別,這很好地彌補了原始Canny算法的缺點,同時,由于初始Canny算子的閾值選擇比較困難和不確定性,采取的迭代算法能夠很好地解決這些問題,同時還能去除掉Canny邊緣檢測中一些不必要的邊緣。