邊緣檢測常用算子:
基於一階微分的邊緣檢測方法:

Roberts 算子考慮圖像的2*2鄰域,是最簡單的邊緣檢測算子,算法過程簡述:
【1】,遍歷圖像(除去上邊緣和左邊緣),對每個像素做Roberts模板運算。
【2】,將結果保存到目標圖像,結束。
Sobel算子考察的是3*3鄰域,由兩個卷積核組成,見上圖,算法過程簡述:
【1】,遍歷圖像(除去邊緣,防止越界),對每個像素做Sobel模板卷積運算。
【2】,比較兩個計算結果的大小,取較大者復制到目標圖像,結束。
Prewitt算子和Sobel算子類似,所不同的是選用不同的模板而已,算法過程相同。
Krisch算子同樣考究3*3鄰域,所不同的是選用了八個卷積核,見上圖,算法過程簡述:
【1】,遍歷圖像(除去邊緣,防止越界),對每個像素做Krisch模板卷積運算。
【2】,比較八個計算結果的大小,取較大者復制到目標圖像,結束。
基於二階微分的邊緣檢測方法:


Laplacian 算子是二階導數邊緣算子,考察的是3*3鄰域,上圖是兩種比較常用的模板,算法簡述如下:
【1】,遍歷圖像(除去邊緣,防止越界),對每個像素做Laplancian模板卷積運算,注意是只做其中的一種模板運算,並不是兩個。
【2】,復制到目標圖像,結束。
Gauss-Laplacian考察的是5*5的鄰域,檢測的同時,引入了濾波,是噪聲得以平滑,上圖是一種常用的算子,算法簡述。
【1】,遍歷圖像(除去邊緣,防止越界),對每個像素做Gauss -Laplancian模板卷積運算。
【2】,復制到目標圖像,結束。
Canny邊緣檢測是非常重要的一種邊緣檢測算法,主要過程如下:
【1】,用高斯濾波器平滑圖像。
已經學習過,根據高斯函數,構造高斯模板,進行濾波,不在贅述。
【2】,用一階偏導的有限差分來計算梯度的幅值和方向;
計算梯度作用模板,遍歷像素,進行模板運算即可。
![]() |
幅值和方向:
![]() | |||
其中,Phi 表示是幅值,Theta 是方向,用圖像副本進行保存。
【3】,對梯度幅值進行非極大值抑制;
為確定邊緣,必須保留局部梯度最大的點,而抑制非極大值(NMS)。
解決辦法是,利用梯度的方向:
已經求出Theta 的值,梯度的方向用於非極大值的抑制,將梯度角離散化到0,1,2,3中的一個(通過線性映射),采用近似的算法。知道了梯度角,也就知道了梯度線方向。
鄰域的中心像素M與沿著梯度線的兩個像素相比。如果M的梯度值不比沿梯度線的兩個相鄰像素梯度值大,則令M=0。
【4】,用雙閾值算法檢測和連接邊緣。
減少假邊緣段數量的典型方法是對N[i,j]使用一個閾值。將低於閾值的所有值賦零值。但問題是如何選取閾值?
解決方法:
雙閾值算法。雙閾值算法對非極大值抑制圖象作用兩個閾值τ1和τ2,且2τ1≒τ2,從而可以得到兩個閾值邊緣圖象N1[i,j]和N2[i,j]。由於N2[i,j]使用高閾值得到,因而含有很少的假邊緣,但有間斷(不閉合)。雙閾值法要在N2[i,j]中把邊緣連接成輪廓,當到達輪廓的端點時,該算法就在N1[i,j]的8鄰點位置尋找可以連接到輪廓上的邊緣,這樣,算法不斷地在N1[i,j]中收集邊緣,直到將N2[i,j]連接起來為止。



沒有留言:
張貼留言