2

使用GPUImage,我能够检测图像中书籍/页面的角落。但有时,它会通过超过 4 个点,在这种情况下,我需要从这些点中处理并找出最佳矩形。这是一个例子:

在此处输入图像描述

在这种情况下,找出最佳矩形的最有效方法是什么?谢谢

4

1 回答 1

6

如果您使用的是角点检测算法,则可以根据检测到的角点的相对强度过滤结果。相对于您当前背景的书角处的对比度似乎比在木纹中发现的点处的对比度要强得多。是否有与每个点相关的相对大小,或者你只是得到这些点?除非前景和背景的强度相对恒定,否则为边缘强度设置阈值可能意味着很多麻烦。

您的示例图像可能会模糊或变形。例如,对浅色像素进行正确的形态“关闭”可以消除木纹中的纹理,而不会影响书的大小和形状。(http://en.wikipedia.org/wiki/Mathematical_morphology)

另一种可能性是将图像缩小到更小的尺寸,然后对其进行检测。调整图像大小会消除微小的细节,例如当前检测到的任何木纹图案。

选择合适的镜头和照明可以使图像更容易处理。在处理之前尽量简化图像。如上所述,仅照亮书本边缘的“暗场”照明将呈现更简单的图像进行处理。写下约束可以更清楚地看出哪种解决方案最健壮和最容易实现。在图像的任何地方找到任何矩形都非常困难;如果矩形的大小至少为 100 x 100 像素,从正方形到图像边缘的旋转不超过 15 度等,则在深色背景上找到浅色矩形会容易得多。

更多涉及的解决方案可以分为两种方法:

  1. 仅使用给定的 4 个或更多 (x,y) 点来解决问题。
  2. 对样本图像完全使用不同的图像处理技术。

1. 只给定点求解程序 如果你通常只有 5 或 6 个点,并且如果你确信其中 4 个点属于你想要的矩形的角,那么你可以试试这个:

  1. 找到所有点的凸包。凸包是完全包含所有点的 N 边形。如果这些点是伸出的钉子,如果你在它们周围拉伸橡皮筋并让它卡入到位,那么橡皮筋的最终形状是一个凸包。找到凸包的算法通常会返回从最左下角逆时针排列的点列表。
  2. 制作点列表的副本并从副本中删除点,直到只剩下四个点。这四个剩余点仍将逆时针排列。
  3. 计算每组三个连续点形成的角度:点 1、2、3,然后是 2、3、4,然后是 3、4、1,依此类推。
  4. 如果角度超出合理的公差(小于 70 度或大于 110 度),则跳回第 2 步并删除下一个点(或一组点)。
  5. 存储每组 4 个点的最小和最大角度。
  6. 重复步骤 2 - 6,每次删除一个(或多个)不同的点。
  7. 跟踪最小和最大角度最接近 90 度的点集。

http://en.wikipedia.org/wiki/Convex_hull

还可以引入许多其他检查和约束。例如,如果凸包中 3 个连续点(点 N 到 N+1,以及 N+1 到 N+2)的点到点距离接近于书本的预期宽度和高度,那么您可能会将这些标记为已知的好点,并且只测试剩余的点以查看哪个是第四点。

如果你得到很多点,上面的技术可能会变得笨拙,但如果预计在凸包上找到两个或三个书角点,它可能会起作用。

对于任何几何问题,我总是建议查看 GeometricTools.com,它有很多很棒的优化源代码,可以解决各种问题。拥有这本书也非常方便,尤其是如果您可以使用 AddAll.com 找到便宜的副本。

http://www.geometrictools.com/

2. 示例图像的其他图像处理技术 虽然我可能是错的,但 GPUImage 似乎没有很多通用图像处理算法。其他一些图像处理算法可以使这个问题更容易解决。

虽然这里没有篇幅,但成功图像处理的关键之一是适当的照明。确保你的照明是一致的。均匀照亮书本和背景的漫射光效果很好。您可以使用更有趣的照明来简化问题:如果您有四个灯(或特殊的环形灯),您可以从顶部、底部、左侧和右侧提供水平照明,这将使书的边缘显得明亮和其他表面看起来很暗。 http://www.benderassoc.com/mic/lighting/nerlite/Darkfield.htm

如果您可以使用其他一些 GPU 库进行图像处理,那么以下技术之一可以很好地工作:

  1. 连接组件标签(又名查找 blob)。使用二进制阈值或分水岭算法将作为书的白色斑点与背景的其余部分分开应该不会太难。一旦确定了图书的 blob,就更容易找到角落。(http://en.wikipedia.org/wiki/Connected-component_labeling) 在 OpenCV 中,您可以找到“轮廓”。
  2. 生成一个边缘点列表,然后让四个单独的线拟合工具从上到下、从右到左、从下到上和从左到右搜索,以找到与书相关的四个强(且大部分是直的)边缘。但是,在您的示例图像中,书籍封面略微翘曲或相机镜头引入了桶形失真。
  3. 使用专为在深色背景上寻找亮角而设计的角检测器。如果您一直在寻找木纹背景的白皮书,您可以创建一个检测器来查找棕色背景上的白色角落。
  4. 使用霍夫技术找到图像中最强的四条线。(http://en.wikipedia.org/wiki/Hough_transform)

最有效的算法技术将取决于您的限制:您是否正在寻找仅具有特定大小的矩形?前景和背景之间的对比度是否一致?你能引入照明来简化图像的外观吗?等等。

于 2012-09-21T01:47:47.350 回答