在图像中,边缘可以看做是位于一阶导数较大的像素处,因此,我们可以求图像的一阶导数来确定图像的边缘,像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越大,高斯函数能够处理的邻域像素数越多,高斯模糊的效果也就越明显。