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

问题描述

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

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

Changing image DPI for usage with tesseract

Change dpi of an image in OpenCV

在某些地方,没有人问dpi并需要提高OCR精度,有人想到将DPI设置为300会提高精度。

Tesseract OCR How do I improve result?

Best way to recognize characters in screenshot?

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

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

经过Google搜索后,我发现了以下内容

  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像素,尽管字体之间的差异可能很大。在x高度小于10像素时,您几乎没有机会获得准确的结果,而在小于8像素时,大部分文本将被“消除噪声”。

使用LSTM似乎在30 px左右的地方还有一个最大x高度。除此之外,Tesseract无法产生准确的结果。传统引擎似乎不太容易做到这一点(请参见https://groups.google.com/forum/#!msg/tesseract-ocr/Wdh_JJwnw94/24JHDYQbBQAJ)。

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


  1. 如果Opencv不读取dpi信息。通过OpenCV的读取方法获取的图像中tesseract输入的认dpi值是什么?

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

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

解决方法

回答您的问题:

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

  2. 据我所知没有。

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

我想我了解您想要达到的核心内容。您正在尝试提高与字体/文本大小相关的结果的准确性。

一般来说,tesseract seems to work best on text that is about 32 px tall.

手动调整大小

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

自动调整大小

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

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

调整图像大小后,我重新运行 tesseract 并希望一切顺利。耶!

希望有所帮助! :)


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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...