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?
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."
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')
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')
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()])
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()
`