Introducción a OpenCV con Python

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *