先來看張圖,左邊是原圖,右邊是邊緣檢測后的圖,邊緣檢測就是檢測出圖像上的邊緣信息,右圖用白色的程度表示邊緣的深淺。
邊緣其實就是圖像上灰度級變化很快的點的集合。
如何計算出這些變化率很快的點?
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 結果圖。