在 hocr 输出中获取准确的字体大小

Getting exact font size in hocr output

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

Sample page of OCR text with different line heights

(我的原始图像是 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'")会更容易使用。

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

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

字体大小的计算在Tesseract中给出these three lines:

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

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

这里的主要信息是 row_height,它与 hocr 文件中 ocr_line 中的 x_size 参数相同。因此,您可以简单地浏览 hocr 文件并尝试根据其 x_size 来决定每一行是较小的字体还是较大的字体。要查看 hocr 文件并执行一些操作,您可以查看 hocr-tools.

中的示例

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

$ perl -ne 'print(" ", *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
...