Solución:
- arreglar DPI (si es necesario) 300 DPI es mínimo
- corregir el tamaño del texto (por ejemplo, 12 pt debería estar bien)
- intente arreglar las líneas de texto (enderezar y corregir la distorsión del texto)
- intente arreglar la iluminación de la imagen (por ejemplo, ninguna parte oscura de la imagen)
- binarizar y eliminar el ruido
No existe una línea de comando universal que se ajuste a todos los casos (a veces es necesario desenfocar y enfocar la imagen). Pero puedes probar TEXTCLEANER de Fred’s ImageMagick Scripts.
Si no eres fanático de la línea de comandos, tal vez puedas intentar usar scantailor.sourceforge.net de código abierto o bookrestorer comercial.
De ninguna manera soy un experto en OCR. Pero esta semana tuve la necesidad de convertir texto de un jpg.
Empecé con un jpg coloreado RGB de 445×747 píxeles. Inmediatamente probé tesseract en esto, y el programa no convirtió casi nada. Luego entré en GIMP e hice lo siguiente. imagen> modo> imagen en escala de grises> imagen de escala> filtros de 1191×2000 píxeles> mejorar> máscara de enfoque con valores de radio = 6.8, cantidad = 2.69, umbral = 0 Luego lo guardé como un nuevo jpg con una calidad del 100%.
Tesseract luego pudo extraer todo el texto en un archivo .txt
Gimp es tu amigo.
Como regla general, suelo aplicar las siguientes técnicas de preprocesamiento de imágenes utilizando la biblioteca OpenCV:
-
Cambio de escala de la imagen (se recomienda si está trabajando con imágenes que tienen un DPI de menos de 300 ppp):
img = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
-
Conversión de imagen a escala de grises:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
-
Aplicar dilatación y erosión para eliminar el ruido (puede jugar con el tamaño del kernel dependiendo de su conjunto de datos):
kernel = np.ones((1, 1), np.uint8) img = cv2.dilate(img, kernel, iterations=1) img = cv2.erode(img, kernel, iterations=1)
-
Aplicar desenfoque, que se puede hacer usando una de las siguientes líneas (cada una de las cuales tiene sus pros y sus contras, sin embargo, el desenfoque medio y el filtro bilateral generalmente funcionan mejor que el desenfoque gaussiano):
cv2.threshold(cv2.GaussianBlur(img, (5, 5), 0), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] cv2.threshold(cv2.bilateralFilter(img, 5, 75, 75), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] cv2.threshold(cv2.medianBlur(img, 3), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] cv2.adaptiveThreshold(cv2.GaussianBlur(img, (5, 5), 0), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2) cv2.adaptiveThreshold(cv2.bilateralFilter(img, 9, 75, 75), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2) cv2.adaptiveThreshold(cv2.medianBlur(img, 3), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
Recientemente escribí una guía bastante simple para Tesseract, pero debería permitirle escribir su primer script de OCR y aclarar algunos obstáculos que experimenté cuando las cosas estaban menos claras de lo que me hubiera gustado en la documentación.
En caso de que desee verlos, aquí estoy compartiendo los enlaces con usted:
-
Introducción a Tesseract – Parte I: Introducción
-
Introducción a Tesseract – Parte II: Preprocesamiento de imágenes