65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (29投票s)

2010 年 12 月 8 日

CPOL

8分钟阅读

viewsIcon

89066

downloadIcon

14174

使用一维线性图像或扫描线(以1像素间隔采样,任意角度)在彩色图像中进行边缘检测的方法

1. 引言

本文讨论了一种适用于彩色或单色通用图像的边缘检测算法。该算法使用从输入图像生成的一维线/函数/纹理/图像来查找图像中的边缘。

与某些已知方法生成的结果相比,此方法标记出了一些以前未见的边缘。该算法是自适应的且可参数化,允许增加或减少细节和容差的范围。这提供了一种更精确地细化图像边缘的直接方法。

参数大多是视觉上可观察的,基于人类心理感知(即角度、颜色密度、减法策略和细节),而不是现有的数学变换的客观和量化方法。

由于该算法不使用繁重的矩阵计算/变换,因此性能更优。该算法是渐进的,因为它可用于噪声信号。它也可以在渐进加载或部分接收的图像中使用。该算法可以处理尽可能少或尽可能多的可用线性样本。

现有方法应用于整个图像,无法对图像的不同部分应用不同的参数,除非将图像分割成不同部分然后重新拼接。

除了上述优点之外,它还易于理解和实现。

本文后面还将介绍我当前实现的性能。此外,还附带了使用现有图像和已知方法检测到的边缘进行的实验结果,以及与建议算法生成的结果进行的比较研究。

2. 背景

边缘检测是指识别和定位图像中锐利不连续性的过程。不连续性是像素强度突然变化,这构成了场景中物体边界的特征。经典的边缘检测方法涉及将图像与一个算子(2D滤波器)进行卷积,该算子被构建为对图像中的大梯度敏感,而在均匀区域返回零值。

现有方法使用一个称为核的 NxN 矩阵来判断一个点是否属于潜在边缘。通常情况下,N=3,矩阵中的单元格数为9。因此,矩阵运算的性能成本很高。而且,随着 N 的值增加到 4、5 或更高,计算变得更加复杂,首次通过结果的时间也持续增加。

许多现有方法建议使用降噪滤波器作为边缘检测的前提,从而增加了图像处理中的一个额外步骤。

3. 它是如何工作的

我们在这里需要一些东西

  • 不同的颜色减法方法
  • 通用线采样器 – 用于在任意角度创建一维图像
  • 为不同的边缘检测策略定制的数据结构

1. 颜色减法算法,用于计算任意两种颜色之间的相对差异

此距离用于识别两个颜色之间的 RGB 颜色差异。差异越大,像素对被检测为边缘点对的可能性就越大。稍后在本文件中,将清楚地看到,两种不同的策略如何依赖于颜色差异来建议可能的边缘。

建议的边缘检测方法允许选择几种颜色减法方法作为参数。这些颜色减法方法如下讨论。

  1. 欧几里得距离(差值),将颜色视为一个假设的 3D 空间。

    Fast_EdgeDetection/0.JPG

  2. 有时,不同颜色分量的饱和度会产生更好的结果。例如,在那些使用了红色滤光片进行图像采集,并且图像主要包含红色而不是绿色或蓝色的图像中,这一点更为明显。

    差值 = MAX(r1, g1, b1) – MAX(r2, g2, b2)

  3. 对于灰度图像,其中 r=g=b。然后使用一个称为亮度的特定值来

    亮度1 = 0.3 * r1 + 0.59 * g1 + 0.11 * b1

    因此,差值 = 亮度1 – 亮度2

2. 线采样

在这种情况下,二维矩形图像被分割或分解为一维图像列表。在此需要注意的是,一维图像列表、扫描线或一维纹理将覆盖整个图像。

这里使用标准的线生成算法在起点和终点之间生成走线点。另外需要提到的是,有时由走线方法生成的点的数量可能少于起点和终点之间的距离。在这种情况下,会在生成的点列表中以相等的间隔添加额外的点,以便于近似像素位置。

