Python 在图像中查找拼字板的角点

Python 在图像中查找拼字板的角点,python,opencv,image-processing,computer-vision,Python,Opencv,Image Processing,Computer Vision,我试图提取拼字板上的瓷砖(字母)。目标是识别/阅读黑板上所有可能的单词 示例图像- 理想情况下,我希望找到拼字板的四个角,并应用透视变换进行进一步处理 透视变换后- 我使用的算法如下所示- 对拼字板的灰度图像应用自适应阈值。 放大/关闭图像,找到给定图像中的最大轮廓,然后找到凸包,并完全填充凸包包围的区域。 找到合成图像的边界点(轮廓),然后应用以获得角点,然后应用透视变换 发现角点- 这种方法适用于这样的图像。但是,正如你所看到的,许多方形板都有一个底部,顶部和底部都是弯曲的。有时,

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

示例图像-

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

透视变换后-

我使用的算法如下所示-

  • 对拼字板的灰度图像应用自适应阈值。

  • 放大/关闭图像,找到给定图像中的最大轮廓,然后找到凸包,并完全填充凸包包围的区域。

  • 找到合成图像的边界点(轮廓),然后应用以获得角点,然后应用透视变换

  • 发现角点-

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

    圆形底座板:

    使用上述方法发现的要点:

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

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

    我想陈述一些要点-

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

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

  • 我已经用openCV python实现了这个解决方案。因为这里的方法很重要,而且问题变得有点太长了,所以我没有发布相关代码

  • 如果需要的话,我也愿意分享更多这样有问题的图片。 谢谢大家!

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

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

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


    您可以试一试。

    我认为@消音器已经给出了非常有希望的解决方案

    但是,要执行透视变换,正如您所提到的,您已经尝试使用hough线来查找最大的矩形,但它失败了,因为对于当前的瓷砖


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

    您对删除非线性轮廓有何看法?@Dmitriz。我可以用什么技巧来做到这一点?我希望有办法消除这些曲线。尝试使用腐蚀和膨胀,但不能推广。必须有其他方法来做同样的事情。首先想到的是做你现在正在做的任何事情,尝试近似它(cv2.approxPolyDP),看看它是否是或多或少的矩形。如果没有-删除轮廓。检测直线是否为曲线也是可行的()我可以尝试检测曲线,但是否没有其他方法可以利用电路板的矩形来检测角点?我只想近似矩形的角点。这看起来很有希望。非常感谢。我将试一试。我只是有一个小小的疑问:MSER遗漏字母“I”有什么具体原因吗?可能的原因:(1)被
    MSER.setMinArea/MSER.setMaxArea
    过滤;(2) 按
    cv2.boundingRect
    的宽度/高度过滤。您应该尝试修改参数以调整图像。不幸的是,我没有大型图像数据集(带注释的数据集)、拼字板和相应的矩形边界点。哦,好的,我会考虑其他一些基于计算机视觉的传统方法。但如果有这样的数据集,那就太棒了。:)