ADICIÓN y SUSTRACCIÓN de imágenes con OpenCV y Python
En este post tocaremos el tema de las operaciones aritméticas con imágenes, especialmente la adición y sustracción de imágenes, por lo que detallaremos lo siguiente:
CONTENIDO
- Adición de imágenes con cv2.add
- Mezcla de imágenes con cv2.addWeighted
- Sustracción de imágenes con OpenCV y Python
- Sustracción de imágenes con cv2.subtract
- Sustracción de imágenes con cv2.absdiff
Antes de pasar a la explicación, veamos las imágenes con las que vamos a trabajar:
Adición de imágenes con cv2.add
Para la adición de imágenes necesitamos la función cv2.add
, en ella tenemos que especificar:
- Imagen 1 (Primera matriz o escalar)
- Imagen 2 (Segunda matriz o escalar)
A continuación, un ejemplo usando esta función:
import cv2 img1 = cv2.imread('cadena.jpg') img2 = cv2.imread('sacapuntas.jpg') resA = cv2.add(img1,img2) cv2.imshow('resA',resA) cv2.waitKey(0) cv2.destroyAllWindows()
En la línea 1, importamos OpenCV, mientras que en las líneas 3 y 4 leemos las dos imágenes correspondientes a las figuras 1 y 2. En la línea 6 utilizamos la función cv2.add
, en ella especificamos img1
e img2
correspondientes a las imágenes leídas. Finalmente usamos la línea 8 para visualizar el resultado, la línea 9 para detener la visualización hasta que una tecla sea presionada, y en la línea 10 cerramos todas las ventanas de visualización.
El resultado sería el siguiente:
Pero, ¿Cómo funciona cv2.add?
Para entender como funciona cv2.add
vamos a leer las imágenes de entrada en escala de grises, y luego analizaremos el primer pixel de las 3 imágenes, veamos:
import cv2 img1 = cv2.imread('cadena.jpg',0) img2 = cv2.imread('sacapuntas.jpg',0) resA = cv2.add(img1,img2) print('img1[0,0]= ', img1[0,0]) print('img2[0,0]= ', img2[0,0]) print('resA[0,0]= ', resA[0,0]) cv2.imshow('resA',resA) cv2.waitKey(0) cv2.destroyAllWindows()
Este código es bastante parecido al primero, las diferencias están en las líneas 3 y 4, en donde estamos leyendo directamente en escala de grises al ubicar 0
luego del nombre de cada imagen. Además en las líneas 7 a 9 usamos print
para obtener el primer elemento de cada imagen. Entonces como resultado obtenemos lo siguiente:
Se imprime:
img1[0,0]= 65 img2[0,0]= 226 resA[0,0]= 255
Entonces si sumamos 65 y 226, tenemos un total de 291, sin embargo, vemos que en resA[0,0]
obtenemos 255, esto es debido a que al usar cv2.add
si la suma excede a 255, el valor vuelve a 255.
Mezcla de imágenes con cv2.addWeighted
Para la mezcla de imágenes necesitamos la función cv2.addWeighted
, en ella tenemos que especificar:
- Imagen 1 (Primera matriz)
- Alpha (Peso de la primera matriz)
- Imagen 2 (Segunda matriz)
- Beta (Peso de la segunda matriz)
- Gamma (Escalar añadido a la suma)
En cuanto a alpha y beta, estos son valores que se pueden tomar de 0 a 1 para modificar la transparencia de la imagen. Al especificar 1 en alpha o beta, la imagen correspondiente se muestra tal cual es, mientras que si va bajando el valor se va tornando transparente, hasta ser totalmente transparente en 0. Pueden tomar otros valores además de 0 y 1, pero esto dependerá de tu aplicación, puedes revisar la documentación de OpenCV para que analices la ecuación asociada a esta función y puedas usarla de la mejor manera.
Vamos a probar esta función con las imágenes de las figuras 1 y 2.
import cv2 img1 = cv2.imread('cadena.jpg') img2 = cv2.imread('sacapuntas.jpg') resAW = cv2.addWeighted(img1,0.5,img2,0.9,0) cv2.imshow('resAW',resAW) cv2.waitKey(0) cv2.destroyAllWindows()
En la línea 6, usamos la función cv2.addWeighted
, en ella estamos dando un alpha de 0.5 para la primera imagen, y un beta de 0.9 para la segunda imagen, por lo que la primera imagen presentará mayor transparencia que la segunda. Como quinto argumento se ha colocado 0 para que no se sume ningún valor adicional. Y se visualizaría de la siguiente manera:
Sustracción de imágenes con OpenCV y Python
Para aplicar sustracción de imágenes OpenCV nos ofrece dos funciones: cv2.subtract
y cv2.absdiff
, vamos a ver como usar cada una de ellas y lo que hacen, ¡vamos por ello!.
Sustracción de imágenes con cv2.subtract
Al usar la función cv2.subtract
, debemos especificar:
- Imagen 1 (Primera matriz o escalar)
- Imagen 2 (Segunda matriz o escalar)
A continuación veamos como aplicar esta función, para ello tomaremos las imágenes de las figura 1 y 2 leídas en escala de grises, y además compararemos el primer pixel de dichas imágenes y del resultado de la sustracción para entender que ha pasado.
import cv2 img1 = cv2.imread('cadena.jpg',0) img2 = cv2.imread('sacapuntas.jpg',0) resultado = cv2.subtract(img1,img2) print('img1[0,0]= ',img1[0,0]) print('img2[0,0]= ',img2[0,0]) print('resultado[0,0]= ',resultado[0,0]) cv2.imshow('resultado',resultado) cv2.waitKey(0) cv2.destroyAllWindows()
En la línea 1 importamos OpenCV, mientras que en las líneas 3 y 4 leemos las imágenes que hemos venido utilizando, especificando 0
para leerlas directamente en escala de grises. En la línea 6 aplicamos la función cv2.subtract
a estas dos imágenes. En las líneas 7 a la 9 usamos print
para obtener el elemento en la posición 0 de cada una de las imágenes que nos va a servir para analizar. Veamos la imagen que obtenemos:
Se imprime:
img1[0,0]= 65 img2[0,0]= 226 resultado[0,0]= 0
Pero, ¿Cómo funciona cv2.subtract?
Si restamos 65 – 226, tenemos un total de -161, sin embargo, vemos que en resultado[0,0]
se obtiene 0, esto es debido a que al usar cv2.subtract
si el resultado es menor a 0, el valor vuelve a 0.
Sustracción de imágenes con cv2.absdiff
cv2.absdiff
calcula la diferencia absoluta entre los elementos de una imagen o un escalar, entonces debemos especificar:
- Imagen 1 (Primera matriz o escalar)
- Imagen 2 (Segunda matriz o escalar)
Como hemos hecho hasta ahora, vamos a tomar las imágenes de las figura 1 y 2 leídas en escala de grises, para aplicar esta función.
import cv2 img1 = cv2.imread('cadena.jpg',0) img2 = cv2.imread('sacapuntas.jpg',0) resultado2 = cv2.absdiff(img1,img2) print('img1[0,0]= ', img1[0,0]) print('img2[0,0]= ',img2[0,0]) print('resultado2[0,0]= ',resultado2[0,0]) cv2.imshow('resultado2',resultado2) cv2.waitKey(0) cv2.destroyAllWindows()
Se visualiza la siguiente imagen:
Se imprime:
img1[0,0] = 65 img2[0,0] = 226 resultado2[0,0] = 161
Pero, ¿Cómo funciona cv2.absdiff?
Esta función calcula la diferencia en valor absoluto de dos valores, por lo tanto |65 – 226| = |-161|, ya que está en valor absoluto, su resultado final será 161.
Referencias:
- https://docs.opencv.org/trunk/d0/d86/tutorial_py_image_arithmetics.html
- https://docs.opencv.org/trunk/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a1
- https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html
#infoOmes
Debo decirte que es la primera vez que entiendo el código de un script que encuentro en internet, muchas gracias, me sirvió muchísimo!
Déjame decirte que yo son economista, nunca he visto programación y estoy aprendiendo python a las duras penas por eso este es un gran logro para mi que solo alguien que sea muy didáctico lo puede hacer.
Hola Milagros, te agradezco de todo corazón el comentario. Me alegra tanto que sea entendible y útil el contenido que estoy desarrollando, muchas gracias por darte el tiempo de haber dedicado unas palabras a este blog. Un gran abrazo!
Por cierto, espero que sigas adelante con Python, y espero también que te guste el mundo de la visión por computador. 🙂
Creo que si las imágenes no son del mismo tamaño, no es posible realizar la adición ni la sustracción por ser operaciones entre matrices.
muchas gracias por el contenido, muy entendible y practico
justo quería hacer un programa de reconociendo facial( si posee mascarilla o no)
y la información en esta pagina es muy buena para guiarse