在本文中,将探讨一种用于彩色或单色图像的边缘检测算法。这种算法通过从输入图像生成的一维线/函数/纹理/图像来识别图像中的边缘。与一些已知方法生成的结果相比,该算法能够检测到之前未被注意到的边缘。算法是自适应的,并且可以参数化,允许增加或减少细节和容差,从而以更高的精度细化图像中的边缘。
这些参数大多数是基于人类心理感知的视觉和可观察的(例如角度、颜色密度、减法策略和细节),而不是现有的客观和定量的数学变换方法。由于算法不使用繁重的矩阵计算/变换,因此它提供了更好的性能。算法是渐进的,可以用于噪声信号。它也可以在渐进加载或部分接收的图像中使用。算法可以使用尽可能少的线性样本,也可以使用尽可能多的样本。
现有的方法将图像作为一个整体应用,并且不能将不同的参数应用于图像的不同部分,除非将图像分成不同的部分,然后再将它们拼接回去。除了上述优势外,该算法易于理解和实现。
边缘检测是指识别和定位图像中锐利不连续性的过程。不连续性是像素强度的突然变化,这些变化表征了场景中物体的边界。传统的边缘检测方法涉及将图像与一个算子(一个2-D滤波器)卷积,该算子被构建为对图像中的大梯度敏感,同时在均匀区域返回零值。
现有的方法使用一个NxN矩阵,称为核,来决定一个点是否是潜在边缘的一部分。一般来说,N=3,矩阵中的单元格数量为9。矩阵操作因此成本高昂。随着N值增加到4或5或更多,计算变得更加复杂,首次通过结果的持续时间不断增加。
许多现有方法提出使用降噪滤波器作为边缘检测的先决条件,从而在图像处理中增加了额外的步骤。
需要以下几个方面:
1. 不同的颜色减法方法
2. 通用线采样器 - 用于以任何角度创建1D图像
3. 为不同策略的边缘检测定制的数据结构
颜色减法算法用于计算任意两种颜色之间的相对差异:这种距离用于识别两种颜色之间的RGB颜色差异。较大的差异增加了像素对被检测为边缘点对的概率。稍后在文档中将清楚地说明,两种不同的策略建议可能的边缘是如何依赖于颜色差异的。
提出的边缘检测方法允许选择几种颜色减法方法作为参数。这些颜色减法方法在下面讨论。
欧几里得距离(差异)考虑颜色作为假设的3D空间。有时,不同颜色分量的饱和度会产生更好的结果。例如,在那些使用红通滤波器进行图像采集并且图像包含比绿色或蓝色更多的红色的图像中,这一点更加明显。
差异 = MAX(r1, g1, b1) - MAX(r2, g2, b2)
对于灰度图像,其中r=g=b。然后使用一个称为亮度的特定值:
亮度1 = 0.3 * r1 + 0.59 * g1 + 0.11 * b1
因此差异 = 亮度1 - 亮度2
线采样
在这种情况下,矩形的2维图像被分割或分解成一系列1维图像。这里需要注意的是,1维图像或扫描线或1D纹理的列表将覆盖整个图像。
这里使用标准线生成算法来生成起点和终点之间的线行走点。这里也需要提到,可能存在线行走方法生成的点数少于起点和终点之间的距离的情况。在这种情况下,为了便于像素位置近似,会在生成的点列表中以相等的间隔添加额外的点。
以下是扫描线如何定位的示例。为了便于理解,示例中的扫描线间距合理。然而,在实际计算中,线条是紧密接触的(它们之间的距离为0像素)。
为不同策略的边缘检测定制的数据结构
这里也使用了两种不同的策略。这两种策略已知会产生不同的结果,并在不同情况下具有优势。它们在这里讨论,并且附带了流程图的块图。
使用用户指定的参数来标记每条扫描线上的“最大边缘”。在这种策略中,max=N数量的像素对颜色差异值存储在数据结构中。例如,
maxEdges = 5
在特定扫描线的末尾,数据结构将返回5个最差异的像素对边缘点,建议可能的边缘。下面是一个简单的流程图:
+ / - 堆栈用作另一种策略,适用于某些情况。
在正边缘点(第n个和第n+1个边缘点之间的颜色差异为正)的情况下,像素对将被推入堆栈。同样,所有正边缘点将被推入堆栈,直到检测到负边缘点。当发现一个负边缘点时,所有正边缘点将被弹出,直到在堆栈上找到另一个负边缘点。在此之后,当前的负边缘点和最后一个弹出的正边缘点将被添加到边缘点的内部列表中,从而向列表中添加2个边缘点。
上述方法适用于正像素对颜色差异(边缘点)。对于负边缘点,也会采取完全相同的方法。
在整个线扫描结束后,堆栈上剩余的条目将被清除并忽略。在查询边缘点时,将返回遇到的保存的边缘点的内部列表。
上述方法的流程图块图如下:
一些有用的要点
与一些已知方法生成的结果相比,该算法能够检测到之前未被注意到的边缘。算法是自适应的,并且可以参数化,允许增加或减少细节和容差,从而以更高的精度细化图像中的边缘。
这些参数大多数是基于人类心理感知的视觉和可观察的(例如角度、颜色密度、减法策略和细节),而不是现有的客观和定量的数学变换方法。由于算法不使用繁重的矩阵计算/变换,因此它提供了更好的性能。算法是渐进的,可以用于噪声信号。它也可以在渐进加载或部分接收的图像中使用。算法可以使用尽可能少的线性样本,也可以使用尽可能多的样本。
现有的方法将图像作为一个整体应用,并且不能将不同的参数应用于图像的不同部分,除非将图像分成不同的部分,然后再将它们拼接回去。除了上述优势外,该算法易于理解和实现。
在本文的后面,还将找到当前实现的性能。还附有使用现有图像和已知方法检测到的边缘进行的实验结果,以及与所提出的算法生成的结果的比较研究。
请注意,随附了一份Microsoft PowerPoint演示文稿,展示了更多的结果和比较。附件列表如下:
支持这种方法的Microsoft PowerPoint演示文稿
C#.NET实现算法的.NET程序集可执行文件
用于测试的一些示例图像
检查结果的一些要点:
打开显示空白表单的应用程序。
点击右侧的“加载”按钮。
选择一个测试图像(或任何图像),然后在选择对话框中点击确定。
调整滑块和/或选择策略,将参数传递给算法。
请注意,右下角的部分有60度的扫描线,这些是硬编码的。请致电/通知以制作自定义角度的部分图像。
点击生成以查看结果。
生成结果后,可以重新调整参数,然后再次点击“生成”按钮以刷新结果。
该应用程序是多线程的,每个算法配置在不同的线程上运行,用于3个不同的部分。
表单右侧(按钮下方)的数字是生成算法所需的毫秒数,每个部分都需要。