2

使用GPUImage的数组,我能够检测到图像中的书/页的角落。但有时,它会超过4点,在这种情况下,我需要处理并找出这些点中最好的矩形。这里有一个例子:获取矩形出点

什么是弄清楚在这种情况下,最好矩形的最有效方法是什么? 感谢

+0

我想知道是否可以使用打开或关闭操作作为第一步,以消除它检测到的一些小尺寸功能。您也可以使用角点检测器以较低的分辨率处理图像,以仅挑出较大尺寸的特征。这不会完全消除多余的点,但它可能会有所帮助。 –

+0

嗨0xSina,我也想用GPUImage做同样的事情(检测图像中的书/页面的角落)。你是怎么做到的?你使用了哪个过滤器? – iKT

+0

@IOSDev我在GPUImage中使用了几个过滤器的混合结果,所以我使用openCV。 – 0xSina

回答

5

如果您使用的是角点检测算法,那么你就可以根据检测出的弯道的相对强度来筛选结果。相对于当前背景的书角的对比度似乎比木纹中的对比度强得多。是否有与每个点相关的相对量级,还是只有点数?除非前景和背景的强度相对恒定,否则设置边缘强度的阈值可能意味着很多摆弄。

你的样本图像可以被模糊或演变。例如,对光像素进行正确的形态学“关闭”可以消除木纹中的纹理,而不会影响书的大小和形状。 (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

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

如果您获得了不少的几点,上面的技巧可能会变得很难处理,但如果预计在凸包上找到两三本书角点,它可能会奏效。

对于任何几何问题,我总是建议检查一下GeometricTools.com,它有许多伟大的优化的源代码用于各种问题。这本书也非常方便,特别是如果你可以使用AddAll.com找到便宜的副本。

http://www.geometrictools.com/

2.为您的样品图像 其他图像处理技术,虽然我可能是错的,看来GPUImage没有许多通用图像处理算法。其他一些图像处理算法可能使这个问题更容易解决。

尽管在这里没有空间进入它,成功的图像处理的关键之一是适当的照明。确保你的照明是一致的。均匀照亮书本和背景的漫射光线可以很好地工作。您可以使用更好的照明来简化问题:如果您有四盏灯(或特殊的环形灯),则可以从上,下,左和右提供水平照明,使书本的边缘看起来明亮,其他表面看起来很黑。 http://www.benderassoc.com/mic/lighting/nerlite/Darkfield.htm

如果你可以使用一些其他的GPU库做图像处理,那么下列方法之一可以很好地工作:

  1. 连通区域标记(又名发现斑点)。使用二进制阈值或分水岭算法来分离书中的白色斑点与背景的其余部分是不应该太难的。一旦确定了该书的一团,找到角落更容易。 (http://en.wikipedia.org/wiki/Connected-component_labeling)在OpenCV中,您可以找到“轮廓”。
  2. 生成边缘点列表,然后使用四个单独的线条拟合工具从上到下,从右到左,从下到上搜索,从左到右搜索与边缘点相关的四个强(大部分是直线)边书。不过,在您的示例图像中,书籍封面稍有扭曲或相机镜头引入了桶形失真。
  3. 使用设计用于在深色背景上查找灯角的角落探测器。如果您一直在寻找木纹背景上的白皮书,您可以创建一个探测器来查找棕色背景上的白色边角。
  4. 使用霍夫技术来找到图像中最强的四条线。 (http://en.wikipedia.org/wiki/Hough_transform)

效果最好的算法技术将取决于您的约束:您是否在寻找只有一定大小的矩形?前景与背景的对比是否一致?你可以引入照明来简化图像的外观吗?等等。

+2

感谢您的详细解答。 – 0xSina

+0

有没有人有与此问题有关的**源代码**? – HeTzi