先來看張圖葫男,左邊是原圖膳沽,右邊是邊緣檢測后的圖矫渔,邊緣檢測就是檢測出圖像上的邊緣信息彤蔽,右圖用白色的程度表示邊緣的深淺。
邊緣其實就是圖像上灰度級變化很快的點的集合庙洼。
如何計算出這些變化率很快的點顿痪?
1.導數(shù)镊辕,連續(xù)函數(shù)上某點斜率,導數(shù)越大表示變化率越大蚁袭,變化率越大的地方就越是“邊緣”征懈,但是在計算機中不常用,因為在斜率90度的地方揩悄,導數(shù)無窮大卖哎,計算機很難表示這些無窮大的東西。
2.微分删性,連續(xù)函數(shù)上x變化了dx亏娜,導致y變化了dy,dy值越大表示變化的越大蹬挺,那么計算整幅圖像的微分维贺,dy的大小就是邊緣的強弱了。
微分與導數(shù)的關系:dy = f '(x) dx
舉個例子:
在連續(xù)函數(shù)里叫微分巴帮,因為圖像是離散的溯泣,叫差分,和微分是一個意思晰韵,也是求變化率。
差分的定義熟妓,f '(x) = f(x + 1) - f(x)雪猪,用后一項減前一項。
按先后排列 -f(x) + f(x + 1)
提出系數(shù) [-1, 1] 作為濾波模板起愈,跟原圖 f(x) 做卷積運算就可以檢測邊緣了
模板為什么要是奇數(shù)的只恨?
因為模板是偶數(shù)的話,卷積出來的結果應該是放在中間的抬虽,不方便表示官觅。
例如:圖像 [10, 20, 30] 跟 [-1, 1] 卷積后的值,應該放在圖像 10 跟 20 中間的位置阐污,就是應該放在 0 和 1 號位置的中間休涤,也就是 0.5 號位,但是圖像是離散的笛辟,中間沒得放功氨,只能放在 0 號位,也就是 10 的位置手幢,就偏差了 0.5 的位置捷凄,為了方便處理,濾波模板一般都是奇數(shù)個的围来,3跺涤,5匈睁,7 個的。
Sobel 邊緣檢測算子
所以用 f '(x) = f(x + 1) - f(x - 1) 近似計算一階差分桶错。
排好序:[-1 * f(x-1)航唆,0 * f(x),1 * f(x+1)]
提出系數(shù):[-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 方向的超营。(類似二元函數(shù)的偏導數(shù),偏x阅虫,偏y)
同理可得
-1, -2, -1
0, 0, 0
1, 2, 1
是 sobel 偏 y 方向的算子演闭。
分別計算偏 x 方向的 Gx,偏 y 方向的 Gy颓帝,求絕對值米碰,壓縮到 [0, 255]
區(qū)間,即 G(x, y) = Gx + Gy 就是 sobel 邊緣檢測后的圖像了
Laplace 邊緣檢測算子
拉普拉斯是用二階差分計算邊緣的购城,看連續(xù)函數(shù)的情況下
在一階微分圖中極大值或極小值處吕座,認為是邊緣。
在二階微分圖中極大值和極小值之間的過 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)
提取前面的系數(shù):[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)
提取各個系數(shù)侮攀,寫成模板的形式
0, 1, 0
1, -4, 1
0, 1, 0
考慮兩個斜對角的情況
1, 1, 1
1, -8, 1
1, 1, 1
這就是拉普拉斯算子锣枝,與原圖卷積運算即可求出邊緣。
Canny 邊緣檢測算子
canny計算過程
1.高斯濾波器平滑圖像兰英。
2.一階差分偏導計算梯度值和方向撇叁。
3.對梯度值不是極大值的地方進行抑制。
4.用雙閾值連接圖上的聯(lián)通點畦贸。
通俗說一下陨闹,
1.用高斯濾波主要是去掉圖像上的噪聲。
2.計算一階差分薄坏,OpenCV 源碼中也是用 sobel 算子來算的正林。
3.算出來的梯度值,把不是極值的點颤殴,全部置0觅廓,去掉了大部分弱的邊緣。所以圖像邊緣會變細涵但。
4.雙閾值 t1, t2, 是這樣的杈绸,t1 <= t2
大于 t2 的點肯定是邊緣
小于 t1 的點肯定不是邊緣
在 t1, t2 之間的點帖蔓,通過已確定的邊緣點,發(fā)起8領域方向的搜索(廣搜)瞳脓,圖中可達的是邊緣塑娇,不可達的點不是邊緣。
最后得出 canny 邊緣圖劫侧。
三個算子區(qū)別
sobel 產(chǎn)生的邊緣有強弱埋酬,抗噪性好
laplace 對邊緣敏感,可能有些是噪聲的邊緣烧栋,也被算進來了
canny 產(chǎn)生的邊緣很細写妥,可能就一個像素那么細,沒有強弱之分审姓。
下面三張圖分別是 sobel珍特,canny,laplace 結果圖魔吐。