Tesseract 是否在内部调整图像大小?

RCv*_*ram 5 python opencv tesseract dpi python-imaging-library

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

\n

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

\n

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

\n

更改 OpenCV 中图像的 dpi

\n

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

\n

Tesseract OCR 如何改进结果?

\n

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

\n

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

\n
\n

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

\n
\n

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

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

下面引用的内容来自 tesseract 官方页面。\n有最小/最大文本大小吗?(它不会\xe2\x80\x99t读取屏幕文本!)

\n
\n

为了保证合理的准确性,有最小文本大小。您必须考虑分辨率和点大小。精度低于 10pt x 300dpi,迅速低于 8pt x 300dpi。快速检查是计算字符 x 高度的像素。(X 高度是小写字母 x 的高度。)在 10pt x 300dpi 下,x 高度通常约为 20 像素,尽管不同字体之间的差异可能很大。x 高度低于 10 像素时,获得准确结果的机会很小,低于大约 8 像素时,大部分文本将被 \xe2\x80\x9cnoise 删除\xe2\x80\x9d。

\n
\n
\n

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

\n
\n

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

\n
\n
    \n
  1. 如果Opencv没有读取dpi信息。通过 OpenCV 的 imread 方法获取图像的超立方体输入的默认 dpi 值是多少?

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

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

    \n
  6. \n
\n

rin*_*ogo 5

回答您的问题:

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

  2. 据我所知还没有。

  3. 您链接的 SO 答案涉及写入图像,而不是读取图像。

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

一般来说,tesseract 似乎最适合高度约为 32 px 的文本。

手动调整大小

如果您正在处理一小组图像或一组一致的图像,则可以手动调整这些图像的大小,使其大写字母高度约为 32 像素。理论上这应该在超立方体中给出最好的结果。

自动调整大小

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

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

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

希望能有所帮助!:)


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