проблемы с распознаванием символов в pytesseract / tesseract-OCR. Распознать ‘ ‘ как ‘4’

#python #python-tesseract

#python #python-tesseract

Вопрос:

Как упоминалось в названии, у меня возникли проблемы с распознаванием символа, скрипт распознает ‘ ‘ как ‘4’. как я могу улучшить точность. Пример приведенных ниже изображений вместе с кодом.

https://imgur.com/a/VKYssHr

Я попытался оптимизировать, используя коды в #. Но я не добился успеха

 img = cv2.imread("imgbug.png")
img = cv2.resize(img, None, fx=1.98, fy=1.98, interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((1, 1), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)
#img=cv2.threshold(cv2.GaussianBlur(img, (1, 1), 0), 0, 255, cv2.THRESH_BINARY   cv2.THRESH_OTSU)[1]
#img=cv2.threshold(cv2.bilateralFilter(img, 5, 75, 75), 0, 255, cv2.THRESH_BINARY   cv2.THRESH_OTSU)[1]
cmd = pytesseract.image_to_string(img)
xx = pytesseract.image_to_boxes(img)
cv2.imshow('',img)
print(cmd)
print(xx)
 
 My output is:
34 3=8
9 4=16
2 2=4

3 15 67 28 84 0
4 26 67 35 84 0
  29 67 44 82 0
3 45 67 58 84 0
= 59 71 73 80 0
8 75 67 88 84 0
9 16 39 28 56 0
  30 39 44 54 0
4 45 39 57 56 0
= 59 43 73 52 0
1 75 39 83 56 0
6 85 39 97 56 0
2 16 12 28 28 0
  30 12 44 26 0
2 45 12 58 28 0
= 59 15 73 24 0
4 75 12 87 28 0

 

Комментарии:

1. Взгляните на: Улучшение качества выходных данных. Все распознавание текста требует предварительной обработки, в tesseract в качестве бесплатного варианта вам нужно сделать это самостоятельно.

Ответ №1:

Попробуйте изменить его на оттенки серого, затем установите пороговое значение.

 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
 

Что-то вроде этого

Это увеличит скорость распознавания, но я подозреваю, что проблема кроется в самой библиотеке. Если это не сработает, я рекомендую использовать другую библиотеку или, возможно, попробовать что-то вроде Google vision

Комментарии:

1. Большое вам спасибо за код, он мне очень помог. Однако у меня все еще есть проблема, но на других изображениях у вас есть какие-либо предложения?

2. imgur.com/a/Pz5O4Mr — Это изображение вызывает у меня ту же проблему

3. Посмотрите. Я использовал pytesserect, и это ОТСТОЙ. Просто используйте другую библиотеку, основанную на машинном обучении. Поиск на github действительно поможет.

Ответ №2:

Одним из решений является применение threshold к входному изображению.

У вас есть три входных изображения:

 img_lst = ["pfB7MnL.png", "0amEBuu.png", "6FHilyj.png"]
 

Если вы применяете пороговое значение для каждого входного изображения:

 for img_nm in img_lst:
    img = cv2.imread(img_nm)
    img = cv2.resize(img, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC)
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    thr = cv2.threshold(gry, 127, 255, cv2.THRESH_BINARY_INV)[1]
 

Результаты будут:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Когда вы читаете:

 txt = pytesseract.image_to_string(thr)
print(txt)
 

Результат будет:

 2 9=14
9 1=6
9 2=11

3 3=8
9 4=16
2 2=4

1 5=10
7 7=14
9 6=16
 

Код:


 import pytesseract
import cv2

img_lst = ["pfB7MnL.png", "0amEBuu.png", "6FHilyj.png"]

for img_nm in img_lst:
    img = cv2.imread(img_nm)
    img = cv2.resize(img, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC)
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    thr = cv2.threshold(gry, 127, 255, cv2.THRESH_BINARY_INV)[1]
    txt = pytesseract.image_to_string(thr)
    print(txt)
 

Комментарии:

1. Большое вам спасибо за код, он мне очень помог. Однако у меня все еще есть проблема, но на других изображениях у вас есть какие-либо предложения?

2. imgur.com/a/Pz5O4Mr — Это изображение вызывает у меня ту же проблему

3. Может быть, или позвольте мне спросить вас, вы пробовали код с разными параметрами? К сожалению, универсального кода для решения проблем распознавания не существует. Мое предложение — 1. Попробуйте threahold с разными значениями, т.Е. 0, 255 или 0, 128 2. Если опция 1 не работает, попробуйте adaptive-threshold

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

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