上一期:图像边缘检测基础知识
相信大家在之前的介绍中已经知道什么是边缘以及边缘检测的一般步骤了,今天小白就带大家一起来看看边缘检测的edge函数实战现场!
理论基础
到目前为止边缘检测最通用的方法是检测亮度值的不连续性,对于这一点我们已经在之前的边缘的概念中提到过,大家可以结合着理解一下就很容易了。而这样的不连续性是用一阶导数和二阶导数检测的。
而在图像中对于某一点一阶导数和二阶导数的计算就可以由下面两个式子进行表示。
而一般为了方便计算,Matlab中决定用绝对值或平方来代替平方根的计算。
再结合边缘检测是为了找到亮度快速变化的地方的意图,我们就可以给出以下两个基本准则了:
1. 找到亮度的一阶导数在幅度上比指定的阈值大的地方。
2. 找到亮度的二阶导数有零交叉的地方。
在第一条找到了亮度快速变化的基础上,第二条则是定位了变化最快的像素区域更好的标定出了我们的边界。
edge函数实战现场
基于上述基本原理,MATLAB给出了edge函数来进行边缘检测的过程。
其中f和以往一样就是我们要输入的图像矩阵,而method则是如下表中的一系列方法。
在输出中:逻辑数组g,其值如下决定:在f中检测到边缘的位置为1,在其他位置为0。参数t是可选的,它给出edge使用的阈值,以确定哪个梯度值足够大到可以称为边缘点。这也是给我们后面的计算或者处理给出了一个指标。而parameters则一般是给出了阈值参考,由于不同的方法参数意义不同这里我就不一一讲解了,大家可以自行百度一下!
为了方便理解我们给出了三种方法的计算掩模。有的同学可能会问为什么在理论中给出的导数的公式在这里却变成了加减法的组合?
回答是:数字图像是离散的,微分方法在这里定义为差分计算!而以上的计算也是对理论公式的近似!
这里要注意的是LOG和Canny的方法使用时是有着一个高斯滤波和过程的,其就是为了减少噪声对于二阶导数结果的影响,防止假边缘的出现!当处理一幅图像时,大家可以把每个方法都试一试,以便得到最好的处理结果。
这里小白也为大家在MATLAB中现场演练了一下。
f=imread("Fig1006(a).tif");
g1=edge(f,'sobel',0.1);
g2=edge(f,'log',0.003,2.25);
g3=edge(f,'canny',[0.04 0.1],1.5);
figure(2);
subplot(2,2,1);
imshow(f);
subplot(2,2,2);
imshow(g1);
subplot(2,2,3);
imshow(g2);
subplot(2,2,4);
imshow(g3);
我们输入了一个房屋图像后,分别使用sobel、LOG、Canny三种方法来进行边缘提取,可以看到结果是各有不同。但是主体轮廓还是都展现出来了的!而其中的阈值参数的选择也十分重要,它可以直接决定强弱边缘的显现情况,从而对整体的显现产生影响。
这里小白给大家开个头,其实关于参数的选取,不同边缘检测器的结合使用等等。门路比较多。感兴趣的可以下去多查阅些资料练练手!