Activa las notificaciones para estar al tanto de lo más nuevo en tecnología.

Programación lúdica: avances en el filtro de erosión

Prometo que este será el último artículo sobre la idea de filtrar una imagen para poderla hacer más legible. El problema parte de una tesis...

erosion02

Prometo que este será el último artículo sobre la idea de filtrar una imagen para poderla hacer más legible. El problema parte de una tesis que está microfilmada, pasada a pdf (hoja x hoja como si fuesen imágenes), las cuales se ven como si estuviesen impresas en supernegritas. Hay varias cosas interesantes que pueden mencionarse aquí. Una de ellas es que el cerebro tiene un maravilloso sistema de filtrado que hace que podamos leer la tesis en cuestión, a pesar de cómo se ven las letras  y palabras que casi parecen manchones.

Pero ahora lo que quiero mostrarles es unos pequeños avances en el problema a resolver. Las soluciones de los lectores binarios fueron interesantes, pero algunas de ellas inaplicables. Alguno indicaba que usara una red neuronal. Otro, que hiciese un análisis de cada manchón, lo asociara a la letra correspondiente y entonces pasara por cada línea analizando manchones. Ambas ideas sin duda se pueden hacer, pero se requiere mucho tiempo para implementarlas. ¿No podría haber una solución más simple y automática?

Decidí ver qué filtros podían servirme. Alguien me había dicho que el filtro “mediano”, que toma de la vecindad que queramos (3×3, 5×5), los pixeles y que los ordenara y tomara el de la mitad. En realidad este filtro sirve para limpiar imágenes con ruido, con “artefactos”, como se dice en el argot del proceso digital de imágenes. Lo probé directamente en Photoshop, pero no sirvió. No mejoró nada el asunto y por eso decidí no implementarlo en mi programa.

Hoy en mi clase de proceso digital de imágenes, hablé del problema y comenté que usando la matriz de 3×3 había obtenido cierto resultado interesante, pero que el filtro máximo (también llamado de erosión), estaba usando la mínima vecindad posible (radio = 1 pixel) y por ende, no podía mejorar el asunto. “Si pudiese usar una vecindad de la mitad del pixel”, dije casi sin pensarlo y un alumno, que de programación sabe bastante, me indicó una posibilidad para “simular”, una vecindad de medio pixel de radio (recuérdese que el pixel es “la menor unidad homogénea en color que forma parte de una imagen digital” (Wikipedia). Su sugerencia fue: “¿qué tal duplicar de tamaño la imagen original y entonces aplicar el filtro erosión con radio 1? Eso sería equivalente a tener una vecindad de medio pixel, ¿no?”. Quizás tenía razón. Le dije que lo probaría.

erosion00

Fragmento del texto duplicado en tamaño (arriba) y el texto original (abajo)

 

Y heme aquí haciendo pruebas. Aunque no resuelve el problema de manera completa, me quedó claro que la idea tiene muchas virtudes. Al duplicar la imagen y usar el filtro con una vecindad de 3×3 (radio=1) significa básicamente estar haciendo el filtro erosión con radio=0.5.

erosion01

Filtro erosión, aplicado a la image original (arriba) y aplicado a la imagen duplicada (abajo)

Estos son los resultados. ¿Qué piensan ustedes, estimados lectores? ¿Ven mejoras sustanciales en este asunto?

Comentarios