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

时间:2017-04-20 23:02:42

标签: tesseract hocr

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

Sample page of OCR text with different line heights

(我的原始图像是1200 DPI;我已经减少到600 DPI并重新编码以保持文件大小合理。)

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

问题是当我在my 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'”)将更容易使用。 / p>

2 个答案:

答案 0 :(得分:1)

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

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

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

此处的主要信息是row_height,它与特别报告文件x_size中的ocr_line - 参数相同。因此,您可以简单地浏览特定文件并根据其x_size尝试确定每一行是否是较小的字体大小或较大的字体大小。要通过一个特定的文件并执行一些操作,您可以查看hocr-tools中的示例。

要从上面实际进行计算,您只需知道您的重新生成(600或1200 dpi)和值kPointsPerInch = 72。作为一个概念证明,试试这个perl one-liner:

$ 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
...

答案 1 :(得分:0)

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

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