ADICIÓN y SUSTRACCIÓN de imágenes con OpenCV y Python

Por Administrador

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:

#infoOmes