图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)

如果图像灰度变化剧烈,进行一阶微分则会形成一个局部的极值,由数学上的知识,对图像进行二阶微分则会形成一个过零点,并且在零点两边产生一个波峰和波谷,我们要设定一个阈值,检测到这个过零点,如下图所示:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第1张图片


带来了两个好处:

1. 二阶微分关心的是图像灰度的突变而不强调灰度缓慢变化的区域,对边缘的定位能力更强。

2. Laplace算子是各项同性的,即具有旋转不变性(后面会证明),在一阶微分里,我们是用|dx|+|dy|来近似一个点的梯度的,当图像旋转一个角度时,这个值就变化了,但对于Laplace算子来说不管图像怎么旋转,得到的响应是一样的。


一个注意点:

我们检测的必须是“过零点“,而不单单是零点,也就是要保证这个被选中的点一定要是局部极值点。比如下面这个例子,上面的曲线是图像空间,虚线处的点并不是图像的局部极值点,但求二阶导的时候确实是零点。再比如图像灰度的平坦区域,不管是一阶导还是二阶导都是0,它们显然不是我们要的点:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第2张图片


过零点的确定:

以p为中心的一个3*3领域,p点为过零点意味着至少有两个相对的领域像素的符号不同。有四种要检测的情况:左/右、上/下,和两个对角。如果g(x,y)的值与一个阈值比较(一种通用的方法),那么不仅要求相对领域的符号不同,数值差的绝对值要超过这个阈值,这时p称为一个过零点像素。

 

Laplace算子


Laplace算子是梯度的散度 :      



图像是离散的二维矩阵,用差分近似微分:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第3张图片

所以,



模板表示为:                                              其他常用的模板还有:

                                                                                             


Laplace算子的旋转不变性证明如下:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第4张图片


两个缺点:

1.没有了边缘的方向信息;          

 2.双倍加强了噪声的影响。


在Matlab中的测试结果:
原图:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第5张图片


原图在不同阈值下的边缘检测效果:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第6张图片

加了椒盐噪声之后:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第7张图片


加了高斯噪声之后:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第8张图片


代码:

lenna = imread('E:\ImageTest\512\g512_006\lena.pgm');

%---------------------------------------------------------------------------
lenna_3=mat2gray(lenna);   %图像矩阵的归一化
[m,n]=size(lenna_3);
lenna_4=lenna_3;       %保留图像的边缘一个像素
L=0;
t=0.2;          %设定阈值
%Laplace算子
for j=2:m-1 
    for k=2:n-1
        L=abs(4*lenna_3(j,k)-lenna_3(j-1,k)-lenna_3(j+1,k)-lenna_3(j,k+1)-lenna_3(j,k-1));
        if(L > t)
            lenna_4(j,k)=255;  %白
        else
            lenna_4(j,k)=0;    %黑
        end
    end
end
figure;
imshow(lenna_4,[]);title('Laplacian 0.2')


可以明显的看出,Laplace算子虽然解决了一阶微分算子确定阈值的困难,但是却不能克服噪声的干扰。

于是LoG算子横空出世。



LOG算子

1980年,Marr和Hildreth提出将Laplace算子与高斯低通滤波相结合,提出了LOG(Laplace and Guassian)算子。

步骤如下:

1.对图像先进性高斯滤波(G × f),再进行Laplace算子运算Δ(G × f);

2.保留一阶导数峰值的位置,从中寻找Laplace过零点;

3.对过零点的精确位置进行插值估计。

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第9张图片

由上图可以看出,高斯滤波之后边缘信息才显现出来。



  微分算子与卷积算子的次序可以交换。


LOG算子如下:

根据sigma的不同以及3sigma原则可以建立不同的模板,sigma是一个尺度参数,在图像处理中引入尺度以及建立多尺度空间是一个重要的突破,sigma越大,图像越模糊滤除噪声效果越好,sigma越小,效果相反。

常用模板如下:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第10张图片


LOG的Matlab效果:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第11张图片


lenna = imread('E:\ImageTest\512\g512_006\lena.pgm');
subplot(121)
imshow(lenna,[]);title('原图')

%-------------------------------------------------------------
%自带函数
lenna=double(lenna);
lenna_1 = edge(lenna,'log'); 
subplot(122)
imshow(lenna_1,[]);title('LoG 0.5')


由数学上的关系,我们可以简化LOG的计算——这便是DOG算子。

DOG算子

二维高斯对sigma求导:


上面我们已经得到:


可以看出:


由导数定义:


所以,

变形一下得到:


右边比LOG算子只是多了一个系数,在实际应用中不影响。

我们定义:


当我们用DOG算子代替LOG算子与图像卷积的时候:


近似的LOG算子值的选取:


当使用这个值时,可以保证LoG和DoG的过零点相同,只是幅度大小不同。

这样,我们只要对图像进行两次高斯平滑再将结果相减就可以近似得到LOG作用于图像的效果了!


DOG的matlab效果:

图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)_第12张图片



你可能感兴趣的:(数字图像处理)