Introducción a OpenCV con Python

En este tutorial, vamos a aprender a usar la biblioteca OpenCV en Python. OpenCV es una biblioteca de código abierto compatible con varias plataformas, incluidas...

Introducción

En este tutorial, vamos a aprender a usar la biblioteca OpenCV en Python. OpenCV es una biblioteca de código abierto que es compatible con múltiples plataformas, incluidas Windows, Linux y MacOS, y también está disponible para su uso en muchos otros idiomas; sin embargo, se usa más comúnmente en Python para aplicaciones de Machine Learning, específicamente en el dominio Computer Vision.

Además de su soporte multiplataforma y su disponibilidad en muchos otros lenguajes informáticos, lo que permite que las aplicaciones desarrolladas en él se utilicen en diferentes sistemas, OpenCV también es, en comparación con otras bibliotecas similares, bastante eficiente en términos de cálculos, ya que utiliza vector operaciones para la mayoría de sus funciones.

En este tutorial, cubriremos la instalación de OpenCV en Mac, Windows y Linux, operaciones de imágenes, aritmética de imágenes, suavizado de imágenes y transformaciones geométricas usando OpenCV. Así que sin más preámbulos, comencemos.

Instalación

Nota: Dado que vamos a utilizar OpenCV en el lenguaje Python, es un requisito implícito que ya tenga instalado Python (versión 3) en su estación de trabajo. Dependiendo de su sistema operativo, ejecute uno de los siguientes comandos para instalar la biblioteca OpenCV en su sistema:

Ventanas

1
$ pip install opencv-python

Mac OS

1
$ brew install opencv3 --with-contrib --with-python3

Linux

1
$ sudo apt-get install libopencv-dev python-opencv

Para verificar si su instalación fue exitosa o no, ejecute el siguiente comando en un shell de Python o en su línea de comandos/terminal:

1
import cv2

Si no obtiene un error al importar cv2, entonces se instaló correctamente.

Operaciones de imagen básicas

Ahora que hemos instalado OpenCV en nuestras estaciones de trabajo, ensuciémonos las manos con algunas de las funcionalidades que ofrece OpenCV.

Mostrar una imagen

Mostrar una imagen usando OpenCV es un proceso de dos pasos; primero, tenemos que cargarlo, y luego podemos mostrarlo. Ambas operaciones se realizan en secuencia usando diferentes funciones.

Para mostrar una imagen, necesitamos saber dos cosas:

  1. Ruta de la imagen (funcionan tanto las rutas absolutas como las relativas)
  2. Modo de lectura (lectura, escritura, etc.)

La función que usaremos para leer/cargar una imagen es cv2.imread(), que tiene dos variaciones. El primero es IMREAD_GRAYSCALE, que como sugiere su nombre, convierte la imagen a escala de grises antes de leerla. El segundo es IMREAD_UNCHANGED, que carga la imagen sin cortar el canal alfa. El valor predeterminado es IMREAD_COLOR, que simplemente lee la imagen en color usando solo los canales RGB.

Vamos a codificar un ejemplo:

1
2
3
import cv2

my_bike = cv2.imread('bike.png')

Esto cargará la imagen de una bicicleta desde el sistema de archivos y la almacenará en la variable my_bike para operaciones posteriores.

Nota: si obtiene un error del código anterior, solo hay tres posibles razones para ello. La primera es que la ruta que especificó es incorrecta, la segunda es que el archivo de imagen que especificó no existe y la última es que el tipo de imagen (jpg/jpeg/png) en la ruta de la imagen es incorrecto.

Ahora mostremos la imagen que acabamos de leer. Se puede hacer con la función cv2.imshow(). Si ha utilizado Matlab, es posible que esté familiarizado con estas operaciones de imagen.

1
cv2.imshow('my_bike', my_bike)

El primer parámetro de la función imshow() es el nombre de la cadena que desea mostrar en la ventana de la imagen. El segundo parámetro es el manejador de imágenes que creamos usando la función cv2.imread().

Guardar una imagen

Guardar una imagen es una función muy utilizada, ya que es posible que necesitemos actualizar nuestra imagen y guardar los cambios en el sistema de archivos para su uso posterior. OpenCV tiene una función cv2.imwrite() para guardar imágenes.

Aquí hay un ejemplo:

1
cv2.imwrite('bike.png', my_bike)

