进行 OCR 之前的预处理(tesseract、OpenCV)

Posted

技术标签:

【中文标题】进行 OCR 之前的预处理(tesseract、OpenCV)【英文标题】:Preprocessing before doing OCR (tesseract, OpenCV) 【发布时间】:2015-06-14 12:48:14 【问题描述】:

为了使用 OCR 库 tesseract 获得更好的结果,我会进行一些预处理,但不知道哪些步骤可以帮助我。

我尝试使用因子 15 调整图像大小并应用了调整的阈值(请参阅图像),但这会导致“波浪”字符,无法使用 tesseract OCR 库检测到。在底部,您可以通过 Dropbox 找到我的图片链接。原图尺寸115x18px,字高10px。

我想从背景中提取字符。哪些步骤可以带来更好的结果?我应该为 OCR 部分使用另一个 OCR 库而不是 tesseract 吗?在使用 tesseract 进行文本检测时,您一般有哪些经验?或者您更喜欢其他库还是商业库?

Dropbox Link to example image

19.6.15 更新:

OTSU 阈值作为自适应阈值可提供更好的结果。将在接下来的几天内提供有关其他答案的更新!

更新 01.07.2015 有另一个示例图像,其中序列号应使用 tesseract 识别。由于字体很小,识别结果不是很好。有什么想法可以在这里提供帮助吗?

【问题讨论】:

试试看霍夫变换函数 这里有一些脚本可能有用。 fmwconcepts.com/imagemagick 【参考方案1】:

Otsu 阈值在这里给了我更好的结果。结合距离变换和另一个阈值,我什至得到了tesseract 几乎可以识别的东西。

这是我得到的结果:

6ANFK9PC)100'0-GT

【讨论】:

能否提供您使用的 openCV 函数“distanceTransform¶”的使用属性? 我这里实际上并没有使用opencv,但我想它应该不是非常关键的参数。我的实现是在 python/numpy/skimage 中。距离变换后的重要部分是我做了另一个只有白色像素的大津阈值,而不是整个变换后的图像。但是您可以尝试其他骨架化技术或简单地侵蚀/最小过滤器 在我尝试过你的建议之后,我可以说,由于计算时间的原因,我不能使用复杂的距离变换。不幸的是,在我的情况下,应用 OTSU 阈值并使用二进制图像作为 tesseract 的输入并不能带来更好的识别。【参考方案2】:

为什么不只是“锐化”(这将去除白色边框并细化白线)然后简单地反转黑白?

【讨论】:

【参考方案3】:

您可能想在第二张图像上尝试少量的腐蚀和膨胀,这可能会消除角色中的一些波浪,腐蚀/膨胀的混合还会消除它们周围的小白点,这总是有助于 OCR。

查看this OpenCV 文档,该文档将为您提供一些示例代码以帮助您入门并解释其工作原理。

希望这会有所帮助。

【讨论】:

好的,谢谢,我会看看这个然后报告我的结果。【参考方案4】:

您可以尝试查找所有轮廓并删除小面积的轮廓。 处理“wevy”字符可能更复杂。我现在唯一的想法是使用距离变换和阈值处理(使用二进制阈值)结果(找到好的阈值可能并不简单——我会尝试使用归一化距离变换的 maxValue*0.25)。

【讨论】:

好的,感谢您的评论。作为信息,第二张图片(阈值图片)只是我自己处理原始图像的建议,但正如您所见,结果是“wevy”字符。所以我也很感兴趣,如果有处理步骤可以更好地从原始图像中提取字符,尽管原始图像的质量不是那么好。

以上是关于进行 OCR 之前的预处理(tesseract、OpenCV)的主要内容,如果未能解决你的问题,请参考以下文章

如何提高tesseract的OCR结果

如何使用 tesseract 对文档中的多个列进行 OCR

使用 OpenCV 为 Tesseract OCR 预处理七段图像

关于Tesseract-OCR的使用,救啊该怎么处理

Windows下使用Tesseract进行OCR文字识别

python(pillow /tesseract-ocr/pytesseract)安装介绍