邊緣檢測是檢測圖像中的一些像素點,它們周圍的像素點的灰度發生了急劇的變化,我們認為在這過程中,圖像中的物體不同導致了這一變化,因此可以將這些像素點作為一個集合,可以用來標注圖像中不同物體的邊界。邊緣區域的灰度剖面可以看作是一個階躍,即圖像的灰度在一個很小的區域內變化到另一個相差十分明顯的區域。邊緣是圖像中的重要的結構性特征,邊緣往往存在於目標和背景之間,不同的區域之間,因此它可以作為圖像分割的重要依據。在邊緣檢測中,它提取的是圖像中不連續部分的特征,將閉合的邊緣提取出來便可以作為一個區域。與區域划分相比,邊緣檢測不需要逐個的對像素進行比較,比較適合大圖像的處理.
如圖

邊緣其實就是圖像上灰度級變化很快的點的集合。這些點往往梯度很大。圖像的梯度可以用一階導數和二階偏導數來求解。但是圖像以矩陣的形式存儲的,不能像數學理論中對直線或者曲線求導一樣,對一幅圖像的求導相當於對一個平面、曲面求導。對圖像的操作,我們采用模板對原圖像進行卷積運算,從而達到我們想要的效果。而獲取一幅圖像的梯度就轉化為:模板(Roberts、Prewitt、Sobel、Lapacian算子)對原圖像進行卷積。
使用一階導的算子有,prewitt,sobel和canny;使用二階導的有lapacian
(1)一階導算子:
1、prewitt
通常用 f '(x) = f(x + 1) - f(x - 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)
2、sobel
中心點 f(x, y) 是重點考慮的,它的權重應該多一些,所以改進成下面這樣的
-1, 0, 1
-2, 0, 2
-1, 0, 1
這就是 Sobel 邊緣檢測算子,偏 x 方向的。同理可得偏y方向上的。
-1, -2, -1
0, 0, 0
1, 2, 1
分別計算偏 x 方向的 Gx,偏 y 方向的 Gy,求絕對值,壓縮到 [0, 255]區間,即 G(x, y) = Gx + Gy 就是 sobel 邊緣檢測后的圖像了。因此sobel算子是有兩個方向的。
3、canny
canny算子的計算步驟如下:
1.高斯濾波器平滑圖像。去除噪聲
2.一階差分偏導計算梯度值和方向。通過sobel算子計算的。
3.對梯度值不是極大值的地方進行抑制。把不是極值的點,全部置0,去掉了大部分弱的邊緣。所以圖像邊緣會變細。
4.用雙閾值連接圖上的聯通點。設置雙閾值 t1, t2, 是這樣的,t1 <= t2 大於 t2 的點肯定是邊緣;小於 t1 的點肯定不是邊緣;在 t1, t2 之間的點,通過已確定的邊緣點,發起8領域方向的搜索(廣搜),圖中可達的是邊緣,不可達的點不是邊緣。最后得出 canny 邊緣圖。
(2)二階導算子
1、lapacian
一階差分: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
與原圖卷積運算即可求出邊緣。
那么這些算子有什么區別呢:
下面三張圖分別是 sobel,canny,laplace 結果圖。

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