边缘提取(一):传统的边缘提取算子(1)

       经典的边缘提取算法中有一类算法是基于设计边缘提取算子(或者也可以叫卷积模板),然后经过阈值处理得到二值化的边缘图,下面就具体介绍这种思路相关的内容。

边缘提取(一):传统的边缘提取算子(1)

传统的边缘提取算子包括sobel、prewit、robert、LoG等,下面一一介绍:

1.      Sobel,prewitt,robert算子

                                   sobel                                                  prewitt                                          robert
 

      sobel算子相比于[-1 0 1]这种简单的水平梯度算子,还具有一定的平滑作用,有助于去除噪声,prewitt和sobel算子很像,但是sobel算子的卷积考虑了不同位置的权重。而robert算子求取的是对角线方向的。具体不做详细介绍了。Matlab实现代码如下:

<textarea readonly=”readonly” name=”code” class=”matlab”> 
clc;
clearvars;
close all;
im=imread('3.jpg');
%%
%sobel
sobel_x=[-1 0 1;-2 0 2;-1 0 1];
sobel_y=soble_x';
%prewitt
prewitt_x=[-1 0 1;-1 0 1;-1 0 1];
prewitt_y=prewitt_x';
%robert
robert1=[-1 0;0 1];
robert2=[0 -1;1 0];
[M,N,dim]=size(im);
if dim>1
    im1=rgb2gray(im);
end
%%
%卷积操作,在这里就只示范一个
im_1=conv2(double(im1),sobel_x,'valid');

2.      LOG(拉普拉斯+高斯滤波)

首先介绍一下拉普拉斯算子是一个二阶微分算子,在笛卡尔坐标系中就是所有非混合二阶偏导数:


具体到图像坐标系(x-y)中(x代表行,y代表图像列)

离散化之后的表示为(间隔为1):(二阶差分)

(离散系统到连续系统是通过采样保持器,常用的是零阶保持器,连续系统到离散系统则是通过间隔采样得到的,从s域变到z域的变化有双线性变化等方法,差分方程与Z域有直接的联系,具体怎么样需要用到控制数学里面的一些东西,这里偷个懒就不详细介绍了,想要深入了解的往这个方向查资料就行了):


对应卷积模板为:


      梯度是原图的一阶导数,代表的是像素值的变化速度,而拉普拉斯算子是二阶导数,代表着梯度的变化速度,这二者其实都可以用来确定边缘,具体例子我们可以看下图:


                                                                          (原图)

下面的折线图取自原图第五行的处理结果,如果用一阶导数求出的梯度,则会有两个峰值分别对应上下边沿,而如果用二阶导的话,则会对应的有四个峰值,原因是分别经历了两次剧烈的升降变化,而峰值极大值处,如果在连续系统中,二阶导为0。


                                   (从左到右分别为第五行灰度,一阶差分,二阶差分结果)

所以如果用二阶导来定位边缘的话,正确的方式应该是求取下图中两个黄点中间的位置,


由于图像坐标是离散的,所以只能近似逼近。但是几个峰值的位置其实也是靠近边缘的,有时候为了简化运算,也可以直接用二阶求导之后的值来做边缘提取,但是边缘定位的就不是很准了。上述实验的代码如下:

                                 

                                                              差分之后的结果(左:一阶 右:二阶)

                   

                                                              二值化之后的结果(左:一阶 右:二阶)

 <code class="language-plain"><textarea readonly=”readonly” name=”code” class=”matlab”>  
clc;
clearvars;
close all;
im=imread('3.jpg');
L=[0 1 0;1 -4 1;0 1 0];
di=[1 -1];
di2=[1 -2 1];
g=fspecial('gaussian',[5 5],1);
im1=rgb2gray(im);
figure,plot(im1(5,:));title('灰度变化');
im_di1=conv2(double(im1),di,'valid');
figure,plot(im_di1(5,:));title('水平梯度');
im_di2=conv2(double(im1),di2,'valid');
figure,plot(im_di2(5,:));title('二阶导');
figure(4);
subplot(1,2,1);imshow((abs(im_di1)>20),[]);
subplot(1,2,2);imshow((abs(im_di2)>20),[]);


为了去除噪声的影响,在用拉普拉斯算子对图像进行卷积之前,可以先用高斯对图像进行滤波,同样也是卷积操作:

而图像的卷积等价于频域的乘积,这样我们就可以把高斯卷积和laplace卷积合起来,就得到了LoG算子,具体解算步骤就是:

  • 对高斯函数求二阶偏导: 

                      


(公式详细推导来自于https://blog.csdn.net/touch_dream/article/details/62237018)

  • l  然后离散化得到指定大小的卷积模板,常用的是5*5的模板

    (要具体了解离散化的过程,可以参考这篇博客:                      https://blog.csdn.net/gnehcuoz/article/details/52793654)

                              图片来自http://blog.sina.com.cn/s/blog_7155fb1a0100wzkz.html



猜你喜欢

转载自blog.csdn.net/weixin_38907330/article/details/80874031
今日推荐