使用OpenCV OCR进行图像锐化

6
我一直在尝试编写一个图像处理脚本/OCR,它可以让我从下面图片中的方框中提取字母(使用tesseract)。经过大量处理,我能够使图片看起来像这样。为了去除噪声,我反转了图片,接着进行了泛洪和高斯模糊处理以去除噪声。接下来通过一些阈值和腐蚀处理来去除噪声(腐蚀是扭曲文本的步骤),最终得到了下面这张图片。这个结果非常好,可以通过tesseract获得相当准确的结果,但有时会因为将#读作H或W而失败。我的问题是:有没有一种方法可以使用opencv、skimage、PIL(最好是opencv)来锐化这个图像,以增加tesseract正确读取图像的机会?或者有没有一种方法可以从第三张图片到最后一张图片,而不必使用扭曲图像的腐蚀处理?任何帮助都将不胜感激!

我添加了一些导致我所指的失真的关键步骤:) - JamesLLee
1
可能是图像处理和字符提取的重复问题。 - karlphillip
我已经逐步演示了如何在这个答案中实现此操作。 - karlphillip
谢谢Karl,这看起来非常有用,尽管我在C++方面几乎是文盲(我使用Python):) - JamesLLee
@karlphillip,你之前发布的矩形检测有没有Python示例?如果有任何线索,我会非常感激。谢谢。 - JamesLLee
显示剩余2条评论
1个回答

4
OpenCV有像filter2D这样的函数,可以将任意卷积核与给定图像卷积。特别是您可以使用用于图像锐化的卷积核。主要问题是这是否会改善OCR库的结果。图像已经非常清晰,图像中的噪声不是模糊的结果。我从未自己使用过teseract,但我相当确定它已经完成了所有可能的降噪工作。在这个过程中“帮助”他实际上可能会产生相反的效果。例如,任何锐化过程都倾向于放大噪声(与通常模糊图像的降噪过程相反)。大多数计算机视觉库在提供原始(未经处理的)图像时会产生更好的结果。

编辑(问题更新后): 有多种方法可以实现。我首先要测试的是这个:你的第一个二进制图像非常干净和清晰。不要使用降低字母质量的形态学操作,而是切换到过滤轮廓。使用 findContours 函数在图像中找到所有轮廓并存储它们的层次结构(即哪个轮廓位于哪个轮廓之内)。实际上,您只需要找到第一级和第二级的轮廓,即每个字母的外部和内部轮廓(零级轮廓是最外层的轮廓)。其他轮廓可以被丢弃。在属于第一级的轮廓中,您可以丢弃那些边界框太小而无法成为真正字母的轮廓。经过这两个丢弃过程,我预计剩下的大多数轮廓都是字母的一部分。在白色图像上绘制它们并运行 OCR。(如果您想要黑色背景上的白色字母,则需要反转轮廓中顶点的顺序)。


谢谢您的回复,Michael!我更新了原帖,加入了一些步骤,以便更清楚地说明导致文本失真的原因。最终导致图像中文本失真的是第三张图像的腐蚀,以达到第四张图像的效果。也许有其他替代工具可以实现相同的效果吗?谢谢! - JamesLLee
感谢更新。我不确定该如何隔离第一和第二级轮廓,但希望快速的谷歌搜索能给我带来些好处。非常感谢您的建议! - JamesLLee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接