【问题标题】:Sharpening image using OpenCV OCR使用 OpenCV OCR 锐化图像
【发布时间】:2014-01-14 09:56:15
【问题描述】:

我一直在尝试编写一个图像处理脚本 /OCR,它允许我从下图中的框中提取字母(使用 tesseract)。

经过大量处理,我能够让图片看起来像这样

为了去除噪点,我将图像反转,然后进行泛洪填充和高斯模糊以去除噪点。这就是我接下来要做的。

在运行它通过一些阈值和侵蚀以消除噪声(侵蚀是扭曲文本的步骤)之后,我能够在通过 tesseract 运行它之前让图像看起来像这样

这虽然是一个非常好的渲染,但可以通过 tesseract 获得相当准确的结果。虽然它有时会失败,因为它将哈希 (#) 读取为 H 或 W。这引出了我的问题!

有没有办法使用 opencv、skimage、PIL(最好是 opencv)我可以锐化这个图像,以增加我正确读取图像的 tesseract 的机会?或者有没有一种方法可以让我从第三张图像到最终图像,而不必使用最终扭曲图像中文本的腐蚀。

任何帮助将不胜感激!

【问题讨论】:

  • 你能分享一下你已经做了哪些预处理吗?
  • 我添加了一些导致我所指的失真的关键步骤:)
  • 我已经在this answer上一步一步地演示了如何实现这一点。
  • 感谢 Karl,这看起来非常有用,尽管我在 C++ 方面几乎是文盲(我使用了 python):)

标签: opencv ocr tesseract


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,迈克尔!我用更多步骤更新了原始帖子,这些步骤可能会澄清导致文本失真的原因。最终扭曲图像中文本的是第三图像的侵蚀,以便获得第四图像。是否可以使用替代工具来获得相同的效果?谢谢!
  • 感谢您的更新。我不确定我将如何隔离第一级和第二级轮廓,但希望一些快速的谷歌搜索会对我有所帮助。非常感谢您的建议!
猜你喜欢
  • 2023-03-06
  • 2011-06-26
  • 2013-11-22
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多