Python – Inversión de color usando Pillow

La inversión de color (imagen negativa) es el método de invertir los valores de píxeles de una imagen. La inversión de imagen no depende del modo de color de la imagen, es decir, la inversión funciona a nivel de canal. Cuando se utiliza la inversión en una imagen de varios colores (RGB, CMYK, etc.), cada canal se trata por separado y el resultado final se forma calibrando los resultados de todos los canales.
Estaríamos usando la biblioteca de Pillows (PIL) para obtener el negativo de una imagen. Para instalar la biblioteca, ejecute el siguiente comando en la línea de comandos:-  

pip install pillow

Nota: Varias distribuciones de Linux tienden a tener Python y PIL preinstalados.
En este artículo, se han descrito 2 métodos para invertir el espacio de color de una imagen. El primero es un método incorporado que utiliza la función ImageChops.invert(). En el segundo estaríamos invirtiendo la imagen mediante la sustracción de elementos de los valores de píxel. 
Imagen de muestra – 

Sample image

 
Método n.º 1:
usar el método incorporado ImageChops.invert() para negar el color.

Python3

# Importing imagechops for using the invert() method
from PIL import Image, ImageChops
 
# Opening the test image, and saving it's object
img = Image.open('test.jpg')
 
# Passing the image object to invert() 
inv_img = ImageChops.invert(img)
 
# Displaying the output image
inv_img.show()

Producción: 

Output image

Explicación: 
Primero, importamos el módulo ImageChops para usar el método invert(). Luego abrimos la imagen de prueba (test.jpg) y guardamos su objeto de imagen. Ahora pasamos ese objeto de imagen a ImageDraw.invert() que devuelve la imagen invertida. Por fin, mostramos la imagen de color invertido. 
Cosas a tener en cuenta al usar ImageChops.invert(): 

  • La imagen de entrada no debe contener un canal alfa 
     
  • La imagen de entrada no debe ser del modo de color P (Paleta). 
     

  
Método n.° 2:
el método utilizado para obtener el inverso de una imagen es la resta del valor/intensidad máximos de un píxel por el valor del píxel actual. El valor resultante se guía por la fórmula: 
 

formualt for inverting an image

Donde INV es el píxel invertido resultante, I^MAX es el nivel de intensidad máxima en un modo de color dado e I(x, y) es la intensidad (valor de píxel) de la imagen/canal de color en un par de coordenadas particular. 

Python3

from PIL import Image
 
# numpy for performing batch processing and elementwise
# matrix operations efficiently
import numpy as np
 
 
# Opening an image, and saving open image object
img = Image.open(r"sample.jpg")
 
# Creating an numpy array out of the image object
img_arry = np.array(img)
 
# Maximum intensity value of the color mode
I_max = 255
 
# Subtracting 255 (max value possible in a given image
# channel) from each pixel values and storing the result
img_arry = I_max - img_arry
 
# Creating an image object from the resultant numpy array
inverted_img = Image.fromarray(img_arry)
 
# Saving the image under the name Image_negative.jpg
inverted_img.save(r"Image_negative.jpg")

Producción: 

Output image

Explicación: 
en primer lugar, importamos numpy en nuestro código, ya que numpy permite operaciones rápidas con elementos en arrays y ofrece varias operaciones aritméticas en arrays. Luego, abrimos la imagen de prueba usando Image.open() y almacenamos el objeto de imagen devuelto en la variable img. Luego creamos una array (img_arry) a partir de los valores de píxel obtenidos del objeto de imagen abierto (img). Esto se hace para permitir la operación de resta por elementos que ofrece la biblioteca numpy. Ahora restamos 255 de cada valor de canal/píxel, lo que da como resultado que se inviertan todos los valores de píxel. Ahora, usamos esta array resultante para crear una nueva imagen (inverted_img). Finalmente guardamos la imagen, bajo el nombre de Image_negative.jpg.
 

Algunas cosas para tener en mente –

  • Debe asegurarse de que la imagen de entrada no contenga un canal alfa. Esto se debe a que cuando la línea img_arry = 255 – img_arry se ejecutará para una imagen que contenga un canal alfa, también invertirá los valores del canal alfa. Esto daría lugar a incoherencias en la imagen de salida, ya que podemos terminar con imágenes completamente transparentes (que no forman parte de la inversión de color). Una forma de permitir el procesamiento de imágenes RGBA es, en primer lugar, convertirlas al modo de color RGB usando Image.convert(‘RGB’). Alternativamente, podríamos extraer el canal alfa usando Image.getdata(band=3) y luego combinarlo con la imagen final para recuperar la imagen RGBA original. 
    Esta imagen de entrada sample.jpg se elige intencionalmente del formato .jpg, ya que el formato de imagen JPG/JPEG no admite transparencia ni canales alfa. 
     
  • La imagen de entrada no debe ser del modo P (con paleta). Como una imagen con paleta no contiene valores de píxeles en las coordenadas, sino un índice de valores de píxeles que pertenecen a un mapa de colores (de diferentes tamaños). Por lo tanto, la inversión de la imagen conduciría a resultados inconsistentes. 
     
  • El valor I_max = 255 se asigna asumiendo que la intensidad máxima alcanzable en el modo de imagen específico es 255. El valor no está codificado. El valor depende del modo de color y, por lo tanto, podría ser inferior a 255 (p. ej., 1 en una imagen de dos niveles) o superior a 255 (p. ej., 32536 en el modo de escala de grises sin signo de 16 bits).

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 *