Tendencias:
Opencv

¿Qué es OpenCV? Instalación en Python y ejemplos básicos

12/02/2020
Número de visualizaciones

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

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:

bits por pixel

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 binaria

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 escala grises

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.

imagen color

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.

imagen mandril

Si comprobáramos la forma de la imagen de arriba, obtendríamos:

mandril 1

Esto significa que podemos representar la imagen de arriba en forma de una matriz tridimensional.

mandril 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

importar imágenes 1

2) Leer la imagen utilizando la función imread. Para este ejemplo utilizaremos la imagen del mandril (Se puede descargar aquí)

importar imágenes 2

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.

importar imágenes 3

4) Ver la imagen

importar imágenes 4

importar imágenes 5

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.

importar imágenes 6

importar imágenes 7

Guardar imágenes

Las imágenes se pueden guardar en el directorio de trabajo de la siguiente manera:

guardar imagen

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:

dibujar en imágenes 1

Después hay que crear una imagen en negro que hará de plantilla:

dibujar en imágenes 2

Mostraremos la imagen en negro:

dibujar en imágenes 3

dibujar en imágenes 4

La función generalizada para dibujar formas en imágenes es:

dibujar en imágenes 5

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.

linea roja

linea verde

Rectángulo

Para un rectángulo, necesitamos especificar las coordenadas superior izquierda e inferior derecha.

rectangulo

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.

circulo

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.

texto imagen

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í.

+5
Categorizado en: Informática y TICS

No hay comentarios

  1. gabriel araya garcia dice:

    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

    0
    • Rafael Marín dice:

      Buenos días Gabriel.
      El fallo que le aparece es porque no ha definido la variable img_raw anteriormente (como puede ver en la declaración anterior en el artículo).
      En cuanto a si OpenCV sirve para visualizar un gráfico ya hecho en formato JPG o PNG, la respuesta es si, con la función imread puede leer imágenes ya existentes pero por el mero hecho de mostrarla no es la herramienta más útil para ello. Con un simple visor de imágenes realizará la apertura de la imagen mucho más rápido.
      Espero haberle ayudado.
      Un saludo.

      0
  2. Mauricio dice:

    Gracias. me encanta trabajar con imágenes y con Python

    +2
  3. Víctor dice:

    Muchas gracias, estoy empezando en este  campo y el artículo ha sido muy instructivo

    +1
  4. Jhon Gesell Villanueva Portella dice:

    Gracias me ha gustado mucho esta entrada, fue mi ‘hello world’ con OpenCV desde Python

    +1

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Descubre nuestro contenido más actualizado en TERRITORIO INESEM

PRÓXIMOS EVENTOS

LinkedIn: la Red Mundial que conecta a cualquier Profesional

LinkedIn: la Red Mundial que conecta a cualquier Profesional

Ana Cabello
1 hora
22/04/2024 17:00
Blockchain y el Futuro de las Monedas Digitales

Blockchain y el Futuro de las Monedas Digitales

Fernando Molina
45 minutos
29/04/2024 17:00
Universidades colaboradoras
La universidad Antonio de Nebrija es Universidad colaboradora con INESEM Business School La universidad a Distancia de Madrid es Universidad colaboradora con INESEM Business School