Я пытаюсь читать документы из разных источников с помощью 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. Часто процедуры применяются глобально ко всему изображению или предназначены для приложений, не предназначенных для оптического распознавания символов.