【问题标题】:Detecting a corner of an object on a picture检测图片上物体的一角
【发布时间】:2017-04-06 10:25:02
【问题描述】:

是否有任何算法可以检测图片上物体的角点?我有一个看起来像这样的图片列表:

左上角

右下角

现在在图 1 上,我期望在左上角,在图 2 上,我期望在右下角,等等。

我需要的算法应该“确保”图片上的图像绝对是左上角/右下角/等(不仅仅是噪音,例如下图)如果是 - 返回角的 X 和 Y。

另一个问题是图片上可能会有一些噪点,就像右下角的图片一样。还有一个问题是角落的图片可以稍微旋转一下。

略微旋转的角

UPD我还应该确保图像是我期望的角落的图片,因为图像可能看起来像这样:

噪音

【问题讨论】:

    标签: c# image-processing


    【解决方案1】:

    我将从图像的角落开始,然后遍历像素以找到最接近角落的白色像素。然后当你找到一个白色像素时,使用洪水填充算法来计算你看到的连续白色像素的数量。如果此像素数高于您的噪声阈值(可能是 20 像素?),则将此像素视为您的角落。这应该可以处理稍微旋转的图像。

    【讨论】:

    • 我怎样才能确保图片上的图像是我期望的角落?如果图片看起来像问题中的最后一张怎么办?
    • 如果图像中的噪点与新添加的图像一样糟糕,那么这是一个完全不同的问题。您应该提出一个新问题,即如何将数据与噪音隔离开来。
    【解决方案2】:

    您可以考虑使用二维互相关算法。图像互相关通过找到两个图像彼此最佳匹配(或相关)的重叠点(x,y 值)来工作(Wikipedia--cross correlation)。考虑到您正在寻找一个角落,您可以将一个简单的框与您的原始图像相关联。如下图:

    然后将框(右图上方)与原始框(左图上方)相关联,以找到最佳重叠点。如下所示:

    请注意,上图中的轴已扩展,以显示整个移位的框图像。我的互相关返回了 x=-87 y=63 的偏移值。这意味着当我将框移动这些值时,它最好与原始图像重叠。 这些偏移值也对应于您正在寻找的角落!只需将 x 方向的偏移 (-87) 添加到图像中的行数即可。因此角点位于/接近点 x=152 y=63 像素。

    还请注意,您可以通过在频域中执行互相关来大大加快此算法的速度 (Wikipedia -- Convolution theorem)

    【讨论】:

    • 嗨,亚历克斯,感谢您的帮助。该算法是否适用于略微旋转的角落图像?
    • 我的算法不适用于您提供的旋转图像。我发布了另一个答案(见上文)。让我知道这是否会产生更好的结果。这只是对@David 建议的轻微修改。
    【解决方案3】:

    我认为@Davids 答案的核心更强大,如果您所追求的角落可以旋转。然而,与其使用泛洪填充算法来确定角点,不如执行低通滤波器会更好。我将首先概述该过程,然后解释为什么它可能是一个更好的选择。

    从您的原始图像开始(下图的左上面板),并通过将其与相同维度的 2D 高斯卷积进行过滤。我用 sigma=5 构建了我的高斯分布,并将结果绘制在下面的右上角面板中。低通滤波采用二进制图像(由 0 和 1 或黑白像素组成)并在周围像素上平滑这些值。因此,被黑色像素包围的白色像素的值将低于其他白色像素附近的白色像素。现在您可以设置阈值并仅选择高于阈值的值(左下面板 - 高于阈值的值显示为绿色)。现在您可以使用@Davids 建议并找到从图像的最左上角到阈值以上的点的最短距离。最短的距离应该是你要找的角落。

    现在我建议使用低通滤波器的原因是,如果您对您提供的 noisy 图像执行类似的平滑操作并使用相同的阈值,您将获得等于或非常接近 0 的距离。请参阅下面:

    现在可以很容易地放置任意数量的条件来确定图像是否值得在其中找到角点。例如,您可以设置一个条件为高于阈值的绿色像素的总面积,确定最小距离你角落,等等......你当然必须建立你的高斯低通滤波器并适当地选择你的阈值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2022-01-18
      • 2017-02-23
      • 2016-08-24
      相关资源
      最近更新 更多