Aquí especificamos el nombre y la ubicación actual de la imagen. La imagen resultante se guarda automáticamente en el directorio de trabajo actual.

Operaciones aritméticas en imágenes

Las operaciones aritméticas en imágenes se refieren a sumar, restar, multiplicar o dividir múltiples imágenes para generar una nueva imagen que es una combinación aritmética de las imágenes de entrada. La aritmética de imágenes tiene muchas aplicaciones, como agregar una marca de agua a una imagen, crear una combinación combinada de dos imágenes, aplicar diferentes tipos de filtros de imagen, etc.

Si bien hay muchas operaciones que puede realizar, solo mostraremos dos ejemplos aquí, ya que esto le permitirá aplicar el concepto a otras operaciones aritméticas disponibles en OpenCV. El primer ejemplo será la adición de dos imágenes y el segundo ejemplo será la combinación de dos imágenes.

Vamos a codificar estos dos ejemplos:

Adición de imágenes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import cv2

# Read in the two images
image_1 = cv2.imread('bike.jpg')
image_2 = cv2.imread('car.jpg')

# Sum the two image arrays for all channels
result = cv2.add(image_1, image_2)

cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

El comando waitKey esperará a que presione una tecla antes de pasar al siguiente comando. Esto es útil para que el programa continúe mostrando su imagen hasta que se presione una tecla; de lo contrario, se mostrará durante una fracción de segundo y luego desaparecerá rápidamente una vez que el programa haya dejado de ejecutarse.

Combinación de imágenes

La combinación de imágenes es similar a la adición de imágenes, excepto que se puede controlar la contribución de cada imagen a la nueva imagen resultante. Básicamente, si queremos que una imagen esté más enfocada y la otra más tenue cuando se fusionen, usaremos la combinación, en lugar de la simple suma.

Vamos a codificarlo para aclarar más:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import cv2

# Read in the two images
image_1 = cv2.imread('bike.jpg')
image_2 = cv2.imread('car.jpg')

result = cv2.addWeighted(image_1, 0.9, image_2, 0.1)

cv2.imshow('result', result)
cv2.waitKey(0) # Wait for the user to press a key before continuing
cv2.destroyAllWindows()

La suma de los pesos asignados a la función addWeighted debe ser igual a 1,0. También puede dar un valor escalar al final, que se agregaría a todos los valores de píxeles de la imagen resultante.

Nota: Las imágenes pueden ser de cualquier tipo; sin embargo, el tipo debe ser el mismo para todas las imágenes. Por ejemplo, si está utilizando el formato PNG, todas las imágenes que se utilizan para el cálculo también deben estar en formato PNG.

Suavizado de imágenes

El suavizado de imágenes es una característica muy útil, que se realiza principalmente antes de que las imágenes pasen a un modelo de aprendizaje automático. Se realiza principalmente para eliminar ruido/elementos de alta frecuencia de las imágenes pasando la imagen a través de un filtro de paso bajo. Hay muchos filtros, incluidos el filtro de caja (filtro de promedio), el filtro de mediana, el filtro de modo, el filtro de Gauss y muchos más; sin embargo, para comprender el suavizado de imágenes y cómo hacerlo usando OpenCV, solo cubriremos el filtro de cuadro.

Digamos que tiene una imagen de 10x10 y desea pasarla a través de un filtro de cuadro/promedio de 3x3, ¿cómo lo haría?

Comenzará con la parte superior izquierda de la imagen, coloque su filtro 3x3 allí y reemplace el elemento central con el promedio de los 9 elementos. Este fue el primer paso, ahora moverá su filtro un paso hacia la derecha y repetirá el mismo proceso hasta que haya cubierto toda la imagen. A continuación se muestra un ejemplo de una imagen de 10x10 y un filtro promedio de 3x3 para su referencia:

Filtro/Máscara:

{.img-responsive}

Filtro que se aplica en la imagen de 10x10:

{.img-responsivo}

Ahora que hemos discutido cómo funciona, intentemos ver cómo podemos aplicar diferentes filtros en nuestra imagen usando OpenCV; lea los comentarios detenidamente para saber qué línea de código se usa para qué filtro:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import cv2

# Load the original image
original_image = cv2.imread('my_bike.png')

# Filter by passing image through 3x3 averaging filter
average_image = cv2.blur(original_image,(3,3))

