Python: caída de canal con Pillow

Una caída de canal es un método para eliminar uno de los canales de una imagen multicanal. Quitar significa cambiar el valor de color de un canal en particular a 0 (todos los píxeles), es decir, ese canal en particular no tiene ningún efecto en la imagen final (suponiendo que los colores se mezclen «normalmente»). Se sigue la teoría del color (Rueda de colores) cuando se eliminan los canales de color. Una vez que se elimina un canal, se agregan los valores de otros canales para crear la nueva imagen. Este método se usa ampliamente en paquetes de procesamiento de imágenes como Adobe Photoshop, Gimp, etc.

Estaríamos usando pillowla biblioteca para implementar la caída del canal. Para instalar la biblioteca, ejecute el siguiente comando en la línea de comandos:

pip install pillow

En uno de los métodos posteriores estaríamos utilizando operaciones elementales que ofrece la biblioteca numpy. Para instalar numpy, ejecute el siguiente comando en la línea de comandos:

pip install numpy

MÉTODO 1:

En este método estaríamos usando la array de transformación pasada como argumento a Image.convert(). La array de transformación es:

newRed   = 1*oldRed  +  0*oldGreen  +  0*oldBlue  + constant
newGreen = 0*oldRed  +  1*OldGreen  +  0*OldBlue  + constant
newBlue  = 0*oldRed  +  0*OldGreen  +  1*OldBlue  + constant

Una imagen RGB normal tendría una array como la que se muestra arriba.

(1, 0, 0, 0,
 0, 1, 0, 0,
 0, 0, 1, 0)

En la array anterior, al cambiar el 1 por el 0 se eliminaría ese canal en particular. Para nuestro propósito, no tenemos que cambiar los valores en otras compensaciones, ya que generan efectos diferentes que no son necesarios.

IMAGEN DE MUESTRA:

Sample Image (Copyright Free)

CÓDIGO:

from PIL import Image
  
# Creating a image object, of the sample image
img = Image.open(r'sample.jpg')
  
# A 12-value tuple which is a transform matrix for dropping 
# green channel (in this case)
matrix = ( 1, 0, 0, 0,
           0, 0, 0, 0,
           0, 0, 1, 0)
  
# Transforming the image to RGB using the aforementioned matrix 
img = img.convert("RGB", matrix)
  
# Displaying the image 
img.show()

IMAGEN DE SALIDA:

Dropped Green Channel

EXPLICACIÓN:

En primer lugar, creamos el objeto de imagen abriendo la imagen usando Image.open()y luego guardando el objeto devuelto en la variable img. Luego, completamos nuestra array de transformación ( matrixvariable) con valores, lo que llevaría a que el canal verde se elimine de la imagen. Dado que el canal verde se elimina (se anula) de la imagen
, la imagen final tendría valores de píxeles que dependen del canal rojo y azul de la imagen (dando tonos de magenta, como rojo + azul = magenta). Luego enviamos la array de transformación al convert()método y guardamos la imagen devuelta. Al final, mostramos la imagen usando img.show().

El mismo efecto podría aplicarse en múltiples canales, cambiando varios 1 a 0.

Ejemplos:

El mismo código pero con la array:

matrix = ( 0, 0, 0, 0,
           0, 0, 0, 0,
           0, 0, 1, 0)

produciría la imagen

Dropped Red And Green Channels

Que es una imagen en la que se eliminan los canales rojo y verde (ya que sus valores posicionales son 0). Debido a que la imagen resultante es de color azul.

El mismo código con la array:

matrix = ( 1, 0, 0, 0,
           0, 1, 0, 0,
           0, 0, 1, 0)

produciría la imagen

Sample Image (Copyright Free)

Cuál es la imagen original ya que todos los valores posicionales son 1, por lo que se conservan todos los canales de color.

MÉTODO 2:

En este método, usaríamos la operación de multiplicación elemental (en nuestro caso, transmisión) que ofrece la biblioteca numpy, para negar un canal de color de la imagen.

CÓDIGO:

from PIL import Image
import numpy as np
  
# Opening the test image and saving its object
img = Image.open(r'sample.jpg')
  
# Creating an array out of pixel values of the image
img_arr = np.array(img, np.uint8)
  
# Setting the value of every pixel in the 3rd channel to 0
# Change the 2 to 1 if wanting to drop the green channel 
# Change the 2 to 0 if wanting to drop the red channel
img_arr[::, ::, 2] = 0
  
# Creating an image from the modified array
img = Image.fromarray(img_arr)
  
# Displaying the image
img.show()

IMAGEN DE SALIDA:

Blue Channel Dropped

EXPLICACIÓN:

En primer lugar, obtuvimos un objeto de imagen para nuestra imagen de muestra y lo almacenamos en la variable img. Luego, convertimos la imagen en una array numpy usando la función np.array()con el tipo de datos np.uint8(entero sin signo de 8 bits). Después de lo cual asignamos 0 como valor de cada píxel en el canal azul, usando el img_arr[::, ::, 2] = 0cual significa dar a cada fila y columna del tercer canal (azul) de esta array multicanal un valor de 0. Luego usamos esta array para crear un nueva imagen usando Image.fromarray(). Al final, mostramos la imagen.

NOTA: La razón por la que 2 en el tercer argumento se trata como canal azul (tercer canal) se debe a que numpy usa una indexación basada en 0, por lo que el primer elemento está en el índice 0 en lugar de 1, lo que hace que el elemento en el índice 2 sea el tercer elemento. .

Publicación traducida automáticamente

Artículo escrito por VasuDev4 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *