在 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
...
我正在使用 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
...