Tengo una imagen y quiere detectar las regiones de texto en él.

Traté de TiRG_RAW_20110219 proyecto, pero los resultados no son satisfactorios. Si la imagen de entrada es http://imgur.com/yCxOvQS,GD38rCa es la producción de http://imgur.com/yCxOvQS,GD38rCa#1 como de salida.

Puede alguien sugerir algunas alternativas. Yo quería esto para mejorar la salida de tesseract enviando sólo la región de texto como entrada.

InformationsquelleAutor Meenal Goyal | 2014-06-24

2 Comentarios

  1. 55
    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)

    Detectar región de texto en la imagen usando Opencv

    Detectar región de texto en la imagen usando Opencv

    • gran respuesta! Estoy usando OpenCV 3.1.0, y cv2.findContours() devuelve tres valores: la imagen, los contornos, la jerarquía. Lo único necesario para que su ejemplo es para agregar una variable en frente de contours
    • Curiosamente, cuando se utiliza RETR_LIST con CHAIN_APPROX_SIMPLE, que tienden a eliminar la mayoría de estos problemas. Altneratively, comprobar las coordenadas x e y de cada uno de sus cuadros y buscar superpone dentro de un margen de error. Pruebe a OCR si ya has probado un HAAR en cascada con los falsos positivos y los negativos o LBMP y, si es malo, deshágase de él.
    • hey @MichaelDausmann, acaba de hacer » _, los contornos, la jerarquía = cv2.findContours(dilatación de las pupilas, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # obtener contornos»
    • Una de las más simples y mejores respuestas que he visto en línea ! … Gracias!!
  2. 4

    Si no le importa ensuciarse las manos usted podría intentar cultivar esas regiones de texto en uno mayor, región rectangular, que se alimentan a tesseract todos a la vez.

    También me gustaría sugerir tratando de umbral de la imagen varias veces y la alimentación de cada uno de aquellos a tesseract por separado para ver si eso ayuda a todos. Usted puede comparar la salida con un diccionario de palabras para determinar automáticamente si un determinado resultado del OCR es bueno o no.

Dejar respuesta

Please enter your comment!
Please enter your name here