Как я могу получить текст с этого изображения с Tesseract? - PullRequest
0 голосов
/ 18 июня 2019

В настоящее время я использую приведенный ниже код для получения текста с изображения, и он работает нормально, но он плохо работает с этими двумя изображениями, похоже, что tesseract не может сканировать эти типы изображений.Подскажите пожалуйста как это исправить

https://i.ibb.co/zNkbhKG/Untitled1.jpg

https://i.ibb.co/XVbjc3s/Untitled3.jpg

def read_screen():
        spinner = Halo(text='Reading screen', spinner='bouncingBar')
        spinner.start()
        screenshot_file="Screens/to_ocr.png"
        screen_grab(screenshot_file)

        #prepare argparse
        ap = argparse.ArgumentParser(description='HQ_Bot')
        ap.add_argument("-i", "--image", required=False,default=screenshot_file,help="path to input image to be OCR'd")
        ap.add_argument("-p", "--preprocess", type=str, default="thresh", help="type of preprocessing to be done")
        args = vars(ap.parse_args())

        # load the image 
        image = cv2.imread(args["image"])
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

        if args["preprocess"] == "thresh":
                gray = cv2.threshold(gray, 177, 177,
                        cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
        elif args["preprocess"] == "blur":
                gray = cv2.medianBlur(gray, 3)

        # store grayscale image as a temp file to apply OCR
        filename = "Screens/{}.png".format(os.getpid())
        cv2.imwrite(filename, gray)

        # load the image as a PIL/Pillow image, apply OCR, and then delete the temporary file
        pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
        #ENG
        #text = pytesseract.image_to_string(Image.open(filename))

        #VIET
        text = pytesseract.image_to_string(Image.open(filename), lang='vie')

        os.remove(filename)
        os.remove(screenshot_file)

        # show the output images

        '''cv2.imshow("Image", image)
        cv2.imshow("Output", gray)
        os.remove(screenshot_file)
        if cv2.waitKey(0):
                cv2.destroyAllWindows()
        print(text)
        '''
        spinner.succeed()
        spinner.stop()
        return text

1 Ответ

0 голосов
/ 18 июня 2019

Вы должны попробовать разные режимы psm вместо значений по умолчанию, например:

target = pytesseract.image_to_string(im,config='--psm 4',lang='vie')

Извлечь из документов:

Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
                        bypassing hacks that are Tesseract-specific.

Так, например, для /Untitled3.jpg вы можете попробовать --psm 4, а если вы не сможете попробовать --psm 11 для обоих.

В зависимости от вашей версии tesseract вы также можете попробовать разные режимы oem:

Используйте --oem 1 для LSTM, --oem 0 для Legacy Tesseract. Обратите внимание, что модели Legacy Tesseract включены только в файлы обученных данных из репозитория tessdata.

EDIT

Также, как видно на ваших изображениях, есть два языка, поэтому, если вы хотите использовать параметр lang, вам нужно вручную разделить изображение на два, чтобы не перепутать движок tesseract и использовать для них разные значения lang.

РЕДАКТИРОВАТЬ 2

Ниже приведен полный рабочий пример с Unitiled3. То, что я заметил, было твоим неправильным использованием порога. Вы должны установить maxval на что-то большее, чем значение, на которое вы устанавливаете порог Как и в моем примере, я установил thresh 177, но maxval на 255, поэтому все значения выше 177 будут черными. Мне даже не пришлось делать бинаризацию.

import cv2
import pytesseract
from cv2.cv2 import imread, cvtColor, COLOR_BGR2GRAY, threshold, THRESH_BINARY

image = imread("./Untitled3.jpg")
image = cvtColor(image,COLOR_BGR2GRAY)
_,image = threshold(image,177,255,THRESH_BINARY)
cv2.namedWindow("TEST")
cv2.imshow("TEST",image)
cv2.waitKey()
text = pytesseract.image_to_string(image, lang='eng')
print(text)

Выход:

New York, New York

Salzburg, Austria

Hollywood, California
...