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:
Figura 3: Imagen resultante de aplicar cv2.add a las imágenes de las figuras 1 y 2.
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:
Figura 4: Imagen resultante de aplicar cv2.add a las imágenes de las figuras 1 y 2 en escala de grises.
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:
Figura 5: Imagen resultante de aplicar cv2.addWeighted a las imágenes de las figuras 1 y 2.
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:
Figura 6: Imagen resultante al aplicar cv2.subtract a las imágenes de las figuras 1 y 2 en escala de grises.
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:
Figura 7: Imagen resultante de aplicar cv2.absdiff a las imágenes de las figuras 1 y 2 en escala de grises.
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