首页 > 解决方案 > Tesseract 是否在内部进行图像大小调整?

问题描述

OpenCv 不读取图像的元数据。因此,我们无法获得图像的 dpi。当有人在stackoverflow中询问dpi相关的ocr问题时,

大多数答案都说我们不需要DPI。我们只需要一个像素大小。

更改图像 DPI 以与 tesseract 一起使用

在 OpenCV 中更改图像的 dpi

在某些地方,没有人询问 dpi 并且需要提高 OCR 准确性,有人提出将 DPI 设置为 300 将提高准确性的想法。

Tesseract OCR 如何改进结果?

识别屏幕截图中字符的最佳方法?

还有一件事是,Tesseract 在他们的官方页面上说

Tesseract 在 DPI 至少为 300 dpi 的图像上效果最好,因此调整图像大小可能是有益的。

经过一些谷歌搜索,我发现了以下内容。

  1. 我们无法根据高度和宽度来判断图像分辨率
  2. 我们希望图像分辨率足够高以支持准确的 OCR。
  3. 字体大小通常表示单位长度,而不是像素,例如如果我们有 72 个点,我们有 1 英寸。字体大小 12pt 表示 1/6 英寸。
  4. 当我们有 300 ppi 图像和 12pt 字体大小的文本时,文本像素大小为 300 1/6 = 50 像素。如果我们有 60 ppi,那么文本像素大小为 60 1/6 =10 像素。

下面引用的一个来自 tesseract 官方页面。 是否有最小/最大文本大小?(它不会读取屏幕文本!)

为了合理的准确性,有一个最小的文本大小。您必须考虑分辨率和点大小。精度下降到 10pt x 300dpi 以下,迅速低于 8pt x 300dpi。快速检查是计算字符 x 高度的像素。(X 高度是小写 x 的高度。)在 10pt x 300dpi 时,x 高度通常约为 20 像素,尽管这可能因字体而异。低于 10 像素的 x 高度,您几乎没有机会获得准确的结果,低于大约 8 像素,大部分文本将被“去除噪点”。

使用 LSTM,最大 x 高度似乎也在 30 px 左右。除此之外,Tesseract 不会产生准确的结果。旧版引擎似乎不太容易出现这种情况(请参阅https://groups.google.com/forum/#!msg/tesseract-ocr/Wdh_JJwnw94/24JHDYQbBQAJ)。

从这些事情中,我得出了一个解决方案,即我们需要一个 10 到 12 pt 字体大小的文本用于 OCR。这意味着如果我们有 120 ppi(每英寸像素),那么我们需要 20 像素大小的高度。如果我们有 300 ppi,那么我们需要一个 50 像素的文本高度。


  1. 如果 Opencv 不读取 dpi 信息。从 OpenCV 的 imread 方法获取的图像中对输入进行 tesseract 的默认 dpi 值是多少?

  2. Tesseract 是否在内部根据图像的 dpi 调整图像大小?

  3. 如果我确实使用 opencv 调整图像大小,那么如果在内部基于 dpi 调整大小,我需要将 dpi 设置为 300 dpi。在 OpenCV + pytesseract 中设置 DPI 的最简单方法是什么?但我们可以用PIL做到这一点

标签: pythonopencvpython-imaging-librarytesseractdpi

解决方案


要回答您的问题:

  1. DPI 仅在扫描文档时才真正相关 - 它衡量每英寸用于表示扫描图像的点数。一旦 tesseract 处理图像,它只关心像素

  2. 据我所知,不是。

  3. 您链接到的 SO 答案与写入图像有关,而不是读取图像。

我想我理解你想要达到的核心。您正在尝试提高结果的准确性,因为它与字体/文本大小有关。

一般来说,tesseract 似乎在大约 32 px 高的文本上效果最好。

手动调整大小

如果您正在处理一小组图像或一组一致的图像,您可以手动调整这些图像的大小,使其具有大约 32 像素高的大写字母。从理论上讲,这应该在 tesseract 中给出最好的结果。

自动调整大小

我正在处理不一致的数据集,因此我需要一种自动调整图像大小的方法。我所做的是在图像中找到文本的边界框(使用 tesseract 本身,但你可以使用 EAST 或类似的东西)。

然后,我计算这些边界框的中值高度。使用它,我可以计算出我需要调整图像大小以使图像中大写字母的中值高度约为 32 px。

调整图像大小后,我会重新运行 tesseract 并希望获得最好的结果。耶!

希望能有所帮助!:)


奖励:我在这个 Gist 中分享了这个函数的源代码


推荐阅读