Herramientas de reconocimiento de texto en imágenes con OCR

Escrito por picodotdev el .
java gnu-linux planeta-codigo
Enlace permanente Comentarios

Un programa de reconocimiento de caracteres o OCR permite obtener el texto de una imagen o fotografía tomada con la cámara de un teléfono inteligente, captura de pantalla, scanner u otro medio. Al programa OCR se le proporciona la imagen y este genera como resultado el texto reconocido, si la imagen es de buena calidad el reconocimiento de caracteres es bastante preciso. Hay programas OCR de línea de comandos, con interfaz gráfica, en línea sin necesidad de instalar software y también es posible realizar OCR desde en un programa con un lenguaje de programación como Java.

El problema de reconocimiento de caracteres es una tarea simple para un humano pero no es una tarea sencilla para una computadora que no posee la inteligencia y experiencia de un humano sino simplemente la que los programadores le han dotado dentro de sus posibilidades. La ventaja de usar una computadora, al igual que en muchas otras tareas posibles con una computadora, es que con el software adecuado es capaz de hacer el reconocimiento de caracteres de manera mucho más rápida y bastante efectiva aunque requiera cierto trabajo de revisión y edición posterior del texto obtenido. La conversión de texto a voz natural es otra tarea simple para un humano pero difícil para una computadora si el resultado deseado ha de ser natural o difícilmente indistinguible de la entonación de un humana.

El texto de una imagen no es extraíble de forma directa ya que por el formato de las imágenes el texto es visiblemente únicamente por la disposición de los pixeles. Para extraer el texto es necesario aplicar un algoritmo que utilizando varias heurísticas es capaz de reconocer el texto de la imagen, el software de reconocimiento de caracteres se le denomina Optical Character Recognition o OCR.

El reconocimiento de caracteres en una imagen es útil y necesario cuando el texto está insertado en una imagen o fotografía, por ejemplo cuando se toma una fotografía de un coche con su número de matrícula o cuando se toma una fotografía de una página de un libro y se quiere extraer el texto de la imagen, los teléfonos inteligentes con cámara son capaces de sustituir para usos básicos a dispositivos hardware como escáneres ópticos.

Programas de reconocimiento de caracteres con OCR

Para extraer el texto de una imagen es necesario un programa OCR, un programa OCR es un software especializado en reconocer patrones de caracteres en una imagen aún cuando los caracteres y texto de la imagen tiene cierta distorsión, baja calidad o defectos. Por supuesto, a mejor calidad de la imagen origen el programa OCR es capaz de ser más preciso en el reconocimiento del texto. Aunque los programas OCR no son siempre perfectos son bastante fiables con una imagen de buena calidad y son capaces de extraer el texto con un éxito cercano al cien por cien.

Los usos de OCR son múltiples, como digitalización de libros, páginas de un libro, periódico, documento, reconocimiento de matrículas de vehículos o direcciones postales entre otros muchos usos.

Hay programas OCR que se invocan desde la línea de comandos, programas con interfaz gráfica y herramientas en línea sin necesidad de programas adicionales.

Reconocimiento de caracteres desde línea de comandos

La ventaja de una herramienta de línea de comandos es que permite automatizar la tarea de extracción de texto de un conjunto de imágenes, o también permite hacer la tarea más rápido sin necesidad de usar de forma interactiva con una aplicación de interfaz gráfica.

En el sistema operativo GNU/Linux una herramienta de OCR es tesseract. Basta con instalar el paquete de distribución para usarlo, en este caso también es posible instalar un diccionario con las palabras del idioma para un mejor reconocimiento del texto.

1
2
$ sudo pacman -S tesseract tesseract-data-eng tesseract-data-spa

pacman-install.sh

Su uso desde la línea de comandos es el siguiente, se ha de proporcionar la imagen origen y el identificador del idioma en su código de tres letras. El comando no perite especificar un rectángulo de la imagen donde se desea reconocer el texto con lo que es necesario recorgar la imagen al área deseada con una herramienta de manipulación de imágenes como GIMP. El resultado se genera en un archivo de nombre output.txt.

1
2
$ tesseract image.jpg output -l spa

tesseract.sh

Para el ejemplo he usado la siguiente imagen tomada con la cámara de fotos del móvil a partir de una página de un libro electrónico. El mismo caso es posible aplicarlo a la fotografía tomada de un periódico o de un documento puesto en una pared, lo importante es que que la imagen tenga la mejor calidad posible en cuanto a definición de caracteres, si es una fotografía que esté bien enfocada y sin brillos para que todo el texto sea reconocible. El reconocimiento del texto se realiza con efectividad mientras los caracteres tengan el formato tipográfico impreso en vez de escritura realizada a mano. Aún teniendo la imagen una leve rotación el texto se sigue reconociendo.

Imagen original y rotada con texto horizontal

Imagen recortada al área deseada

El texto es reconocido con bastante efectividad, el formato no es completamente fiel al original y algunos signos de puntuación pequeños no son reconocidos, sin embargo si la tarea es extrael el texto de un soporte la herramienta es bastante efectiva aunque requiera un revisión y edición posterior.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Pasaron por debajo de un arco e Igor se puso a abrir una
puerta que tenía muchas más tachuelas de lo que era respetable.
Así llegaron a un pasillo.

