在圖像中,邊緣可以看做是位於一階導數較大的像素處,因此,我們可以求圖像的一階導數來確定圖像的邊緣,像sobel算子等一系列算子都是基於這個思想的。
但是這存在幾個問題:1. 噪聲的影響,在噪聲點處一階導數也會取極大值 2. 求解極大值的復雜性
所以,有了使用二階導數的方法。這里主要考慮LoG算子,即高斯-拉普拉斯算子。
為什么要使用二階導數呢?
這里要考慮上面說的第二個問題,一階導數的極大值到了二階導數對應的值就是0了,很顯然求解一個函數的零點值要比求極大值容易。這個性質也被稱為二階導數過零點(zero-crossing)。
所以,我們就可以利用二階導數來代替一階導數了。
而對於上面的第一個問題,也就是為什么要引入高斯算子的原因。我們已經知道拉普拉斯算子其實就是一個二階導數算子,為什么還要引入高斯呢?
細想一下,高斯算子在圖像處理中的一般的作用其實大都是進行模糊,換句話說它可以很好的抑制噪聲,這樣引入高斯算子我們就克服了噪聲的影響(這也是LoG算子對拉普拉斯算子的改進的地方)。
所以,高斯-拉普拉斯算子其實就是:先對圖像進行高斯模糊,然后再求二階導數,二階導數等於0處對應的像素就是圖像的邊緣。
具體的推導過程可以看一下下面的鏈接:http://fourier.eng.hmc.edu/e161/lectures/gradient/node10.html
---------------------
由於高斯函數的參數sigma對高斯算子的影響,所以,如果sigma選取的很小的話,前期的模糊效果很弱,也就可以近似等於拉普拉斯算子了。所以,拉普拉斯算子也可以看做高斯-拉普拉斯算子的一種極限情況。
實驗驗證一下高斯-拉普拉斯算子的效果:
從結果中可以看出來當sigma取0.6時,與拉普拉斯算子的效果近似,而當sigma取1時,可以達到比較好的效果

1 I = imread('lena.jpg') ; 2 gray = rgb2gray(I) ; 3 subplot(2,2,1),imshow(gray) ; 4 title('原圖') 5 6 h = fspecial( 'log', 5, 0.6 ) ; 7 log1 = imfilter(gray,h) ; 8 subplot(2,2,2),imshow(log1) ; 9 title('LoG sigma=0.6') ; 10 11 h = fspecial( 'log', 5, 1 ) ; 12 log2 = imfilter(gray,h) ; 13 subplot(2,2,3),imshow(log2) ; 14 title('LoG sigma=1') ; 15 16 h = fspecial( 'laplacian') ; 17 lap = imfilter( gray,h ) ; 18 subplot(2,2,4), imshow(lap) ; 19 title('Laplacian') ;
--------------------------------------------------
我們再從圖像中分析一下sigma對結果的影響,下面兩圖分別是sigma=0.6和sigma=1時的高斯-拉普拉斯算子的三維圖(縱軸為函數值):
由圖中可以看出sigma=0.6時的零點數明顯要多於sigma=1時的,這也證明上面得到的結果確實是正確的。
--------------------------------------------------------
這里再多說一句,既然sigma是高斯函數的參數,那能不能從高斯函數的角度來說明一下sigma的作用呢?
當然可以!!先看下圖:
我們只需要看u=0的三個圖像即可,從圖中可以看出,sigma越小,高斯函數的能量越集中,不知道哪里學到過:高斯函數97%的能量集中在3*sigma的范圍內(以u對稱的3*sigma范圍內)。
那么我們現在就知道了使用高斯函數對圖像進行模糊運算或者稱之為卷積運算,它起作用比較明顯的區域就是在距離當前像素3*sigma范圍內。從此可以看出,sigma越大,高斯函數能夠處理的鄰域像素數越多,高斯模糊的效果也就越明顯。