Обнаружение текстовой области в изображении с помощью Opencv

У меня есть изображение и вы хотите обнаружить в нем текстовые области.

Я попробовал проект TiRG_RAW_20110219, но результаты оказались неудовлетворительными. Если входное изображение http://imgur.com/yCxOvQS,GD38rCa, оно производит http://imgur.com/yCxOvQS,GD38rCa#1 в качестве вывода.

Может ли кто-нибудь предложить какую-то альтернативу. Я хотел, чтобы это улучшало вывод tesseract, отправив в него только текстовую область.

Ответы

Ответ 1

import cv2


def captch_ex(file_name):
    img = cv2.imread(file_name)

    img_final = cv2.imread(file_name)
    img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY)
    image_final = cv2.bitwise_and(img2gray, img2gray, mask=mask)
    ret, new_img = cv2.threshold(image_final, 180, 255, cv2.THRESH_BINARY)  # for black text , cv.THRESH_BINARY_INV
    '''
            line  8 to 12  : Remove noisy portion 
    '''
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,
                                                         3))  # to manipulate the orientation of dilution , large x means horizonatally dilating  more, large y means vertically dilating more
    dilated = cv2.dilate(new_img, kernel, iterations=9)  # dilate , more the iteration more the dilation

    # for cv2.x.x

    contours, hierarchy = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # get contours

    # for cv3.x.x comment above line and uncomment line below

    #image, contours, hierarchy = cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)


    for contour in contours:
        # get rectangle bounding contour
        [x, y, w, h] = cv2.boundingRect(contour)

        # Don't plot small false positives that aren't text
        if w < 35 and h < 35:
            continue

        # draw rectangle around contour on original image
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2)

        '''
        #you can crop image and send to OCR  , false detected will return no text :)
        cropped = img_final[y :y +  h , x : x + w]

        s = file_name + '/crop_' + str(index) + '.jpg' 
        cv2.imwrite(s , cropped)
        index = index + 1

        '''
    # write original image with added contours to disk
    cv2.imshow('captcha_result', img)
    cv2.waitKey()


file_name = 'your_image.jpg'
captch_ex(file_name)

Click to see result

Click to see result

Ответ 2

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

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