Тессеракт OCR не смог распознать числа полной высоты
Я проверил образец текста как буквенно-цифровой, так и только цифры. Я использую режим цифр.
Как распознать цифры как на следующем изображении:
Я думаю, что это из-за полной высоты. Я также попытался преобразовать его в.jpg с помощью некоторых онлайн-инструментов (не код)
Я использую Pytesseract 0.1.6, но я думаю, что это проблема Тессеракта.
Вот мой код:
def classify(hash):
socket = urllib.urlopen(hash)
image = StringIO(socket.read())
socket.close()
image = Image.open(image)
number = image_to_string(image, config='digits')
mapping[hash] = number
return number
classify('any url')
2 ответа
Я думаю, что у вас есть две проблемы здесь.
Во-первых, текст довольно маленький. Вы можете увеличить изображение, увеличив его в 2 раза и в 2 раза (предпочтительно, используя АА или кубическую интерполяцию, чтобы сделать буквы более четкими).
Затем не хватает белого по краям чисел, чтобы тессеракт знал, что это на самом деле край. Таким образом, вам нужно добавить несколько пустых пробелов вокруг того, что вы уже получили.
Вы можете сделать это вручную, используя Photoshop, GIMP, ImageMagick или что-то еще, чтобы убедиться, что это действительно поможет. Но если вам нужно сделать кучу изображений, вы, вероятно, захотите использовать PIL и ImageOps, чтобы помочь.
Как изменить размер изображения с помощью PIL и сохранить его соотношение сторон?
Если вы сделаете новые размеры больше, а не меньше, PIL будет увеличивать изображение, а не уменьшать его. Увеличьте его в 2 или 3 раза по ширине и высоте, а не на 20%, так как это вызовет артефакты.
Вот один из способов добавить дополнительную белую рамку: http://effbot.org/imagingbook/imageops.htm
Этот вопрос может также помочь вам с добавлением лишних пробелов: В Python, Python Image Library 1.1.6, как я могу расширить холст без изменения размера?
Входное изображение слишком маленькое для распознавания. Вот мое решение:
-
- Повышайте разрешение изображения
-
- Добавить постоянные границы
-
- Применить адаптивный порог
-
- Установить конфигурацию на цифры
Апсемплинг изображения требуется для точного распознавания. Добавление непрерывных границ приведет к центрированию цифр. Применение адаптивного порога сделает функции (цифровые штрихи) более доступными. Результат будет:
Когда вы читаете:
049
Код:
import cv2
import pytesseract
img = cv2.imread("0cLW9.png")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(h, w) = gry.shape[:2]
gry = cv2.resize(gry, (w * 2, h * 2))
gry = cv2.copyMakeBorder(gry, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=255)
thr = cv2.adaptiveThreshold(gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 81, 12)
txt = pytesseract.image_to_string(thr, config="digits")
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)
Вы можете добиться того же результата, используя другие методы предварительной обработки.