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 *