Seguro que has oído hablar en alguna ocasión de OpenCV pero, ¿realmente sabes qué es y para qué sirve?
La visión artificial o por computadora se está utilizando cada vez más para el análisis y tratamiento de imágenes mediante algoritmos de inteligencia artificial.
Uno de los usos más importantes de OpenCV en la visión por computadora es la detección de rostros y objetos, sobre todo en ámbitos como la fotografía, el marketing o la seguridad.
Si quieres descubrir qué es OpenCV, cómo se instala en Python y ver una serie de ejemplos básicos, te animo a que sigas leyendo este artículo.
OpenCV y su instalación en Python
OpenCV (Open Source Computer Vision) comenzó como un proyecto de investigación en Intel. Actualmente es la biblioteca de visión por computadora más grande en términos de funciones poseídas.
Actualmente, OpenCV contiene implementaciones de más de 2500 algoritmos. Además está disponible de forma gratuita para fines comerciales y académicos.
Esta gran biblioteca tiene interfaces para múltiples lenguajes, incluidos Python, Java y C++.
La primera versión de OpenCV, 1.0, se lanzó en 2006 y la comunidad de OpenCV ha crecido a pasos agigantados desde entonces.
OpenCV-Python es la API de Python para OpenCV. Además es compatible con las plataformas más utilizadas, Windows, Mac OS y Linux.
Hay que tener en cuenta que para poder usar esta librería de manera óptima, se deben tener conocimientos en:
- Librería Numpy
- Librería Matplotlib
Para la instalación de OpenCV en Python existen 2 formas:
- Desde archivos binarios y archivos fuente precompilados: para ello se debe consultar la documentación pertinente de cada sistema operativo (Por ejemplo Windows y Mac OS.
- Mediante paquetes para entornos de escritorio estándar (Windows, MacOS y casi cualquier distribución GNU/Linux):
- Si solo se necesita módulos principales se debe ejecutar pip install opencv-python
- Si se necesitan tanto módulos principales como adicionales (contrib) se debe ejecutar pip install opencv-contrib-python
Se puede utilizar Jupyter o cualquier IDE de Python para escribir estos comandos.
Imágenes como matrices
Una imagen no es más que una matriz estándar de Numpy que contiene píxeles de puntos de datos. Cuanto mayor sea el número de píxeles en una imagen, mejor es su resolución.
Puede pensar que los píxeles son pequeños bloques de información dispuestos en forma de una cuadrícula 2D, y la profundidad de un píxel se refiere a la información de color presente en ella.
Para ser procesado por una computadora, una imagen debe convertirse en una forma binaria. El color de una imagen se puede calcular de la siguiente manera:
Número de colores / sombras = 2^bpp (donde bpp representa bits por pixel)
Por lo tanto, cuanta más cantidad de bits/píxel, más colores posibles en las imágenes. La siguiente tabla muestra dicha relación de forma más clara:
Veamos ahora la representación de los diferentes tipos de imágenes:
Imagen binaria
Una imagen binaria consta de 1 bit/píxel y, por lo tanto, solo puede tener dos colores posibles, es decir, blanco o negro.
El negro está representado por el valor 0 mientras que el 1 representa el blanco.
Imagen en escala de grises
Una imagen en escala de grises consta de 8 bits por píxel. Esto significa que puede tener 256 sombras diferentes donde 0 píxeles representarán el color negro mientras 255 denota el blanco.
Por ejemplo, la imagen a continuación muestra una imagen en escala de grises representada en forma de matriz.
Imagen en color
Las imágenes en color se representan como una combinación de rojo, azul y verde, y todos los demás colores se pueden lograr mezclando estos colores primarios en las proporciones correctas.
Una imagen en color también consta de 8 bits por píxel. Como resultado, se pueden representar 256 tonos de colores diferentes con 0 que denota negro y 255 blanco.
Veamos la famosa imagen coloreada de un mandril que se ha citado en muchos ejemplos de procesamiento de imágenes.
Si comprobáramos la forma de la imagen de arriba, obtendríamos:
Esto significa que podemos representar la imagen de arriba en forma de una matriz tridimensional.
Imágenes y OpenCV
Se puede utilizar OpenCV para realizar operaciones simples con imágenes como:
- Abrir y guardar imágenes
- Dibujar formas simples en imágenes
- Escribir en imágenes
Estas son operaciones básicas necesarias para crear una base antes de avanzar y poder utilizar todas las funciones avanzadas que OpenCV ofrece.
Para los siguientes ejemplos utilizaremos Jupyter como IDE de Python.
Importar imágenes en OpenCV
Para poder importar imágenes en OpenCV hay que seguir los siguientes pasos:
1) Importar las bibliotecas necesarias
2) Leer la imagen utilizando la función imread. Para este ejemplo utilizaremos la imagen del mandril (Se puede descargar aquí)
3) Elegir el tipo y la forma de la matriz. Con el siguiente código transformaremos la imagen en una matriz numpy con una forma de 1300×1950 y con 3 canales.
4) Ver la imagen
Lo que obtenemos como resultado es un poco diferente con respecto al color. Esperábamos una imagen de colores brillantes, pero lo que obtenemos es una imagen con cierto matiz azulado.
Eso sucede porque OpenCV y matplotlib tienen diferentes órdenes de colores primarios. Mientras que OpenCV lee imágenes en forma de BGR, matplotlib, por otro lado, sigue el orden RGB.
Por lo tanto, cuando leemos un archivo a través de OpenCV, lo leemos como si contuviera canales en el orden de azul, verde y rojo.
Sin embargo, cuando mostramos la imagen usando matplotlib, el canal rojo y el azul se intercambian y, de ahí, el tinte azul.
Para evitar este problema, transformaremos el canal a la forma en que matplotlib espera que se use la función cvtColor.
Guardar imágenes
Las imágenes se pueden guardar en el directorio de trabajo de la siguiente manera:
Donde “final_image” es el nombre de la imagen que se guardará.
Operaciones básicas con imágenes
Por último vamos a ver cómo podemos dibujar varias formas en una imagen existente para tener una idea de cómo trabajar con OpenCV.
Dibujar en imágenes
Para dibujar en una imagen ya existente en primer lugar hay que importar las bibliotecas necesarias:
Después hay que crear una imagen en negro que hará de plantilla:
Mostraremos la imagen en negro:
La función generalizada para dibujar formas en imágenes es:
Hay algunos argumentos comunes que se pasan para dibujar formas en las imágenes:
- Imagen en la que se dibujarán las formas.
- Coordenadas de la forma a dibujar desde Pt1 (arriba a la izquierda) hasta Pt2 (abajo a la derecha).
- Color: color de la forma que se va a dibujar. Se pasa como una tupla, por ejemplo: (255,0,0). Para escala de grises, será la escala de brillo.
- El grosor de la figura geométrica.
Veamos como dibujar varias figuras:
Línea recta
Dibujar una línea recta a través de una imagen requiere especificar los puntos, a través de los cuales pasará la línea.
Rectángulo
Para un rectángulo, necesitamos especificar las coordenadas superior izquierda e inferior derecha.
Círculo
Para un círculo, necesitamos pasar sus coordenadas centrales y el valor del radio. Dibujemos un círculo dentro del rectángulo dibujado arriba.
Escribir en imágenes
Agregar texto a las imágenes también es similar a dibujar formas en ellas.
La diferencia es que se debe especificar ciertos argumentos antes de hacerlo:
- Texto a escribir
- Coordenadas del texto. El texto en una imagen comienza desde la dirección inferior izquierda.
- Tipo de fuente y escala.
- Otros atributos como color, grosor y tipo de línea. Normalmente el tipo de línea que se usa es lineType = cv2.LINE_AA.
Posibilidades de OpenCV
Las posibilidades de análisis y tratamiento de imágenes con la biblioteca OpenCV son inmensas, desde detectar caras y clasificarlas según género hasta crear modelos de realidad aumentada o usar clasificadores para detectar objetos.
En la página oficial de OpenCV encontrarás documentación, tutoriales, foros y multitud de funcionalidades más de gran utilidad.
El movimiento se demuestra andando y para aprender todas las posibilidades de esta gran biblioteca solo existe un camino, practicar y practicar “picando” código.
Si te ha gustado este artículo y quieres leer otros escritos por mí puedes hacerlo aquí.
Comentarios
No reconoce type(img_raw). Para ser mas especifico da el siguiente mensaje: name ‘img_raw’ is not defined.
En ninguna parte explicas que es eso.
Una pregunta, OpenCV sirve para visualizar un grafico ya hecho en formato JPG o PNG ? (ojo, no estoy preguntando sobre la generación del grafico, si no, uno ya existente) .
Te gradecería tu respuesta
Gracias. me encanta trabajar con imágenes y con Python
Muchas gracias, estoy empezando en este campo y el artículo ha sido muy instructivo