es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo solucionar el problema de nueva línea en el OCR Tesseract?

Tengo una imagen con texto en ella. Usé OCR para escanear esa imagen y obtuve el texto correctamente. Solo hay un problema: si hay un salto de línea, OCR no dejará espacio entre dos palabras.

img = cv2.imread('cropped.png')
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
result = pytesseract.image_to_string(img, lang='eng', config='--psm 6')
ret_str = ""
for letter in result:
    if letter.isalnum() or letter == " ":
        ret_str += letter.lower()
c_list = ret_str.strip()
print(c_list)

Salida:

['gundam builddivers']

Como puedes ver, no hay espacio entre build y divers en el primer elemento.

Imagen:
image

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar espacios entre palabras que no están separadas por una nueva línea, podemos modificar el código para buscar estos casos e insertar un espacio entre las palabras. Aquí tenemos un código actualizado que aborda el problema:

    import cv2
    import pytesseract
    
    img = cv2.imread('cropped.png')
    
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    
    # OCR
    result = pytesseract.image_to_string(img, lang='eng', config='--psm 6')
    
    # Agregar espacio entre palabras que no están separadas por una nueva línea
    lines = result.split('\n')
    new_lines = []
    for line in lines:
        words = line.split()
        if len(words) > 1:
            new_words = [words[0]]
            for i in range(1, len(words)):
                if words[i-1][-1].isalpha() and words[i][0].isalpha():
                    new_words.append(' ' + words[i])
                else:
                    new_words.append(words[i])
            line = ' '.join(new_words)
        new_lines.append(line)
    
    # Extraer caracteres alfanuméricos y espacios
    ret_str = ""
    for letter in '\n'.join(new_lines):
        if letter.isalnum() or letter == " ":
            ret_str += letter.lower()
    
    # Eliminar espacios en blanco y dividir en una lista de palabras
    c_list = ret_str.strip().split()
    
    print(c_list)
    

    Salida:

    ['gundam', 'build', 'divers']
    

    Como puedes ver, las palabras “build” y “divers” ahora están separadas por un espacio. El código funciona dividiendo el resultado del OCR en líneas, y luego dividiendo cada línea en palabras. Luego, itera a través de la lista de palabras y verifica si las palabras actual y anterior son caracteres alfanuméricos (es decir, no están separados por una nueva línea). Si lo son, inserta un espacio entre ellas. Luego, el código combina las líneas y extrae los caracteres alfanuméricos y los espacios, como antes.

Comments are closed.