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

Я пытаюсь читать документы из разных источников с помощью Python. Поэтому я использую OpenCV и Tesseract. Чтобы оптимизировать производительность Tesseract, я выполняю некоторую предварительную обработку, но, к сожалению, качество документов также сильно различается. Моя текущая проблема — это документы, которые лишь частично размыты или затенены из-за плохого сканирования.

Я не влияю на качество документа, а ручное обнаружение признаков неприменимо, потому что в итоге код должен работать с сотнями тысяч документов, и даже внутри документа качество может сильно различаться.

исходное плохое изображение

Чтобы избавиться от тени, я нашел прием с делением и размытием изображения и разделением оригинала на расширенную версию.

h, w = img.shape
kernel = np.ones((7, 7), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
blurred_dilation = cv2.GaussianBlur(dilation, (13, 13), 0)
resized = cv2.resize(blurred_dilation, (w, h))
corrected = img / resized * 255

Это работает очень хорошо.

исправленная экспозиция

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

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

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

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


person Mumpitz    schedule 30.06.2021    source источник
comment
выравнивание: найти пики в БПФ. очень надежный. fmwconcepts.com/imagemagick/textdeskew/index.php кстати: хотя преобразование - плохая идея. неточное или дорогое. также стохастический.   -  person Christoph Rackwitz    schedule 01.07.2021


Ответы (2)


Напоминает мне эту статью, которую я прочитал несколько лет назад: https://medium.com/illuin/cleaning-up-dirty-scanned-documents-with-deep-learning-2e8e6de6cfa6

Вопреки названию, он содержит множество классических алгоритмов компьютерного зрения для вашего вдохновения.

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

Интуитивно, если вы заранее знаете тип и размер шрифта, это тоже должно помочь.

person cidermole    schedule 30.06.2021

import cv2
import numpy as np
import skimage.filters as filters

# read the image
img = cv2.imread("input/ocr.png", 0)

# blur
blurred_dilation = cv2.GaussianBlur(img, (91, 91), 0)

# divide gray by morphology image
division = cv2.divide(img, blurred_dilation, scale=255)

# sharpen using unsharp masking
sharp = filters.unsharp_mask(division, radius=11, amount=11, multichannel=False, preserve_range=False)
sharp = (255 * sharp).clip(0, 255).astype(np.uint8)

# threshold
thresh = cv2.threshold(sharp, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# save results
cv2.imwrite('receipt_division_sharp.png', sharp)
cv2.imwrite('receipt_division_thresh.png', thresh)

результат результат с порогом

метод: фильтр unsharp_mask, метод Оцу (1979)

ref: OpenCV: обнаружение контура затененного изображения перед OCR ( 2020 переполнение стека)

На вашем месте я бы попробовал GAN. Хотя необработанные данные размыты и затенены, вам нужны четкие данные для тессеракта. Итак, вам нужно создать четкий символ из размытых необработанных данных.

person Mason Ji Ming    schedule 05.07.2021