Получение точного размера шрифта в выводе hocr

Я использую Tesseract для извлечения текста и форматирования из большого объема страниц, которые выглядят так:

Пример страницы текста OCR с различной высотой строки

(Мои исходные изображения имеют разрешение 1200 точек на дюйм; я уменьшил до 600 точек на дюйм и перекодировал, чтобы сохранить размер файла нормальным.)

Когда книга использует блочные кавычки (например, те, которые занимают большую часть левого столбца этой страницы), наиболее заметным отличием является немного меньший размер шрифта.

Проблема состоит в том, что когда я устанавливаю hocr_font_info в 1 в моем файле конфигурации hocr, вывод 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'") было бы намного легче работать.

2 ответа

Решение

Расчет размера шрифта приведен в Tesseract в следующих трех строках:

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

То, что вы хотите, это избежать приведения типов этого числа с плавающей точкой к целому числу. Тем не менее, есть несколько других мест, где также определяется структура и тип, которые также должны быть скорректированы...

Основная информация здесь row_height который так же, как x_size-параметр в ocr_lineнаходится в файле hocr. Таким образом, вы можете просто пройти через файл hocr и попытаться определить для каждой строки в зависимости от его x_size будь то меньший размер шрифта или больший размер шрифта. Для ознакомления с файлом hocr и некоторых других действий вы можете посмотреть примеры из hocr-tools.

Для того, чтобы на самом деле сделать расчет сверху, вам просто нужно знать ваше разрешение (600 или 1200 точек на дюйм) и значение 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
...

На самом деле, у меня может быть работоспособный подход - для каждого абзаца я могу взять ширину каждого слова (то есть ширину его ограничительной рамки) и разделить на количество символов, получая приблизительную среднюю ширину символа. По всему абзацу (даже маленькому) средняя ширина символа дает довольно точную цифру для размера шрифта.

Я все еще заинтересован в более прямом решении, хотя.

Другие вопросы по тегам