—¿Estás segura de que quieres venir? —le preguntó Vimes a
Jovial—. Es una vampira.

—Los vampiros no me preocupan, señor.

—Qué suerte tienes. —Vimes miró a Pelele, que estaba en
silencio. El hombre parecía agobiado—. Dile a nuestro amigo
aquí presente que no lo necesitamos y que puede esperarnos en
el carruaje, el cabrón con suerte —dijo—. Pero no traduzcas eso
último.

Igor abrió una puerta interior mientras Pelele se alejaba casi
corriendo por el pasillo.

—Zu eccelentízima eccelencia...

—Ah, sir Samuel —dijo lady Margolotta—. Entre, por favor.
Sé que no le gusta ser una excelencia. Esto se le hace muy
pesado, ¿verdad? Pero se tiene que hacer, ¿no?

Aquello no era lo que él había esperado. En teoría los
vampiros no llevaban perlas, ni jerséis de color rosa. Y en el
mundo de Vimes tampoco llevaban zapatos cómodos y sin tacón.
Ni tenían una sala de estar en la que hasta el último mueble
estaba tapizado con tela de chintz.

Lady Margolotta parecía la típica madre, aunque tal vez la
típica madre de alguien que hubiera tenido una educación cara y
un poni llamado Saltitos. Se movía como alguien muy
acostumbrado a su propio cuerpo, y en general tenía un aspecto
que Vimes había oído describir como de «mujer de cierta edad».
Nunca había estado muy seguro de qué edad era aquella.

Pero... había ciertos detalles raros. Lady Margolotta llevaba
murciélagos bordados en el jersey de color rosa, y el dibujo del
chintz de los muebles se parecía un poco a... murciélagos. El
perrito con un lazo alrededor del cuello que había tumbado y
encogido sobre un cojín tenía más aspecto de rata que de perro.
Vimes no estaba seguro de que esto último fuera raro, sin
embbrgo ya que los perros de aquella naturaleza siempre solían

output.txt

Reconocimiento de texto con un programa con interfaz gráfica

Para usos esporádicos, realizar de forma más intuitiva o con alguna funcionalidad adicional también hay disponibles programas con interfaz gráfica.

Una herramienta con interfaz gráfica en GNU/Linux es gImageReader. Es un programa que utiliza el reconocimiento de caracteres de tesseract que como funcionalidad adicional permite seleccionar el área o áreas de la imagen de las que se desea reconocer el texto.

El reconocimiento de texto se realiza de forma rápida y se proporciona en forma de texto que se puede copiar y pegar en otro programa o documento. Es posible seleccionar las diferentes áreas de la imagen en las que realizar el reconocimiento de texto. También es posible realizar cierta edición en la imagen para rotarla y que las líneas de texto estén lo más horizontales posible, también es posible instalar un diccionario del idioma del texto para en las palabras en las que haya errores de reconocimiento utilizando un diccionario sean corregidos.

Programa con interfaz gráfica para OCR en GNU/Linux

Herramientas en línea de reconocimiento de texto sin instalar software

También hay disponibles herramientas en internet que proporcionan la funcionalidad de reconocimiento de texto proporcionando la imagen de la que se quiere reconocer el texto. Por privacidad y seguridad, la imagen proporcionada a estas herramientas en línea no ha de contener información personal o con información privada importante es más conveniente instalar la herramienta de línea de comandos o con interfaz gráfica anteriores.

Dos herramientas en línea de OCR que aceptan diferentes formatos de imagen son:

OCR con Java

Para automatizar el reconocimiento de caracteres en un programa propio hay una librería que permite invocar la funcionalidad de tesseract desde un programa implementado con el lenguaje de programación Java.

La librería requiere instalar el paquete de tesseract en el sistema o en Windows extraer y cargar su librería dll incluída en el propio archivo jar de la librería. También para mayor efectividad requiere descargar los modelos entrenados para mayor efectividad o los modelos para mayor rapided según el idioma para los caracteres del texto.

Por defecto, la librería procesa la imagen entera, sin embargo al igual que en la aplicación con interfaz gráfica es posible aplicar el reconocimiento de texto a un área especifica de la imagen usando un objeto java.awt.Rectangle al invocar el método sobrecargado doOCR.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package io.github.picodotdev.blogbitix.javatesseract;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

import net.sourceforge.tess4j.Tesseract;

public class Main {

    public static void main(String[] args) throws Exception {
        Tesseract tesseract = new Tesseract();
        tesseract.setLanguage("spa");
        tesseract.setDatapath("src/main/resources/tesseract");
        tesseract.setOcrEngineMode(1);
        
        BufferedImage image = ImageIO.read(Main.class.getResourceAsStream("/image.jpg"));
        String result = tesseract.doOCR(image, new Rectangle(275, 375, 1287 - 275, 1796 - 375));

        System.out.println();
        System.out.println(result);
    }
}
Main.java

En el archivo de construcción del programa se ha de añadir la dependencia sobre la librería Java.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
plugins {
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'net.sourceforge.tess4j:tess4j:4.5.4'
}

application {
    mainClass = 'io.github.picodotdev.blogbitix.javatesseract.Main'
}
build.gradle

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run


Comparte el artículo: