web-dev-qa-db-fra.com

Détecter la zone de texte dans l'image à l'aide d'Opencv

J'ai une image et je souhaite y détecter les zones de texte.

J'ai essayé le projet TiRG_RAW_20110219 mais les résultats ne sont pas satisfaisants. Si l'image d'entrée est http://imgur.com/yCxOvQS,Gd38rCa elle produit http://imgur.com/yCxOvQS,Gd38rCa#1 en sortie.

Quelqu'un peut-il suggérer une alternative. Je voulais que cela améliore la sortie de tesseract en lui envoyant uniquement la zone de texte en entrée.

22
Meenal Goyal
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)  # findContours returns 3 variables for getting 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

51
Amit Kushwaha

Si cela ne vous dérange pas de vous salir les mains, vous pouvez essayer de développer ces régions de texte en une plus grande région rectangulaire, que vous alimentez pour tesseract à la fois.

Je suggère également d'essayer de seuiller l'image plusieurs fois et de nourrir chacun d'entre eux pour tesseract séparément pour voir si cela aide du tout. Vous pouvez comparer la sortie aux mots du dictionnaire pour déterminer automatiquement si un résultat OCR particulier est bon ou non.

3
Mike Sandford