【问题标题】:Finding Corner points of Scrabble Board in an image在图像中查找拼字板的角点
【发布时间】:2018-06-06 14:47:45
【问题描述】:

我正在尝试提取放在拼字板上的瓷砖(字母)。目标是识别/阅读板上所有可能的单词。

示例图片 -

理想情况下,我想找到拼字板的四个角,并应用透视变换,以进行进一步处理。

透视变换后 -

我使用的算法如下 -

  1. 将自适应阈值应用于拼字游戏板的灰度图像。

  2. 扩张/关闭图像,在给定图像中找到最大轮廓,然后找到凸包,并完全填充凸包所包围的区域。

  3. 找到结果图像的边界点(轮廓),然后应用Contour approximation得到角点,然后应用透视变换

找到角点 -

这种方法适用于此类图像。但是,正如您所看到的,许多方板都有一个底座,该底座在顶部和底部都是弯曲的。有时,底座是一个大圆形板。有了这些图像,我的方法就失败了。示例图像和输出 -

圆形底座板:

使用上述方法找到的点:

我可以发布更多此类有问题的图片,但这张图片应该让您了解我正在处理的问题。我的问题是——

如果图像中还存在圆形板,我如何找到矩形板?

我想说的几点 -

  1. 我尝试使用霍夫线来检测图像中的线条,找到最大的垂直线,然后找到它们的交点来检测角点。不幸的是,由于瓷砖,所有线路似乎都被扭曲/断开,因此我的尝试失败了。

  2. 我还尝试将轮廓近似应用于图像中找到的所有轮廓(我假设大矩形也将是轮廓),但该方法也失败了。

  3. 我已经在 openCV-python 中实现了该解决方案。由于方法在这里很重要,而且问题变得有点太长了,所以我没有发布相关代码。

如果需要,我也愿意分享更多此类有问题的图像。 谢谢!

EDIT1 @Silencer 的回答对我识别图像中的字母很有帮助,但我想准确地找到图像中单词的位置。因此,我觉得识别行和列是必要的,并且只有在对板应用透视变换时才能做到这一点。

【问题讨论】:

  • 你如何看待去除非线性轮廓?
  • @DmitriiZ。我可以使用什么技术来做到这一点?我希望有一些方法可以消除曲线。尝试使用腐蚀后膨胀,但它只是没有概括。必须有其他方法可以做到这一点。
  • 首先想到的是做你现在正在做的任何事情,尝试近似它(cv2.approxPolyDP),看看它是否或多或少是矩形的。如果不是 - 删除轮廓。检测线是否为曲线也应该是可行的(mathworks.com/matlabcentral/answers/…
  • 我可以尝试检测曲线,但没有其他方法可以利用电路板的矩形来检测拐角吗?我只是想近似矩形的角点。

标签: python opencv image-processing computer-vision


【解决方案1】:

我写了一篇关于MSER文本检测的答案:

Trying to Plot OpenCV's MSER regions using matplotlib

代码在您的图像上生成以下结果。

你可以试试。

【讨论】:

  • 这看起来很有希望。谢谢!我会试一试。
  • 我只是有一个小小的疑问:MSER 错过了字母“I”是否有任何具体原因?
  • 可能原因:(1)被mser.setMinArea/mser.setMaxArea过滤; (2) 按cv2.boundingRect 的宽度/高度过滤。您应该尝试修改参数以调整图像。
【解决方案2】:

我认为@silencer 已经给出了非常有前景的解决方案。

但是要执行透视变换,正如您所提到的,您已经尝试使用霍夫线来找到最大的矩形,但由于存在瓷砖而失败。

鉴于您的大型图像数据集可能超过 1000 张图像,您还可以尝试基于深度学习的方法,在该方法中,您可以使用图像作为输入和相应的矩形边界点坐标作为输出来训练模型。

【讨论】:

  • 不幸的是,我 没有有一个大的图像数据集(注释数据集),拼字板和相应的矩形边界点。
  • 哦,好吧,我会想到一些其他传统的基于计算机视觉的方法
  • 当然。但如果有这样的数据集,那就太好了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2017-09-25
  • 2020-02-12
相关资源
最近更新 更多