Вот несколько примеров изображений, которые я использую, но я использую больше:


Наиболее распространенные проблемы:
- 5 распознается как S (но не наоборот)
- S распознается как O (но не наоборот)
- / получает признался, что я
Я думаю что большая часть проблемы заключается в том, что шрифт выделен жирным шрифтом. Например, я заметил, что чем шире /, тем больше вероятность, что он будет распознан как I. Я пробовал cv2.resize(fx=2, fy=2) + cv2.erode(), но потом по какой-то причине Я понял, что чем толще цифра 5, тем меньше вероятность, что она будет распознана как S. В то же время, если символы толще или я уменьшаю порог бинаризации, дыра в цифре 4 заполняется и вызывает проблемы.
Не могу изменить шрифт. Я пробовал фотографировать с разной экспозицией, но, похоже, ничто не решает суть проблемы. Это лучший фокус, которого я могу добиться. Я не могу внести в белый список определенные символы, потому что возможны как буквы, так и цифры. Я не хочу делать .replace('SX', '5X'), потому что целью проверки является проверка правильности печати этикетки.
Методы, которые я пробовал :
- Обычная бинаризация
- Бинаризация OTSU
- Адаптивная пороговая обработка
Изменить размер + erode() - Повысить масштаб изображения с помощью cv2.dnn_superres, вроде лучше, но слишком медленно, потому что мне нужно обработать много изображений
- Выравнивание гистограммы перед любым из вышеперечисленных действий.
Может ли кто-нибудь предоставить информацию о том, как бы вы очистили эти изображения?
РЕДАКТИРОВАТЬ:
Я добавил несколько примеров предварительной обработки в действии. Для меня слишком много примеров, но я опубликую хотя бы один.
Изображение:

Код: Выделить всё
image = cv2.imread('original.png', cv2.IMREAD_GRAYSCALE)
sharpening_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
image170 = cv2.filter2D(image, -1, sharpening_kernel)
_, image170 = cv2.threshold(image170, 170, 255, cv2.THRESH_BINARY)
image200 = cv2.filter2D(image, -1, sharpening_kernel)
_, image200 = cv2.threshold(image200, 200, 255, cv2.THRESH_BINARY)
image230 = cv2.filter2D(image, -1, sharpening_kernel)
_, image230 = cv2.threshold(image230, 230, 255, cv2.THRESH_BINARY)
print(pytesseract.image_to_string(image170))
print(pytesseract.image_to_string(image200))
print(pytesseract.image_to_string(image230))

– вывод на печать: PSX (неверно)

– вывод на печать: P5X (верно)
< изображение alt="" src="https://i.sstatic.net/MIQgK1pB.png" /> - Вывод на печать: PSX (неверно)
Мне нужно было достичь очень определенного порога для бинаризация для получения правильного чтения.
То, что я хотел подчеркнуть, очень сложно найти правильные параметры, потому что если у меня будет немного другое освещение, размер или какие-либо другие настройки, я не буду получить правильное чтение каждый раз. Мне нужен более надежный способ справиться с этим. Я немного менял здесь параметры, и иногда у меня получалось хорошее чтение, иногда плохое
Подробнее здесь: https://stackoverflow.com/questions/793 ... -recogniti