彩色图像边缘检测方法,使用一维线性图像






4.93/5 (29投票s)
使用一维线性图像或扫描线(以1像素间隔采样,任意角度)在彩色图像中进行边缘检测的方法
1. 引言
本文讨论了一种适用于彩色或单色通用图像的边缘检测算法。该算法使用从输入图像生成的一维线/函数/纹理/图像来查找图像中的边缘。
与某些已知方法生成的结果相比,此方法标记出了一些以前未见的边缘。该算法是自适应的且可参数化,允许增加或减少细节和容差的范围。这提供了一种更精确地细化图像边缘的直接方法。
参数大多是视觉上可观察的,基于人类心理感知(即角度、颜色密度、减法策略和细节),而不是现有的数学变换的客观和量化方法。
由于该算法不使用繁重的矩阵计算/变换,因此性能更优。该算法是渐进的,因为它可用于噪声信号。它也可以在渐进加载或部分接收的图像中使用。该算法可以处理尽可能少或尽可能多的可用线性样本。
现有方法应用于整个图像,无法对图像的不同部分应用不同的参数,除非将图像分割成不同部分然后重新拼接。
除了上述优点之外,它还易于理解和实现。
本文后面还将介绍我当前实现的性能。此外,还附带了使用现有图像和已知方法检测到的边缘进行的实验结果,以及与建议算法生成的结果进行的比较研究。
2. 背景
边缘检测是指识别和定位图像中锐利不连续性的过程。不连续性是像素强度突然变化,这构成了场景中物体边界的特征。经典的边缘检测方法涉及将图像与一个算子(2D滤波器)进行卷积,该算子被构建为对图像中的大梯度敏感,而在均匀区域返回零值。
现有方法使用一个称为核的 NxN 矩阵来判断一个点是否属于潜在边缘。通常情况下,N=3,矩阵中的单元格数为9。因此,矩阵运算的性能成本很高。而且,随着 N 的值增加到 4、5 或更高,计算变得更加复杂,首次通过结果的时间也持续增加。
许多现有方法建议使用降噪滤波器作为边缘检测的前提,从而增加了图像处理中的一个额外步骤。
3. 它是如何工作的
我们在这里需要一些东西
- 不同的颜色减法方法
- 通用线采样器 – 用于在任意角度创建一维图像
- 为不同的边缘检测策略定制的数据结构
1. 颜色减法算法,用于计算任意两种颜色之间的相对差异
此距离用于识别两个颜色之间的 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. 线采样
在这种情况下,二维矩形图像被分割或分解为一维图像列表。在此需要注意的是,一维图像列表、扫描线或一维纹理将覆盖整个图像。
这里使用标准的线生成算法在起点和终点之间生成走线点。另外需要提到的是,有时由走线方法生成的点的数量可能少于起点和终点之间的距离。在这种情况下,会在生成的点列表中以相等的间隔添加额外的点,以便于近似像素位置。
以下是扫描线位置的示例。为便于理解,示例中的扫描线间隔较大。然而,在实际计算中,线是精确接触的(它们之间的距离为0像素)。
3. 为不同的边缘检测策略定制的数据结构
这里也使用了两种不同的策略。这两种策略都已知会产生不同的结果,并在不同情况下具有优势。它们在此与流程图一起讨论。
- 使用用户指定的参数标记每条扫描线上的“最大边缘”。在此策略中,将最大 N 个像素对颜色差值存储在数据结构中。例如,对于某个特定扫描线,如果
maxEdges = 5
,则数据结构将返回 5 个差值最大的像素对边缘点,建议可能的边缘。下面是一个简单的流程图。 - +/- 堆栈用作替代策略,在某些情况下很有益。如果
edgePoint
为正(第 n 个和第 (n+1) 个边缘点之间的颜色差值为正),则将像素对推入堆栈。同样,所有正edgePoints
都将推入堆栈,直到检测到负edgePoint
。当找到一个“负”像素对颜色差值时,将弹出所有正edgePoints
,直到在堆栈上找到另一个负edgePoint
。紧接着,当前的“负”edgePoint
和最后一个弹出的“正”edgePoint
将添加到edgePoints
的内部列表中,从而向列表中添加 2 个edgePoints
。
上述方法适用于正像素对颜色差值(边缘点)。对于“负”edgePoints
,将采取完全相同的方法。
在整个线扫描结束时,堆栈中剩余的条目将被清除并忽略。在查询 edgePoints
时,将返回遇到的已保存 edgePoints
的内部列表。
下面给出了上述方法流程图的简单框图。
4. 使用该应用程序
一些有用的要点
与某些已知方法生成的结果相比,此方法标记出了一些以前未见的边缘。该算法是自适应的且可参数化,允许增加或减少细节和容差的范围。这提供了一种更精确地细化图像边缘的直接方法。
参数大多是视觉上可观察的,基于人类心理感知(即角度、颜色密度、减法策略和细节),而不是现有的数学变换的客观和量化方法。
由于该算法不使用繁重的矩阵计算/变换,因此性能更优。该算法是渐进的,因为它可用于噪声信号。它也可以在渐进加载或部分接收的图像中使用。该算法可以处理尽可能少或尽可能多的可用线性样本。
现有方法应用于整个图像,无法对图像的不同部分应用不同的参数,除非将图像分割成不同部分然后重新拼接。
除了上述优点之外,它还易于理解和实现。
本文后面还将介绍我当前实现的性能。此外,还附带了使用现有图像和已知方法检测到的边缘进行的实验结果,以及与建议算法生成的结果进行的比较研究。
请注意,随本文一起,我附带了一个 Microsoft PowerPoint 演示文稿,其中显示了更多结果和比较。这是附件列表:
- 支持该方法的 Microsoft PowerPoint 演示文稿
- 该算法的 C#.NET 实现,包含一个 .NET 程序集可执行文件
- 用于测试的一些示例图像
需要注意的一些检查结果的要点
- 打开显示空白窗体的应用程序。
- 点击右侧的“加载”按钮。
- 选择测试图像之一(或任何图像),然后点击选择对话框上的“确定”。
- 调整滑块和/或选择策略,将参数传递给算法。
- 请注意,右下角部分有硬编码的 60 度扫描线。请致电/通知我以制作自定义角度的图像片段。
- 点击“生成”以查看结果。
- 结果生成后,可以重新调整参数并再次点击“生成”按钮来刷新结果。
- 该应用程序是多线程的,每个算法配置都在不同的线程上为 3 个不同的片段运行。
- 窗体右侧(按钮下方)显示的数字是为每个片段生成算法所需的毫秒数。
5. 示例
历史
- 2010 年 12 月 8 日:初始发布