marzo 23, 2022 10:00 am

Jesús

De un tiempo para acá, hemos estado afianzando conocimientos acerca de lo potente que es el uso de OpenCV en nuestros días. A medida que más conocimiento vamos adquiriendo, más notamos lo vital que es el desarrollo de aplicaciones que usan esta tecnología.

En este post, encontrarás un compendio de artículos que hemos estado abarcando a lo largo de los últimos meses, respecto a OpenCV.

Podríamos empezar hablando respecto a las operaciones sobre imágenes a nivel de Bits. Inicialmente estas operaciones pueden llegar a ser un poco abstractas de entender, sin embargo, son de gran relevancia para el procesamiento de fotos digitales a cualquier nivel.

Estas operaciones tienen su bases en una representación binaria, las cuatro operaciones fundamentales con las que contamos a nivel de bits son AND,OR,XOR y NOT. Estas operaciones pueden llegar a ser un poco complejas, pero en el siguiente enlace te llevará a un artículo donde puedes repasar lo que yo llamo La Tabla de la VerdadVerás cómo te quedará claro.

Un proceso de aislar regiones específicas de una imagen, que también tiene sus bases en las operaciones binarias, es el enmascarado (masking, en inglés). El enmascarado es un mecanismo que nos facilita especificar cuáles píxeles de una imagen queremos conservar. De hecho, puede ser visto como una técnica de recorte avanzado.

Aunque el masking sea una técnica es algo profunda, sus aplicaciones en Computer Vision son innumerables.

Estos son los puntos claves que debes recordar:

  • Una mascara es una imagen binaria.
  • La mascara debe tener las mismas dimensiones de una imagen sobre la que se va a aplicar.
  • Puedes crear una mascara con la función np.zeros()
  • Para aplicar una mascara, debes usar la función cv2.bitwise_and() así: cv2.bitwise_and(image, image, mask=mask).

Histogramas

Existen herramientas variadas para sintetizar, resumir y condensar la información trasmitida en una imagen lo más posible: Histogramas de Color.

¿Por qué son tan útiles los histogramas?

Pues, los Histogramas capturan la distribución de frecuencias de un conjunto de datos. Estas distribuciones de frecuencias son una forma muy agradable de construir técnicas simples de procesamiento de imágenes, junto con algoritmos de aprendizaje automáticos muy potentes. 

Con solo examinar el histograma de una imagen nos hacemos una idea general de la distribución de brillo, contraste e intensidad en la misma.

A pesar de su utilidad analítica, los histogramas de color son especialmente ventajosos en algunas aplicaciones que combinan visión computarizada con machine learning, como la clasificación de imágenes o detección de rostros.

En el siguiente enlace, verás una introducción a los histogramas de imágenes, incluyendo cómo calcular los histogramas en escala de grises y en color.

No obstante, aplicando técnicas más avanzadas de visualización de histogramas, podemos calcular histogramas de color en 2D y 3D. Los histogramas multidimensionales nos proveen de la capacidad de realizar interrogantes conjuntivas y, de ese modo, permitir conocer cómo dos o más canales interactúan entre sí, lo que resulta fundamental para comprender la naturaleza cromática de una fotografía.

A su vez, el ajuste del contraste de una imagen, por ejemplo, puede ajustarse mediante la Ecualización de Histogramas. Esto es particularmente aprovechable en aplicaciones como detección de rostros, clasificación de imágenes y localización de objetos.

Estos son los pasos básicos que sigue el algoritmo:

  1. 1
    Se calcula el histograma de color de la imagen.
  2. 2
    Se distribuyen de forma equitativa los valores de píxeles más comunes (es decir, aquellos pertenecientes a los bins más altos en el histograma).
  3. 3
    Se le da una tendencia lineal a la función de distribución acumulativa (en inglés, CDF, cumulative distribution function).

Detección de Objetos con OpenCV

Un tiempo atrás hablamos sobre template matching, si se quiere uno de los detectores de objetos más rudimentarios que existen.

Uno de los problemas de la solución que desarrollamos en ese artículo, es que se limitaba a encontrar un solo “match”, el primero.

Aun así, en entradas anteriores a este post, logramos aplicar template matching para detectar múltiples objetos, apalancados en otra herramienta estudiada previamente, conocida como Supresión No Máxima (NMS por sus siglas en inglés) , redujimos drásticamente las detecciones redundantes, hasta quedarnos con un sólo por objeto.

De modo que, Detectar Múltiples Objetos Usando Plantillas con OpenCV,a diferencia de la versión que habíamos estudiado previamente,logramos que nuestro detector no se detuviera a la primera coincidencia, sino que continúa buscando hasta cubrir toda la imagen.

Sin embargo, otra de las debilidades de template matching, es que, al menos en su forma original, es incapaz de detectar objetos en diferentes escalas, incluso si coinciden a la perfección con la plantilla.

Pero una solución poderosa que podemos darle a esta debilidad, es correr el algoritmo sobre muchas copias de la imagen, pero a diferentes escalas, hasta encontrar la que mejor se ajuste a la plantilla.

Detección de Texto y Combinación de Herramientas

Un proyecto interesante que construimos hace un par de artículos anteriores, fue el de la detección de texto de pantallas digitales de 7 segmentos.

En esa ocasión hicimos viable la lectura de dígitos solamente utilizando OpenCV, nada de Tesseract. Aun así, el proyecto fue exitosos.

Pero como hemos visto en anteriores ocasiones, la integración de OpenCV y Tesseract pueden dar con la gran solución a nuestros propósitos.

Como sabemos, Tesseract es bueno localizando y extrayendo texto de imágenes relativamente simples, mientras que, por su parte, OpenCV (mediante EAST) es mucho más robusto en cuanto a localización se refiere, pero carece de la capacidad de aplicar OCR per se.

La respuesta, claramente, yace en la unión de ambas librerías para crear un pipeline de procesamiento end-to-end para hacer OCR de texto en condiciones adversas o, al menos, no ideales. Acá en este enlace lo puedes comprobar por ti mismo.

Resumen

OpenCV es una herramienta de reconocimiento muy potente que hace uso inteligente de las redes neuronales. Aun le quedan unos pocos años para llegar a la cúspide de su potencial, sus pequeños avances tecnológicos hacen posible que la herramienta cumpla con las expectativas, aun así, existen situaciones donde damos con resultados ideales.

Sin embargo, si queremos dominar esta herramienta solo existe un camino, practicar y practicar.

Espero que te haya gustado el artículo.

¡Hasta pronto!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.