Python Tesseract Изо всех сил пытается интерпретировать даты компьютерного текста - PullRequest
0 голосов
/ 20 февраля 2019

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

Вот вывод:

https://ocr.space/

****** Result for Image/Page 1 ******

22,ü2t201B 11 .Ah,l 

А вот вывод тессеракта Python:

pytesseract.image_to_string(constant,config= '--psm 7')

Out[88]: 'Pe EEE]'

У кого-нибудь есть предложения по улучшению?Мне было бы любопытно посмотреть, сможет ли кто-нибудь извлечь полную информацию из изображения - моя интуиция говорит мне, что '/' и ':' запутывают алгоритм, поэтому, возможно, был бы метод, чтобы вручную удалить их измассив изображений.

Вот изображение, используемое:

Example image

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

Две вещи, которые я узнал об оптическом распознавании символов:

  • работает значительно лучшекогда текст черный, фон белый.
  • работает лучше с большим количеством пробелов между символами
  • параметр конфигурации psm может улучшить качество.

Вотмой код:

#timestamp section
def grabStamp(image):  
    #load image and invert black & whites
    image = cv2.cvtColor(cv2.imread(image), cv2.COLOR_BGR2GRAY)
    im = np.invert(image)
    #exxtract the time stamp section    
    timeStamp = image[:15,:112]
    #add a boarder & create only binary colors (0,255)
    constant= cv2.copyMakeBorder(timeStamp,10,10,10,10,cv2.BORDER_CONSTANT,value=0)
    _, contrasted = cv2.threshold(constant,127,255,cv2.THRESH_BINARY)    

    #loop to find colons
    for x in range(0,113):
        if is_slice_in_list(semiColon, np.ndarray.tolist(contrasted[:,x])) == True:
            if np.where(contrasted[:,x]==255)[0][0] == 17:
            #converting back to black pixils        
             contrasted[:,x][ contrasted[:,x] == 255] = 0                

    #loop to find slashes         
    for x in range(0,113):
        if is_slice_in_list(slash, np.ndarray.tolist(contrasted[:,x])) == True: 
            if np.where(contrasted[:,x]==255)[0][0] == 17:
                if is_slice_in_list(slash_, np.ndarray.tolist(contrasted[:,x - 1])) == True:                  
                    contrasted[:,x][ contrasted[:,x] == 255] = 0 
                    contrasted[:,x-1][ contrasted[:,x-1] == 255] = 0 
                    contrasted[:,x+1][ contrasted[:,x+1] == 255] = 0                    
    #invert back
    im = np.invert(contrasted)

    return pytesseract.image_to_string(im,config= '--psm 7')

Вот процесс, запущенный с изменениями для повышения точности:

grabStamp(image)
Out[250]: '22022018 1157 38'

вот процесс без каких-либо настроек (только инвертирование цветов):

pytesseract.image_to_string(timeStamp,config= '--psm 7')
Out[254]: 'Prlivd7ihl Rete 3'

Исходное изображение:

enter image description here

Измененное изображение:

enter image description here

0 голосов
/ 20 февраля 2019

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

...