Introducción a OpenCV con Python

I

Introducción

En este tutorial, aprenderemos a usar OpenCV biblioteca 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 de visión por computadora.

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 vectores operaciones para la mayoría de sus funciones.

En este tutorial, cubriremos la instalación de OpenCV en Mac, Windows y Linux, operaciones de imagen, 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 Python (versión 3) instalado 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:

Windows

$ pip install opencv-python

Mac OS

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

Linux

$ 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 símbolo del sistema / terminal:

import cv2

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

Operaciones de imagen básicas

Ahora que hemos instalado OpenCV en nuestras estaciones de trabajo, ensuciemos nuestras 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 utilizando diferentes funciones.

Para mostrar una imagen, necesitamos saber dos cosas:

  • Ruta de la imagen (funcionan las rutas absolutas y relativas)
  • 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 su nombre indica, 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 utilizando únicamente los canales RGB.

Codifiquemos un ejemplo:

import cv2

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

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

Nota: Si obtiene un error del código anterior, solo hay tres posibles razones para ello. El primero es que la ruta que especificó es incorrecta, el segundo es que el archivo de imagen que especificó no existe y el último 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. Puede hacerlo el cv2.imshow() función. Si ha utilizado Matlab, es posible que esté familiarizado con estas operaciones de imagen.

cv2.imshow('my_bike', my_bike)

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

Guardar una imagen

Guardar una imagen es una característica 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 cv2.imwrite() función para guardar imágenes.

Aquí hay un ejemplo:

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 varias 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 combinará dos imágenes.

Codifiquemos estos dos ejemplos:

Agregar imágenes

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()

los waitKey El comando 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.

Mezcla de imágenes

Combinar 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 sea más tenue cuando se fusionan, optaremos por la combinación, en lugar de la simple adición.

Vamos a codificarlo para aclarar más:

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 dados al addWeighted la función 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 formato PNG, todas las imágenes que se utilizan para el cálculo también deben estar en formato PNG.

Suavizado de imagen

El suavizado de imágenes es una función muy útil, que se realiza principalmente antes de que las imágenes se pasen a un modelo de Machine Learning. Se hace principalmente para eliminar el ruido / elementos de alta frecuencia de las imágenes pasando la imagen a través de un filtro de paso bajo. Hay muchos filtros, incluido el filtro de caja (filtro de promediado), el filtro de mediana, el filtro de modo, el filtro gaussiano y muchos más; sin embargo, para comprender el suavizado de imágenes y cómo hacerlo usando OpenCV, solo cubriremos el filtro de caja.

Digamos que tiene una imagen de 10×10 y quiere pasarla por un filtro de caja / promedio de 3×3, ¿cómo lo haría?

Comenzará con la parte superior izquierda de la imagen, colocará su filtro 3×3 allí y reemplazará el elemento central con el promedio de los 9 elementos. Este fue el primer paso, ahora moverás tu filtro un paso hacia la derecha y repetirás el mismo proceso hasta que hayas cubierto toda la imagen. A continuación se muestra un ejemplo de imagen de 10 x 10 y un filtro de promedio de 3 x 3 para su referencia:

Filtro / Máscara:

Filtro que se aplica en la imagen 10×10:

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

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:

import matplotlib.pyplot as plt

plt.imshow(average_image)
plt.show()

Transformaciones de imagen

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 Machine Learning para el aumento de datos, es decir, cuando tiene escasez de conjunto de datos, aumenta / transforma las imágenes disponibles actualmente para hacerlas 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, traducción, etc. Solo cubriremos dos de ellas usando OpenCV para tener una idea general; sin embargo, OpenCV proporciona funciones de soporte para una amplia gama de ellos. Empecemos por escalar.

Escalada

Para decirlo en palabras simples, escalar es básicamente cambiar el tamaño de la imagen, es decir, hacerla más grande o más pequeña. resize es la función que se utiliza para escalar las imágenes en OpenCV. El cambio de tamaño tiene tres tipos: INTER_CUBIC, INTER_LINEARy 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é está pasando exactamente en el código:

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 el resize función, la fx el parámetro en representa el factor de escala para el ancho, fy representa la altura del factor de escala, y interpolation especifica la función que se utilizará para escalar (encoger o expandir).

Rotación

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

Antes de aprender a rotar nuestras imágenes usando código, debemos saber que hay una matriz de rotación que se utiliza 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. Verá eso en el siguiente código:

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 el getRotationMatrix2D función, 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 el matrix variable.

los warpAffine La llamada de función usa la matriz que calculamos a partir del 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 junto con NumPy, SciPy y 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 Computer Vision, y después de leer este artículo, debería poder buscar algunas aplicaciones de visión artificial / Machine Learning que se han desarrollado utilizando OpenCV.

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

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad