Можно ли проверить ориентацию изображения перед его передачей через модуль pytesseract ocr

Для моего текущего проекта 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

person Mousam Singh    schedule 12.03.2019    source источник
comment
@Noremac Не могли бы вы разобраться в этой проблеме   -  person Mousam Singh    schedule 12.03.2019


Ответы (2)


У меня есть решение для проверки ориентации изображения. У нас уже есть метод в 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)

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

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
person Mousam Singh    schedule 12.03.2019
comment
Ok. Хорошо знать. Но будет ли эта ориентация применяться ко всему изображению или только к тексту? - person Karsh Soni; 12.03.2019
comment
@KarshSoni Это даст поворот всего изображения. - person Mousam Singh; 13.03.2019
comment
он поворачивает изображение, но сохраняет то же разрешение, поэтому вам нужно поменять местами ширину с высотой - person Gabriel Ziegler; 22.11.2019
comment
Чтобы повернуть: from scipy import ndimage, а затем ndimage.rotate(img, float(angle) * -1) - person Maksim; 03.12.2019
comment
Мы также можем использовать _1 _, чтобы повернуть исходное изображение после того, как мы нашли угол поворота с помощью описанного выше подхода. В моем случае это работает как шарм - person Harsh kurra; 08.05.2020
comment
Можно ли получить ориентацию изображения с помощью pytesseract.image_to_data() вместо pytesseract.image_to_osd()? Мне все равно нужно запустить pytesseract.image_to_data(), чтобы извлечь текст из изображения. Я бы хотел, чтобы вам не пришлось дважды вызывать pytesseract. - person abrezey; 05.05.2021

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

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

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

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

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

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

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

person Karsh Soni    schedule 12.03.2019
comment
Спасибо, я изучу это и дам вам знать, если мне понадобится дополнительная помощь в этом. - person Mousam Singh; 12.03.2019