1

我正在使用 Tesseract 从大量页面中提取文本和格式,如下所示:

不同行高的 OCR 文本示例页面

(我的原始图像是 1200 DPI;我已降低到 600 DPI 并重新编码以保持文件大小正常。)

当本书使用块引用时(例如占据本页左栏大部分的引用),最显着的区别是字体大小略小。

问题是当我在我的 hocr 配置文件中将 hocr_font_info 设置为 1 时,xml 输出会产生如下的单词标签:

<span class='ocrx_word' id='word_1_131' title='bbox 561 3188 981 3278; x_wconf 89; x_font Century_Schoolbook_L_Medium; x_fsize 7' lang='fra' dir='ltr'>dération</span>

x_fsize 属性通常在小行上为 6,在较大行上为 7,但 Tesseract 有时会将值 7 分配给较小的行 - 并且会为整行分配值,所以我不能依赖相邻的单词解决问题。(在某些情况下,我可以使用相邻,但并非总是如此。有时我会处理一个孤立的文本行,所以如果可能的话,我真的需要精确的大小。)

在我的字体大小中获得更多粒度的最佳方法是什么?在紧要关头,如果我有每个字符的确切高度和宽度,我可能会过得去,尽管带有小数位的字体大小(例如“x_fsize='6.62'”)会更容易使用。

4

2 回答 2

1

实际上,我可能有一个可行的方法 - 对于每个段落,我可以取每个单词的宽度(即其边界框的宽度)并除以字符数,得出近似的平均字符宽度。在整个段落(甚至是一小段)中,平均字符宽度将为字体大小提供一个非常准确的数字。

不过,我仍然对更直接的解决方案感兴趣。

于 2017-04-21T01:41:35.317 回答
1

字体大小的计算在 Tesseract 中的这三行中给出:

  *pointsize = scaled_yres_ > 0
      ? static_cast<int>(row_height * kPointsPerInch / scaled_yres_ + 0.5)
: 0;

您想要的是避免将此浮点类型转换为整数。但是,还有其他几个地方也定义了结构和类型,这也需要调整......

这里的主要信息是与 hocr 文件中 's 中的 -parameterrow_height相同的信息。因此,您可以简单地浏览 hocr 文件并尝试根据其是较小的字体大小还是较大的字体大小来决定每一行。要通过 hocr 文件并做一些事情,您可以查看hocr-tools中的示例。x_sizeocr_linex_size

要从上面进行实际计算,您只需要知道您的分辨率(600 或 1200 dpi)和值kPointsPerInch = 72。作为概念证明,试试这个 perl 单行:

$ perl -ne 'print("$1 ", $2*72/600, "\n") if /^.*id=.([^ ]*). .*x_size ([0-9.]*);.*$/' h7.hocr
line_1_1 8.62807344
line_1_2 7.08
line_1_3 6.36
line_1_4 6.36
line_1_5 6.36
line_1_6 6.35710104
line_1_7 6.48
line_1_8 6.36
line_1_9 6.24
line_1_10 6.36
...
于 2017-04-22T15:18:53.823 回答