以下是扫描线位置的示例。为便于理解,示例中的扫描线间隔较大。然而,在实际计算中,线是精确接触的(它们之间的距离为0像素)。

Fast_EdgeDetection/1.JPG

3. 为不同的边缘检测策略定制的数据结构

这里也使用了两种不同的策略。这两种策略都已知会产生不同的结果,并在不同情况下具有优势。它们在此与流程图一起讨论。

  1. 使用用户指定的参数标记每条扫描线上的“最大边缘”。在此策略中,将最大 N 个像素对颜色差值存储在数据结构中。例如,对于某个特定扫描线,如果 maxEdges = 5,则数据结构将返回 5 个差值最大的像素对边缘点,建议可能的边缘。下面是一个简单的流程图。

      Fast_EdgeDetection/2.png

  2. +/- 堆栈用作替代策略,在某些情况下很有益。如果 edgePoint 为正(第 n 个和第 (n+1) 个边缘点之间的颜色差值为正),则将像素对推入堆栈。同样,所有正 edgePoints 都将推入堆栈,直到检测到负 edgePoint。当找到一个“负”像素对颜色差值时,将弹出所有正 edgePoints,直到在堆栈上找到另一个负 edgePoint。紧接着,当前的“负”edgePoint 和最后一个弹出的“正”edgePoint 将添加到 edgePoints 的内部列表中,从而向列表中添加 2 个 edgePoints

上述方法适用于正像素对颜色差值(边缘点)。对于“负”edgePoints,将采取完全相同的方法。

在整个线扫描结束时,堆栈中剩余的条目将被清除并忽略。在查询 edgePoints 时,将返回遇到的已保存 edgePoints 的内部列表。

下面给出了上述方法流程图的简单框图。

               Fast_EdgeDetection/3.png

4. 使用该应用程序

一些有用的要点

与某些已知方法生成的结果相比,此方法标记出了一些以前未见的边缘。该算法是自适应的且可参数化,允许增加或减少细节和容差的范围。这提供了一种更精确地细化图像边缘的直接方法。

参数大多是视觉上可观察的,基于人类心理感知(即角度、颜色密度、减法策略和细节),而不是现有的数学变换的客观和量化方法。

由于该算法不使用繁重的矩阵计算/变换,因此性能更优。该算法是渐进的,因为它可用于噪声信号。它也可以在渐进加载或部分接收的图像中使用。该算法可以处理尽可能少或尽可能多的可用线性样本。

现有方法应用于整个图像,无法对图像的不同部分应用不同的参数,除非将图像分割成不同部分然后重新拼接。

除了上述优点之外,它还易于理解和实现。

本文后面还将介绍我当前实现的性能。此外,还附带了使用现有图像和已知方法检测到的边缘进行的实验结果,以及与建议算法生成的结果进行的比较研究。

请注意,随本文一起,我附带了一个 Microsoft PowerPoint 演示文稿,其中显示了更多结果和比较。这是附件列表:

  • 支持该方法的 Microsoft PowerPoint 演示文稿
  • 该算法的 C#.NET 实现,包含一个 .NET 程序集可执行文件
  • 用于测试的一些示例图像

需要注意的一些检查结果的要点

  1. 打开显示空白窗体的应用程序。
  2. 点击右侧的“加载”按钮。
  3. 选择测试图像之一(或任何图像),然后点击选择对话框上的“确定”。
  4. 调整滑块和/或选择策略,将参数传递给算法。
  5. 请注意,右下角部分有硬编码的 60 度扫描线。请致电/通知我以制作自定义角度的图像片段。
  6. 点击“生成”以查看结果。
  7. 结果生成后,可以重新调整参数并再次点击“生成”按钮来刷新结果。
  8. 该应用程序是多线程的,每个算法配置都在不同的线程上为 3 个不同的片段运行。
  9. 窗体右侧(按钮下方)显示的数字是为每个片段生成算法所需的毫秒数。

5. 示例

Fast_EdgeDetection/4.JPG

Fast_EdgeDetection/5.JPG

历史

  • 2010 年 12 月 8 日:初始发布
© . All rights reserved.