10.1 点、线和边缘检测
间断点检测包括点检测、线检测和边界检测三种,寻找间断最一般的方法是模板检测。计算模板所包围区域的灰度级与模板系数的乘积之和。图像中任意点的模板响应公式为:
其中是与模板系数
相联系的像素的灰度级,R是相对于模板中心位置的像素的响应。
![](https://i-blog.csdnimg.cn/direct/5fdf91df4cc54fc98bd5d74a692ca208.png)
10.1.1 孤立点的检测
孤立点是指该点的灰度级与其背景的差异相当大,并且它所在的位置是一个均匀的或者近似均匀的区域。其基本思想就是如果一个孤立点与它周围的点很不相同,则很容易被上述模板检测到,在灰度级为常数的区域,模板响应R为0。
拉普拉斯公式为:
其中,偏微分公式为:
故拉普拉斯是
点检测的输出是使用如下表达式得到的:
![](https://i-blog.csdnimg.cn/direct/f46c86b51c854f4fbd48980af07ca6c2.png)
10.1.2 线检测
复杂度更高的检测是线检测,对于线检测,可以预期二阶导数将导致更强的响应,并产生比一阶导更细的线,这样,我们可以使用拉普拉斯模板,二阶导数的双线效应必须做适当的处理。通常,我们的兴趣在于检测特定方向的线,假设使用第一个模板对一幅具有恒定背景并包含各种线的图像进行滤波,最大响应将出现在图像中通过该模板中间行的一条水平线上。实验表明,第二个模板对于方向的线有最佳响应。
![](https://i-blog.csdnimg.cn/direct/315d5cc8faf54f1da1bc07c8e8d17c88.png)
![](https://i-blog.csdnimg.cn/direct/a0d8d16caee34ba2b7f89a19f0a648f3.png)
10.1.3 边缘模型
由于两个具有不同灰度值的相邻区域之间总存在灰度边缘,而灰度边缘是灰度值不连续(或突变)的结果,这样这种不连续常常可以利用求导数来检测到。一般用一阶和二阶导数来检测边缘。
![](https://i-blog.csdnimg.cn/direct/229c2c34502f423b94866cf602883f39.png)
当沿着剖面线从左到右经过时,在进入和离开斜面的变化点,一阶导数为正,在灰度级不变的区域一阶导为零。在边缘与黑色一边相关的跃变点二阶导数为正,在边缘与亮色一边相关的跃变点二阶导为负数,沿着斜坡和灰度为常数的区域为零。通过以上观察和分析,一阶导数可用于检测图像中的一个点是否是边缘点;二阶导数的符号可以用于判断一个边缘像素是在边缘亮的一边还是暗的一边。
1.梯度算子——直接差分算子
为了达到检测边缘的目的,可以通过计算图像的一阶导数来完成,该类技术为基本边缘检测技术,所采用的工具就是梯度。
梯度可用于描述图像
在
位置处的边缘点的强度和方向,表示为
:
梯度的幅度描述了梯度向量最大变化率的值,表示为
:
梯度的方向由对于x轴(正x轴向下延伸,正y轴向右延伸)度量的角度给出,表示为
:
上述两个梯度分量的直接差分计算公式对所有x和y的有关值可用直接差分算子(模板)对的滤波来执行。例如图示各个位置处的像素点的梯度(以
处的像素为例)如下:
2.梯度算子——Roberts算子
Roberts算子是最早尝试使用具有对角优势的边缘检测器,其计算任意位置处的像素点的梯度分量如下:
垂直梯度分量:
水平梯度分量:
上述两个梯度分量的计算公式对所有x和y的有关值可以用Roberts模板对的滤波来执行。Roberts算子可用于检测对角线方向的边缘。
3.梯度算子——Prewitt算子
直接差分模板以及Roberts模板(均为大小)在概念上很简单,但是忽略了中心点对端数据的性质。Prewitt算子考虑了中心点对端数据的性质,而且携带有关边缘方向的更多信息;其计算任意位置
处的像素点的梯度分量及滤波模板如下:
4. 梯度算子——Sobel算子
相对于Prewitt算子,Sobel算子通过增强模板中心点的重要性而实现某种程度的平滑效果(在完成边缘检测的同时,也较好地抑制了噪声),其计算任意位置处的像素点的梯度分量及滤波模板如下:
5.梯度算子——用于检测对角边缘的Prewitt、Sobel算子
为了实现对对角线方向边缘的检测,可以对上述的Prewitt模板和Sobel模板做出修改,以便它们沿着对角线方向有最大的响应,如下:
Prewitt和Sobel算子相比较,Prewitt模板比Sobel模板简单,但Sobel模板能够有效抑制噪声。
当使用上述各种梯度模板求解图像中每个像素位置处的梯度分量 和
后,可以采用公式
计算梯度的幅值(即边缘的强度),也可以采用绝对值来近似梯度的幅值,即:
。使用Sobel算子检测如图所示。
10.2更先进的边缘检测技术
10.2.1Marr-Hildreth边缘检测器
图像f在位置处的拉普拉斯变换定义:
拉普拉斯变换可以利用零交叉的性质进行边缘定位,也可以确定一个像素是在边缘暗的一边还是亮的一边。同时,它也存在缺点,即对噪声具有名感性,幅值产生双边缘,不能检测边缘的方向。
用于边缘检测的算子应该具备的两个显著特点:
边缘检测算子应该是一个能计算图像中每一点处的一阶导数或二阶导数的数字近似的微分算子;
边缘检测算子应该能被“调整”以便在任何期望的尺寸上起作用(大尺寸的算子可用于检测模糊边缘,小尺寸的算子可用于检测锐度集中的精细边缘。)
满足上述要求的算子是(高斯拉普拉斯算子,简称LoG算子),其中:
![]()
是拉普拉斯算子
;
是标准差为
的二维高斯函数:
则
Marr-Hildreth边缘检测算法由LoG滤波器与输入图像卷积组成,即
然后,寻找的零交叉来确定中边缘的位置。由于微分、卷积运算都是现线性操作,故上式可表示为:
即,可以先使用一个高斯滤波器平滑图像,然后对该结果执行拉普拉斯变换。因此,Marr-Hildreth边缘检测算法的实现步骤如下:
使用高斯滤波器对输入图像进行平滑滤波;
计算由第一步骤得到的图像的拉普拉斯变换;
寻找第二步骤所得图像的零交叉(由此得到的边缘一个像素宽)。
判定图像的任意像素p是否为零交点的一种方法如下:
在图像
中找到一个以p为中心的
邻域;
p像素为零交叉点意味着至少有两个相对的邻域像素的符号不同,有4种要测试的情况:左/右、上/下和两个对角;
如果相对的两个邻域像素的符号不同,而且它们的像素值与p的像素值的绝对差值超过指定的阙值。那么,p即为一个零交叉像素。
10.2.2 Canny(坎尼)边缘检测器
Canny边缘检测器的目标实现一个最优的边缘检测算法,其准则包含以下三方面:
低错误率:所有边缘都应被找到,并且应该没有伪响应;
边缘点应被很好地定位:已定位的边缘必须尽可能接近真实边缘。也就是由检测器标记为边缘的点和真实边缘的中心之间的距离应该最小;
单一的边缘点响应:对于真实的边缘点,检测器仅应返回一个点。也就是在仅存一个单一边缘点的位置,检测器不应输出多个边缘像素。
实现步骤:
用一个大小为
高斯滤波器平滑输入图像(其中,n的取值应为大于或等于6倍高斯滤波器的标准差的最小奇整数);
计算滤波后图像的梯度幅值和方向角度;
对梯度幅值图像执行非极大值抑制(剔除伪边缘点,保留候选边缘点);
对非极大值抑制的结果使用双阈值检测边缘(从候选边缘点选择真实边缘点);
采用连接分析对双阈值边缘检测结果进行连接(得到连续完整的边缘)。
非极大值抑制仅保留梯度幅值图像的极大值(严格地说,保留梯度方向上的极大值点),以此实现边缘的细化。局部极值周围存在相近数值的点,通过非极大值抑制选择合适的极值点作为边缘点。
非极大值抑制的实现步骤:(假设仅保留梯度幅值极大值的结果为)
将
初始化为原始的梯度幅值图像
;
对于每个点
,在梯度方向和反梯度方向各找n个像素点;若
不是这些点中的最大点,则将
置零,否则保持
不变。
需要注意的是,的边缘比原始的梯度边缘细,但任然保持了比1个像素粗的边缘,可采用形态学细化方法加以解决。此外,对于非极大值抑制,阈值选取不当,可能导致产生伪边缘点,丢失有效的边缘点。
对非极大值抑制结果使用双阈值检测边缘,对于上述得到的使用单阈值进行边缘检测可能会导致下述结果的出现:
若使用大的阈值,结果仅能得到少量的边缘点,且存在较多空隙;
若使用小的阈值,结果虽然能得到大量的边缘点,但会产生较多的错误检测。
对上述得到的使用双阈值进行边缘检测过程如下:
指定两个阈值
、
:
(建议:高阈值与低阈值的比率应为2:1或3:1)
使用高阈值
检测边缘,得到高阈值边缘图
(边缘点少,但可靠);
使用低阈值
检测边缘,得到低阈值边缘图
(边缘点多,但错误检测率高)
使用连接分析对双阈值边缘检测结果进行边缘连接
将高阈值边缘图
中相连的边缘点输出为一幅边缘图像
;
对于
中每条边,从端点出发在低阈值边缘图
中寻找其延长的部分,直至与
中另外一条边的端点相连(8连通性),否则认为
中没有它延长的部分;
将
作为结果输出。
如上图所示,检测出了大多数的主要边缘(房屋的角落、入口、窗户、屋顶等),同时过滤掉了不重要的细节(砖块和瓦片屋顶的纹理),边缘检测结果由于LoG算子,如屋顶的纹理去除更干净;同时,房屋入口的左边缘被清晰地检测到,而LoG算子无法检测出该边缘。
参考文献:数字图像处理(第四版)冈萨雷斯