Domanda Rileva la regione di testo nell'immagine usando Opencv


Ho un'immagine e voglio rilevare le regioni di testo al suo interno.

Ho provato il progetto TiRG_RAW_20110219 ma i risultati non sono soddisfacenti. Se l'immagine di input è http://imgur.com/yCxOvQS,GD38rCa sta producendo http://imgur.com/yCxOvQS,GD38rCa#1 come uscita.

Qualcuno può suggerire qualche alternativa. Volevo che questo migliorasse l'output di tesseract inviandogli solo l'area di testo come input.


20
2018-06-24 11:41


origine


risposte:


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


43
2018-01-29 06:59



Se non ti dispiace sporcarti le mani potresti provare a far crescere quelle regioni di testo in una regione rettangolare più grande, che ti nutri di tesserare tutto in una volta.

Suggerirei anche di provare a sormontare l'immagine più volte e dare da mangiare a ciascuno di essi per tesserare separatamente per vedere se questo aiuta affatto. È possibile confrontare l'output con parole del dizionario per determinare automaticamente se un determinato risultato OCR è buono o meno.


2
2018-06-23 20:47