# Apply 3x3 gaussian filter on the original image
gaussian_image = cv2.GaussianBlur((original_image,(3,3),0))

# Apply 3x3 median filter on the original image
median_image = cv2.medianBlur(original_image,3)

Nota: Puede ver las imágenes resultantes utilizando el siguiente código adicional:

1
2
3
4
import matplotlib.pyplot as plt

plt.imshow(average_image)
plt.show()

Transformaciones de imágenes

La transformación de imágenes es el último, pero uno de los temas más importantes que vamos a cubrir con OpenCV. Tiene muchas aplicaciones, pero una de las más comunes hoy en día es el aprendizaje automático para el aumento de datos, es decir, cuando tiene escasez de conjuntos de datos, aumenta/transforma las imágenes disponibles actualmente para que sean diferentes de su conjunto de datos existente. Esto aumenta efectivamente el tamaño de su conjunto de datos y podría ayudar a mejorar la precisión de su modelo.

La lista de posibles transformaciones es larga, incluyendo escalado, afín, rotación, traslación, etc. solo cubra dos de ellos usando OpenCV para tener una idea general; sin embargo, OpenCV proporciona funciones de soporte para una amplia gama de ellas. Comencemos con la escala.

Escalado

Para decirlo en palabras simples, escalar es básicamente cambiar el tamaño de su imagen, es decir, hacerla más grande o más pequeña. resize es la función utilizada para escalar las imágenes en OpenCV. El cambio de tamaño tiene tres tipos: INTER_CUBIC, INTER_LINEAR e INTER_AREA. Codifiquemos un ejemplo usando estas funciones para escalar; lea atentamente el código, los comentarios y las descripciones, ya que explicarán qué sucede exactamente en el código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('my_bike.jpg')

# Scale up/expand both width and height by factor of 2
result_1 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

# Scale down/shrink both width and height by factor of 2
result_2 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_AREA)

# Display the resulting images
plt.imshow(result_1)
plt.imshow(result_2)
plt.show()

Aquí, en la función cambiar tamaño, el parámetro fx representa el factor de escala para el ancho, fy representa la altura del factor de escala e interpolación especifica la función que se usará para escalar (reducir o expandir).

Rotación

La rotación nos permite mover una imagen sobre el eje para un cierto ángulo especificado.

Antes de aprender a rotar nuestras imágenes usando código, debemos saber que existe una matriz de rotación que se usa para realizar esta transformación; no entraremos en detalles de eso, ya que OpenCV hace que sea muy simple para nosotros calcular esa matriz usando una sola llamada de función. Lo verás en el siguiente código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import cv2
import matplotlib.pyplot as plt

# Load the image of a bike
image = cv2.imread('my_bike.jpg',0)

# Rows and columns
r, c = image.shape

matrix = cv2.getRotationMatrix2D((cols/2,rows/2), 180, 1)
result = cv2.warpAffine(image,matrix,(c,r))

# Display resulting rotation
plt.imshow(result)
plt.show()

En la función getRotationMatrix2D, 180 especifica el grado en el que se debe rotar la imagen, 1 es el factor de escala, la llamada a la función devolvería la matriz de rotación en la variable matrix.

La llamada a la función warpAffine usa la matriz que calculamos con el método anterior para rotar la imagen de acuerdo con nuestras especificaciones.

Conclusión

Para concluir todo, reiteremos algunos puntos importantes que discutimos en este artículo. OpenCV es una biblioteca disponible en varios idiomas y se usa principalmente en conjunto con NumPy, SciPy y [matplotlib](/visualizacion-de-datos -de-python-con-matplotlib/), como también vimos en algunos de los ejemplos anteriores. Algunas de sus funciones son las mismas que en Matlab, y también admite operaciones vectorizadas, lo que aumenta la eficiencia computacional.

Además, OpenCV es una de las mejores bibliotecas que existen para el dominio de Computer Vision, y después de leer este artículo, debería poder continuar y buscar algunas aplicaciones de aprendizaje automático/visión por computadora que se han desarrollado con OpenCV.

Que se sepa que este artículo fue solo la punta del iceberg y que OpenCV tiene mucho más que ofrecer. Leer esto debería permitirle profundizar más y aprender sobre otras características avanzadas que OpenCV tiene para ofrecer. ra ofrecer.