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

avatar
PixelmonMaster
9 августа 2021 в 05:39
231
1
0

Я работаю над программой, позволяющей брать карты Magic: The Gathering и читать их названия. До сих пор я обрезал заголовок и получил довольно хорошее обработанное изображение для tesseract, чтобы прочитать заголовок.

Однако, когда я бегу print(pytesseract.image_to_string(new_imgT)), где new_imgT — изображение выше. Вместо того, чтобы возвращать «Командный маяк» или что-то подобное, он возвращает ♀. Это проблема с OCR или моим кодом? Благодарю вас! Редактировать: Вот полная функция, отвечающая за чтение образа из своего каталога и приведение его в это состояние

def readCard(path):
    imgG = cv2.imread(path, 0)     # 0 means grayscale
    imgT = cv2.resize( imgG, (745, 1040))[55:100, 55:680]
    new_imgT = (imgT >= 165)*255          # 230 is the threshold, change as desired
    cv2.imwrite(r"C:\Users\tpixe\Documents\PYTESSERACT test\mask.png",new_imgT)
    text = pytesseract.image_to_string(new_imgT)
    print(text)

Изменить 2: Я думаю, что проблема может быть в повреждении или изменении типа данных. Вызов cv2.imshow на new_imgT дает ошибку

cv2.error: OpenCV(4.5.3) C:/Users/runneradmin/AppData/Local/Temp/pip-req-build-sn_xpupm/opencv/modules/highgui/src/precomp.hpp:155: error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function 'convertToShow'

Что, судя по тому, что я видел в результатах поиска Google, означает, что файл имеет неподходящий формат или поврежден. Тем не менее, изображение будет сохранено в формате png. Как исправить что-то подобное?

Источник
Bedir Yilmaz
9 августа 2021 в 05:50
0

Привет, ты пробовал это и на других изображениях? Результат меняется?

PixelmonMaster
9 августа 2021 в 16:31
1

@BedirYilmaz Я протестировал свой тессеракт, используя это изображение: jeroen.github.io/images/testocr.png . Он работает просто отлично, как ни странно, все еще имеет ♀ в конце строки на новой строке. Тем более, что читается отлично

Ответы (1)

avatar
Durtal
9 августа 2021 в 05:57
0

Что такое ваш new_imgT? У меня отлично работает, если я загружаю ваше изображение заранее, используя opencv:

import cv2
import pytesseract

img = cv2.imread('nBmJO.png')
string_raw = pytesseract.image_to_string(img)
print(string_raw)
# Command Beacon
Christoph Rackwitz
9 августа 2021 в 15:23
1

будьте очень осторожны с передискретизацией изображения, не сохраняя соотношение сторон. img.resize также не является API OpenCV (и не пустым!).

PixelmonMaster
9 августа 2021 в 16:22
0

Мое необработанное изображение точно такое же, как указано выше. Единственная разница заключается в том, что вместо того, чтобы вызывать imread для этого изображения, я начинаю с полного изображения карты, оттенков серого, обрезки и порога. Тогда прочтите это. Мой код: def readCard(path): imgG = cv2.imread(path, 0) # 0 means grayscale imgT = cv2.resize( imgG, (745, 1040))[55:100, 55:680] new_imgT = (imgT >= 165)*255 # 230 is the threshold, change as desired cv2.imwrite(r"C:\Users\tpixe\Documents\PYTESSERACT test\mask.png",new_imgT) text = pytesseract.image_to_string(new_imgT) print(text)

Durtal
9 августа 2021 в 20:10
0

@ChristophRackwitz Ты прав. Я все перепутал и удалил эту заметку.

Durtal
9 августа 2021 в 20:29
0

@PixelmonMaster Кажется, проблема с dtypes. Попробуйте new_imgT = (img >= 165)*np.uint8(255) заставить ndarray использовать uint8

PixelmonMaster
10 августа 2021 в 04:07
0

@Durtal Это исправлено. Теперь работает отлично, спасибо!