邊緣檢測原理

轉自https://www.jianshu.com/p/2334bee37de5。謝謝作者整理,若侵權,告知即刪。

先來看張圖,左邊是原圖,右邊是邊緣檢測後的圖,邊緣檢測就是檢測出圖像上的邊緣信息,右圖用白色的程度表示邊緣的深淺。

sobel.png

邊緣其實就是圖像上灰度級變化很快的點的集合。
如何計算出這些變化率很快的點?

1.導數,連續函數上某點斜率,導數越大表示變化率越大,變化率越大的地方就越是“邊緣”,但是在計算機中不常用,因爲在斜率90度的地方,導數無窮大,計算機很難表示這些無窮大的東西。

2.微分,連續函數上x變化了dx,導致y變化了dy,dy值越大表示變化的越大,那麼計算整幅圖像的微分,dy的大小就是邊緣的強弱了。
微分與導數的關係:dy = f '(x) dx

舉個例子:

在連續函數裏叫微分,因爲圖像是離散的,叫差分,和微分是一個意思,也是求變化率。
差分的定義,f '(x) = f(x + 1) - f(x),用後一項減前一項。
按先後排列 -f(x) + f(x + 1)
提出係數 [-1, 1] 作爲濾波模板,跟原圖 f(x) 做卷積運算就可以檢測邊緣了

模板爲什麼要是奇數的?

因爲模板是偶數的話,卷積出來的結果應該是放在中間的,不方便表示。
例如:圖像 [10, 20, 30] 跟 [-1, 1] 卷積後的值,應該放在圖像 10 跟 20 中間的位置,就是應該放在 0 和 1 號位置的中間,也就是 0.5 號位,但是圖像是離散的,中間沒得放,只能放在 0 號位,也就是 10 的位置,就偏差了 0.5 的位置,爲了方便處理,濾波模板一般都是奇數個的,3,5,7 個的。

Sobel 邊緣檢測算子

所以用 f '(x) = f(x + 1) - f(x - 1) 近似計算一階差分。

排好序:[-1 * f(x-1),0 * f(x),1 * f(x+1)]
提出係數:[-1, 0, 1]

所以模板 [-1, 1] 被改造成了 [-1, 0, 1]
二維情況下就是

-1, 0, 1
-1, 0, 1
-1, 0, 1

這個就是 Prewitt 邊緣檢測算子了。

f(x-1, y-1),  f(x, y-1),  f(x+1, y-1)
f(x-1, y),    f(x, y),    f(x+1, y)
f(x-1, y+1),  f(x, y+1),  f(x+1, y+1)

中心點 f(x, y) 是重點考慮的,它的權重應該多一些,所以改進成下面這樣的

-1, 0, 1
-2, 0, 2
-1, 0, 1

這就是 Sobel 邊緣檢測算子,偏 x 方向的。(類似二元函數的偏導數,偏x,偏y)
同理可得

-1, -2, -1
 0,  0,  0
 1,  2,  1

是 sobel 偏 y 方向的算子。

分別計算偏 x 方向的 Gx,偏 y 方向的 Gy,求絕對值,壓縮到 [0, 255]
區間,即 G(x, y) = Gx + Gy 就是 sobel 邊緣檢測後的圖像了

Laplace 邊緣檢測算子

拉普拉斯是用二階差分計算邊緣的,看連續函數的情況下
在一階微分圖中極大值或極小值處,認爲是邊緣。
在二階微分圖中極大值和極小值之間的過 0 點,被認爲是邊緣。

拉普拉斯算子推導:
一階差分:f '(x) = f(x) - f(x - 1)
二階差分:f '(x) = (f(x + 1) - f(x)) - (f(x) - f(x - 1))
化簡後:f '(x) = f(x - 1) - 2 f(x)) + f(x + 1)
提取前面的係數:[1, -2, 1]

二維的情況下,同理可得
f '(x, y) = -4 f(x, y) + f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1)
提取各個係數,寫成模板的形式

0,  1, 0
1, -4, 1
0,  1, 0

考慮兩個斜對角的情況

1,  1, 1
1, -8, 1
1,  1, 1

這就是拉普拉斯算子,與原圖卷積運算即可求出邊緣。

Canny 邊緣檢測算子

canny計算過程
1.高斯濾波器平滑圖像。
2.一階差分偏導計算梯度值和方向。
3.對梯度值不是極大值的地方進行抑制。
4.用雙閾值連接圖上的聯通點。

通俗說一下,
1.用高斯濾波主要是去掉圖像上的噪聲。
2.計算一階差分,OpenCV 源碼中也是用 sobel 算子來算的。
3.算出來的梯度值,把不是極值的點,全部置0,去掉了大部分弱的邊緣。所以圖像邊緣會變細。
4.雙閾值 t1, t2, 是這樣的,t1 <= t2
大於 t2 的點肯定是邊緣
小於 t1 的點肯定不是邊緣
在 t1, t2 之間的點,通過已確定的邊緣點,發起8領域方向的搜索(廣搜),圖中可達的是邊緣,不可達的點不是邊緣。
最後得出 canny 邊緣圖。

三個算子區別

sobel 產生的邊緣有強弱,抗噪性好
laplace 對邊緣敏感,可能有些是噪聲的邊緣,也被算進來了
canny 產生的邊緣很細,可能就一個像素那麼細,沒有強弱之分。

下面三張圖分別是 sobel,canny,laplace 結果圖。

 

sobel算子

canny算子

laplace算子

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