Comment inverser les couleurs de l'image avec PIL (Python-Imaging)?

je dois convertir des séries d'images dessinées en blanc sur des Lettres noires en images où le blanc et le noir sont inversés (en négatif). Comment puis-je y parvenir en utilisant la LIP?

36
demandé sur bialix 2010-03-23 12:54:25

5 réponses

Essayez la procédure suivante à partir de 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')

Note: "le module ImageOps contient un certain nombre d'opérations de traitement d'image "prêtes à l'emploi". Ce module est quelque peu expérimental, et la plupart des opérateurs ne travaillent que sur les images L et RVB."

52
répondu Gary Kerr 2013-08-11 15:21:15

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

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')
18
répondu Dave 2012-10-14 06:57:45

pour quiconque travaille avec une image en mode" 1 " (i.e., 1-bit pixels, noir et blanc, stocké avec un pixel par octet -- voir docs), vous devez le convertir en mode " L " avant d'appeler PIL.ImageOps.invert.

ainsi:

im = im.convert('L')
im = ImageOps.invert(im)
im = im.convert('1')
13
répondu Greg Sadetsky 2016-07-14 15:53:09

Dans le cas où quelqu'un est l'inversion d'une CMYK image, les implémentations actuelles de PIL et Pillow ne semblent pas supporter cela et lancer une erreur. Vous pouvez, cependant, facilement contourner ce problème en inversant les bandes individuelles de votre image en utilisant cette fonction pratique (essentiellement une extension du post de Greg Sadetsky ci-dessus):

def CMYKInvert(img) :
    return Image.merge(img.mode, [ImageOps.invert(b.convert('L')) for b in img.split()])
0
répondu mxl 2018-06-08 10:37:22
from PIL import Image

img = Image.open("archive.extension") 

pixels = img.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):
        x,y,z = pixels[i,j][0],pixels[i,j][1],pixels[i,j][2]
        x,y,z = abs(x-255), abs(y-255), abs(z-255)
        pixels[i,j] = (x,y,z)

img.show()

`

0
répondu zilgo 2018-07-09 01:05:00