web-dev-qa-db-fra.com

Comment inverser les couleurs d'une image avec PIL (Python-Imaging)?

Je dois convertir des séries d'images dessinées en blanc sur des lettres à fond noir en images où le blanc et le noir sont inversés (en tant que négatifs). Comment puis-je atteindre cet objectif en utilisant PIL?

40
bialix

Essayez ce qui suit dans la documentation: http://effbot.org/imagingbook/imageops.htm

from PIL import Image
import PIL.ImageOps    

image = Image.open('your_image.png')

inverted_image = PIL.ImageOps.invert(image)

inverted_image.save('new_name.png')

Remarque: "Le module ImageOps contient un certain nombre d'opérations de traitement d'image" prédéfinies ". Ce module est quelque peu expérimental et la plupart des opérateurs ne fonctionnent que sur des images L et RGB.

59
Gary Kerr

Si l'image est RGBA transparente, cela échouera ... Cela devrait fonctionner si:

from PIL import Image
import PIL.ImageOps    

image = Image.open('your_image.png')
if image.mode == 'RGBA':
    r,g,b,a = image.split()
    rgb_image = Image.merge('RGB', (r,g,b))

    inverted_image = PIL.ImageOps.invert(rgb_image)

    r2,g2,b2 = inverted_image.split()

    final_transparent_image = Image.merge('RGBA', (r2,g2,b2,a))

    final_transparent_image.save('new_file.png')

else:
    inverted_image = PIL.ImageOps.invert(image)
    inverted_image.save('new_name.png')
21
Dave

Pour ceux qui travaillent avec une image en mode "1" (pixels 1 bit, noir et blanc, stockés avec un pixel par octet - voir docs ), vous devez la convertir en mode "L" avant appeler PIL.ImageOps.invert.

Ainsi:

im = im.convert('L')
im = ImageOps.invert(im)
im = im.convert('1')
15
Greg Sadetsky

Dans le cas où quelqu'un inverserait une image CMYK, les implémentations actuelles de PIL et de Pillow ne semblent pas prendre en charge cela et renvoient une erreur. Cependant, vous pouvez facilement contourner ce problème en inversant les bandes individuelles de votre image à l'aide de cette fonction pratique (essentiellement une extension du message de Greg Sadetsky ci-dessus):

def CMYKInvert(img) :
    return Image.merge(img.mode, [ImageOps.invert(b.convert('L')) for b in img.split()])
0
mxl