viernes, 27 de noviembre de 2020

OPERACIONES ARITMETICAS SOBRE IMAGENES CON PYTHON Y “opencv” (1ª parte)

 

https://programacionpython80889555.wordpress.com/2020/11/26/operaciones-aritmeticas-sobre-imagenes-con-python-y-opencv-1a-parte/


OPERACIONES ARITMETICAS SOBRE IMAGENES CON PYTHON Y “opencv” (1ª parte).

Las operaciones aritméticas tales como la suma, resta y bit a bit (AND, OR, NOT, XOR) se pueden aplicar a las imágenes de entrada. Estas operaciones pueden resultar útiles para mejorar las propiedades de dichas imágenes así como facilitar el análisis de las propiedades de las mismas. De este modo, podemos efectuar numerosas operaciones (aclarar, establecer umbrales, dilatar, etc.) sobre la imagen. En el artículo de esta semana vamos a empezar por las 2 primeras operaciones referidas al principio: La suma y la resta.

COMO SE OPERA CON IMÁGENES CON “opencv”.

Antes de empezar a ver como podemos realizar las mencionadas operaciones, puede ser interesante hacer referencia al modo en que “opencv” va a procesar el contenido de los archivos e imagen. Así, cuando el programa lee el contenido de una imagen, lo que en realidad esta leyendo (y que es con lo que va a trabajar) es un array compuesto por sucesivas filas de tres valores:

Cada una de estas filas, va a definir el color de cada uno de los píxeles que componen la imagen, en donde cada uno de los tres valores (que oscilará entre 0 y 255) representan los canales azul, verde y rojo (ya que “opencv” trabaja con el modo “bgr” por defecto). Así en nuestro ejemplo hemos tomado una imagen enteramente en blanco (cuyos pixeles tienen valor [255,255,255]). De modo que si a continuación vamos a restarle el contenido de otra imagen en blanco (“white2.png“), en el que el valor por pixel sea igualmente [255,255,255]):

Para realizar la resta de ambos arrays, existe una función en “opencv” llamada “subtract()” que llevará como argumentos las respectivas variables en las que hemos almacenado la información de ambos archivos:

Efectivamente, obtendremos un array cuyos valores para cada pixel serán [0,0,0] (una imagen en negro). Con lo que al mostrar la imagen generada obtendremos el siguiente resultado:

Bien, visto este sencillo ejemplo de como se lee y procesa la información de una imagen en “opencv” pasaremos a ver algo en más detalle, las operaciones de suma y resta sobre archivos de imagen:

SUMA DE IMÁGENES.

La primera operación que vamos a realizar consiste en la suma de la información de 2 archivos de imagen los cuales llevan por nombre “im1.jpg” y “im2.jpg” respectivamente:

“im1.jpg”
“im2.jpg”

Lo que pretendemos hacer en las siguientes líneas es sumar los arrays que componen ambas imágenes, para generar una nueva imagen cuyo array es la suma de los dos anteriores. para ello empezaremos importando “opencv” y cargando ambas imágenes, mediante la función “imread()” y asignándoselas a las variables “image1” e “image2“. En este punto es importante advertir que para que se puedan realizar la operaciones es imprescindible que ambas imágenes tengan las mismas dimensiones.

Para realizar la operación de sumar el contenido de dos imágenes, existe en “opencv” la función “.add()“:

En el ejemplo, vemos como después de haber realizado las importaciones pertinentes, hemos pasado a cargar las imágenes “ima1.jpg” e “ima2.jpg” para su lectura a través de la función “imread()“, hemos procedido a realizar la suma de ambas, usando la función “.add()” a la que hemos pasado los nombres de las variables que previamente les hemos asignado. Finalmente usamos “cv2.imshow()” para mostrar el resultado:

Obtenemos así, una nueva imagen cuyo array nos es sino la suma aritmética de los arrays de las dos imágenes originales. No obstante, existe otra función (“addWeigthed()“) que nos permitirá establecer el peso específico que va a tener cada imagen en el resultado final:

En este caso, hemos usado “addWeighted()” para establecer dicho peso en el resultado final (con esto podemos estableces cual de las dos imágenes va a tener más importancia en la composición final, logrando un mayor control sobre el resultado final). En este caso la imagen “im1.jpg” va a tener (sobre 1) un peso de 0.5 y “im2.jpg” lo tendrá de 0.4, sobre el resultado final, el cual mostraremos a continuación mediante la función “.imshow()” que ya conocemos:

RESTA DE IMÁGENES.

La segunda operación que vamos a ver hoy es la resta de contenido en imágenes (usando la función “subtract()” que veíamos al principio), en la que a diferencia de lo que hacíamos en el caso anterior, vamos a restar los valores del array de una de ellas a los de la otra. Para que el ejemplo sea lo más ilustrativo posible, vamos a realizar dicha operación entre dos imágenes compuestas de solo dos colores:

“baw.png”
“baw2.png”

En este caso introduciremos el mismo código que antes, con la diferencia de que ene este caso introduciremos las variables “image1” y “image2” (que como en el caso anterior deberán tener las mismas dimensiones) como argumentos de la función de resta “subtract()“, como se aprecia a continuación:

También de la misma forma que anteriormente mostrábamos el resultado en el ejemplo anterior, lo haremos en este, mediante la función “imshow()“:

Obtenemos así un resultado que recuerda a lo que vimos cuando hablábamos de la manera en que “opencv” opera sobre los arrays que conforman la imagen. Con la única diferencia a que en esta ocasión, el cambio de blanco ([255,255,255]) a negro ([0,0,0]) se limita únicamente a una región, en la que coinciden los pixeles blancos de ambas imágenes.

Y hasta aquí esta primera parte acerca de las operaciones aritméticas que “opencv” nos permite realizar sobre el contenido de archivos de imagen. Existe otro conjunto de operaciones (bit a bit) a la que hemos hecho alusión antes y a la que dedicaremos una futura segunda parte.

No hay comentarios:

Publicar un comentario