Извлечение разрывов абзаца из текста OCR?

Я пытаюсь воссоздать абзацы и отступы из вывода текста изображения OCR, например:

Ввод (представьте, что это изображение, а не типизированное):

введите здесь описание изображения

Вывод (с несколькими ошибками):

введите здесь описание изображения

Как видите, разрывы абзацев и отступы не сохраняются.

Используя Python, я попробовал такой подход, но он не работает (слишком часто дает сбой):

Код:

def smart_format(text):
  textList = text.split('\n')
  temp = ''

  averageLL = sum([len(line) for line in textList]) / len(textList)

  for line in textList:
    if (line.strip().endswith('!') or line.strip().endswith('.') or line.strip().endswith('?')) and not line.strip().endswith('-'):
      if averageLL - len(line) > 7:
        temp += '{{ paragraph }}' + line + '\n'
      else:
        temp += line + '\n'
    else:
      temp += line + '\n'

  return temp.replace(' -\n', '').replace('-\n', '').replace(' \n', '').replace('\n', ' ').replace('{{ paragraph }}', '\n\n      ')

У кого-нибудь есть предложения, как я могу воссоздать этот макет? Я работаю со старыми книгами, поэтому я надеялся перепечатать их с помощью LaTeX, так как для этого довольно просто создать скрипт Python.

Спасибо!


person Blender    schedule 08.05.2011    source источник
comment
Чтобы уточнить, вы смотрите только на вывод текста и догадываетесь, где должны быть разрывы абзацев? Или есть что-то еще?   -  person Mu Mind    schedule 08.05.2011
comment
У меня есть исходные файлы изображений, но было бы неплохо просто работать с выведенными текстовыми файлами. Я пытаюсь реализовать ответ @Nick ODell ниже, но мои навыки OpenCV довольно ржавые...   -  person Blender    schedule 08.05.2011
comment
Это не было бы случайно вставкой разрывов абзаца перед последней строкой абзаца вместо после, не так ли?   -  person Mu Mind    schedule 08.05.2011
comment
Какая программа делает OCR? Некоторые из них могут быть настроены для обеспечения разрывов строк.   -  person dkretz    schedule 08.05.2011
comment
@Mu Mind Кажется, это (facepalm). Давайте попробуем запустить это снова...   -  person Blender    schedule 08.05.2011
comment
@le dorfier Я использую tesseract, скомпилированный из SVN несколько недель назад. Это единственная бесплатная программа, дающая хорошие результаты (почти идеальные для английских текстов). Кажется, происходит некоторый анализ документов, но я понятия не имею, может ли он делать то, что я хочу...   -  person Blender    schedule 08.05.2011


Ответы (2)


Вы можете разбить изображение на несколько абзацев, просмотрев энтропия каждого горизонтального среза размером 5–10 пикселей. Хотя это обычно используется для создания интересных миниатюр из больших изображений или видео, вы также можете использовать его для определения наличия или отсутствия текста. Вот как.

Вы делите изображение на несколько горизонтальных полос высотой 5-10 пикселей каждая. Если полоса не занята, то можно считать, что текста там нет. Вы можете использовать это, чтобы изолировать абзацы. Теперь вы берете каждый абзац отдельно и загружаете его в OCR.

person Nick ODell    schedule 08.05.2011
comment
Ха, это довольно круто. Я попробую это сделать. Я надеялся найти способ сделать это без разделения изображения, но если это сработает, то сработает. - person Blender; 08.05.2011
comment
Ну, в конце концов, я сделал это. Поскольку высота строки почти постоянна, я сканирую энтропию каждой отдельной строки (6000 пикселей занимает около 10 секунд), извлекаю высоту строки и оттуда сканирую полосы пикселей. Спасибо! - person Blender; 20.05.2011
comment
Без проблем. Я рад узнать, что вы решили свою проблему. - person Nick ODell; 21.05.2011
comment
Ссылка не работает ... энтропия звучит как то, что я ищу с tesseract, так что спасибо. - person Pogrindis; 22.01.2021
comment
@Pogrindis Спасибо за предупреждение, исправленную ссылку. - person Nick ODell; 22.01.2021
comment
Хорошая вещь, в моем случае у меня были некоторые трудности с получением текстовой области с помощью tesseract, поэтому я выбрал только cv2, используя выборку и играя с порогом. Возможно, после некоторого обучения он будет идентифицироваться лучше, но ваша идея разбить его оптимизировала обработку, поэтому я бы дал вам двойные баллы, если бы мог. - person Pogrindis; 22.01.2021

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

person Mu Mind    schedule 08.05.2011