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 pillow
la 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:
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:
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 ( matrix
variable) 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
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
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:
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] = 0
cual 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. .