Можно ли проверить ориентацию изображения перед тем, как пропустить его через модуль pytesseract ocr - PullRequest
1 голос
/ 12 марта 2019

Для моего текущего проекта ocr я попытался использовать tesserect, используя pytesseract для оболочки python для преобразования изображений в текстовые файлы. До сих пор я передавал только хорошо ориентированные изображения в мой модуль, чтобы он мог правильно распознать текст на этом изображении. Но сейчас, когда я передаю повернутые изображения, он не может распознать даже одно слово. Поэтому, чтобы получить хороший результат, мне нужно передавать изображения только с правильной ориентацией. Теперь я хочу знать, есть ли способ выяснить ориентацию изображения перед передачей его в модуль ocr. Пожалуйста, дайте мне знать, какие методы можно использовать для проверки ориентации.

Это метод, который я использую для преобразования:

def images_to_text(testImg):
    print('Reading images form the directory..........')
    dataFile=[]
    for filename in os.listdir(testImg):
        os.chdir(testImg)
        # Define config parameters.
        # '-l eng'  for using the English language 
        # '--oem 1' for using LSTM OCR Engine
        config = ('-l eng --oem 1 --psm 3')
        # Read image from disk
        im = cv2.imread(str(filename), cv2.IMREAD_COLOR)
        # Run tesseract OCR on image
        text = pytesseract.image_to_string(im, config=config)
        #basic preprocessing of the text
        text = text.replace('\t',' ')
        text= text.rstrip()
        text= text.lstrip()
        text = text.replace(' +',' ')
        text = text.replace('\n+','\n')
        text = text.replace('\n+ +',' ')

        #writing data to file
        os.chdir(imgTxt)
        rep=filename[-3:]
        name=filename.replace(rep,'txt')
        with open(name, 'w') as writeFile:
            writeFile.write("%s\n" % text)
        text = text.replace('\n',' ')
        dataFile.append(text)
    print('writing data to file done')    
    return dataFile

Ответы [ 2 ]

1 голос
/ 12 марта 2019

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

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

Думаю, это может вам помочь.Проголосуй, если найдешь ответ.Спасибо

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

Это репозиторий для python, который будет полезен для обнаружения текстов.

github ссылка на код Python для обнаружения текста

Дайте мне знать, если вам нужно что-нибудь еще.Спасибо

0 голосов
/ 12 марта 2019

Я получил решение проверить ориентацию изображения.У нас уже есть метод в pytesseract для выполнения этой работы.

imPath='path_to_image'
im = cv2.imread(str(imPath), cv2.IMREAD_COLOR)
newdata=pytesseract.image_to_osd(im)
re.search('(?<=Rotate: )\d+', newdata).group(0)

Вывод метода pytesseract.image_to_osd (im):

Page number: 0
Orientation in degrees: 270
Rotate: 90
Orientation confidence: 4.21
Script: Latin
Script confidence: 1.90

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

re.search('(?<=Rotate: )\d+', newdata).group(0)

Это будет последний метод поворота изображения, чтобы привести его к 0` ориентации.

def rotate(image, center = None, scale = 1.0):
    angle=360-int(re.search('(?<=Rotate: )\d+', pytesseract.image_to_osd(image)).group(0))
    (h, w) = image.shape[:2]

    if center is None:
        center = (w / 2, h / 2)

    # Perform the rotation
    M = cv2.getRotationMatrix2D(center, angle, scale)
    rotated = cv2.warpAffine(image, M, (w, h))

    return rotated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...