У меня проблемы с распознаванием таких слов, как вы можете видеть на картинке

Image to recognize

И в результате у меня есть это:

RMACWI O
12X60
VPFZZOOIK
IADA50527
PORTES

Я использую эти переменные

ocr.SetVariable("tessedit_pageseg_mode", 10);
ocr.SetVariable("tessedit_char_whitelist", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-,.€"); 

Есть ли способ улучшить узнаваемость?

Позже я преобразовал изображение в двоичную форму, но результат был хуже!

enter image description here

Результат:

RMACW1 0
TZXW
VPFZZDWK
IADASDEU
PORTES
3
danLopes 28 Ноя 2019 в 15:23

3 ответа

Вы можете повозиться с предварительной обработкой изображения, но вы можете сэкономить много времени, изменив свой OCR-движок на Google облачное зрение. Когда я запустил ваше изображение, он отлично определил текст:

RMAC6010
12X60
VPF3200/K
IADA50527
PORTES
Documentos refer
Enc. Cli EC19/041

Облако Google немного сложно настроить, но их API-интерфейсы AI - лучшие в мире. Вы можете проверить свое изображение здесь. У них есть клиентские библиотеки для всех основных языков.

Краткое руководство по Google Cloud Vision
OCR с документацией gcloud

2
FBB 4 Дек 2019 в 17:52
2
Я согласен с этим, Tesseract никогда не будет идеальным и всегда будет принимать одних персонажей за других. Тем не менее, не во всех сценариях можно использовать подобную услугу из-за правил.
 – 
Viezevingertjes
4 Дек 2019 в 17:51
2
Ах да, их TOS довольно строгие, и вы не сможете отправить данные в облако. Я полагаю, если вы хотите потратить время, вы можете использовать платную услугу в качестве основы и переобучить свои собственные веса тессеракта. Однако у меня не было хороших результатов с сохранением, и это занимает много времени.
 – 
FBB
4 Дек 2019 в 17:57
1
Спасибо за твой ответ. Вероятно, решение не будет превышать 1000 раз в месяц ... так что это хороший вариант
 – 
danLopes
4 Дек 2019 в 20:46

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

0
Javier Urrestarazu 28 Ноя 2019 в 18:34
Я попробовал преобразовать изображение в двоичную форму, но результат был худшим. Посмотри на мой вопрос сейчас
 – 
danLopes
28 Ноя 2019 в 20:05
Вы все равно можете попробовать обрезать и изменить размер изображения. Почему вы используете pagesegmode 10? Он указывает «рассматривать изображение как один символ». Вы должны использовать 6 или, если вы кадрируете изображение по строкам, 7
 – 
Javier Urrestarazu
28 Ноя 2019 в 21:11
Как я могу разбить изображение на несколько строк?
 – 
danLopes
28 Ноя 2019 в 22:20
Просто вырежьте изображение так, чтобы одно изображение имело только один ряд цифр. Вы можете использовать ножницы или множество бесплатных опций для этого.
 – 
Javier Urrestarazu
28 Ноя 2019 в 23:39
Добавляя к ответу @JavierUrrestarazu, вы также можете сгладить изображение в качестве последнего шага перед его передачей в OCR
 – 
coder_guy
29 Ноя 2019 в 10:01

К двоичному изображению можно применить небольшое размытие по Гауссу. Это поможет сгладить изображение. Вот результат:

enter image description here

Результат от OCR

RMAC6010

12X60

VPF3200/K
\ADA50527

PORTES
Documentos refe:
Ene. Cli EC 19/041

Я реализовал его в Python OpenCV + Pytesseract, но вы можете адаптировать ту же стратегию в C #

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image and Otsu's Threshold to get a binary image
image = cv2.imread('1.jpg', 0)
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Gaussian blur and then perform OCR
thresh = cv2.GaussianBlur(thresh, (3,3), 0)
data = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.waitKey()
0
nathancy 3 Дек 2019 в 05:22
Спасибо за ответ! Сейчас я использую System.Drawing.Size kSize = new System.Drawing.Size(3, 3); Image<Gray, byte> grayImg = temp.Convert<Gray, byte>(); Image<Gray, byte> binImg = new Image<Gray, byte>(grayImg.Size); Image<Gray, byte> gaussImg = new Image<Gray, byte>(grayImg.Size); CvInvoke.Threshold(grayImg, binImg, 0, 255, ThresholdType.Binary | ThresholdType.Otsu); CvInvoke.GaussianBlur(binImg,gaussImg, kSize, 0);, но результат не похож на ваш ....
 – 
danLopes
4 Дек 2019 в 16:45
1
Реализация C # OpenCV может отличаться от версии Python.
 – 
nathancy
4 Дек 2019 в 23:23