Objectif
Comme indiqué dans le programme, il sera ici question de traiter par programme une image pour la transformer en agissant sur ses pixels. Nous parlons donc ici d'image matricielle.
Les scripts du dessous furent réalisées après réflexion intense de deux cerveaux de 9h à 15h avec une toute petite pause méridienne mardi 11 février 2020. J'en profite pour remercier ma collègue Mme Rambaud car à deux cerveaux, on avance plus vite, un peu comme un vélo qui roule bien mieux s'il a deux roues ;)))
Attention, pour que cela fonctionne sous Thonny il faudra installer la bibliothèque Pillow!!
Et comme il est question ici de pixels, je vous présente l'approche artistique de Salvador Dali qui aurait certainement adoré être élève au XXI ème siècle et ainsi découvrir en SNT les arcanes de la construction des images numériques (l'image du dessous est cliquable).
Date: c. 1975 / Technique: Huile et photographie sur panneau de bois contreplaqué / Dimensions: 445 x 350 cm / Signature: Non signé, non daté / Localisation: Fundació Gala-Salvador Dalí, Figueres
Installation de la bibliothèque Pillow
- Via le menu Tools / Manage packages...
- Pour la doc voir ici:
https://pillow.readthedocs.io/en/3.1.x/reference/Image.html
Création d'une image de 25 pixels avec des couleurs aléatoires
Script
from PIL import Image
from random import *
#taille image
largeur =5
hauteur=5
# creation image 5 pix² couleur aleatoire
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
print("test 1 creation de l'image source - enregistrement 5par5pix-1.bmp")
for x in range (largeur):
for y in range (hauteur):
b=randint(0,255)
v=randint(0,255)
r=randint(0,255)
img.putpixel((x,y),(r,v,b))
print(x,y,r,v,b)
img.save("5par5pix-1.bmp")
Analyse
- Importation des bibliothèques Pillow et random
- Affectation de la largeur et hauteur en pixels, vous pouvez les modifier
- Création de l'image via la méthode new
- Dans la boucle bornée, affectation d'une valeur entre 0 et 255 pour les variables r,v,b
- Création des pixels pixel par pixel
- Le print(x,y,r,v,b) n'est là que pour l'explication
- Sauvegarde de l'image sous le nom 5par5pix-1.jpg (correction 2023 - Utilisation du format bmp pour correspondance exact des valeurs des pixels sous GIMP)
L'image est sauvegardée dans le dossier dans lequel vous lancer le script
Script enregistrant les valeurs des points dans un fichier csv
import csv
from PIL import Image
from random import *
with open('5par5pix-1.csv', 'w', newline='') as csvfile:
data = csv.writer(csvfile, delimiter=';')
data.writerow(["coord_x","coord_y","rouge","vert","bleu"])
#taille image
largeur =5
hauteur=5
# creation image 5 pix² couleur aleatoire
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
print("test 1 creation de l'image source - enregistrement 5par5pix-1.jpg")
for x in range (largeur):
for y in range (hauteur):
b=randint(0,255)
v=randint(0,255)
r=randint(0,255)
img.putpixel((x,y),(r,v,b))
print(x,y,r,v,b)
data.writerow([x,y,r,v,b])
img.save("5par5pix-1.jpg")
Inversion des couleurs de l'image créée
Script
from PIL import Image
#taille image
largeur =5
hauteur=5
# inversion couleur
print("test 2 Inversion couleur - enregistrement 5par5pix-2.bmp")
img=Image.open("5par5pix-1.bmp")
for x in range (largeur):
for y in range (hauteur):
r,v,b=img.getpixel((x,y))
nr,nv,nb=255-r,255-v,255-b
img.putpixel((x,y),(nr,nv,nb))
print(x,y,nr,nv,nb)
img.save("5par5pix-2.bmp")
Analyse
Vous devez disposer de l'image précédente dans le dossier dans lequel vous lancez le script!!
- Ouverture de l'image 5par5pix-1.jpg (format bmp conseillé)
- Dans la boucle pour chaque pixel, prendre les valeurs r,v,b et inverser leurs valeurs.
Comme la valeur max est 255, l'inversion correspond pour le rouge à 255-r. Cette nouvelle valeur est affectée à la variable nr - Création des pixels pixel par pixel
- Sauvegarde de l'image sous le nom 5par5pix-2.jpg (format bmp conseillé)
Mise en niveau de gris
Script
from PIL import Image
from random import *
#taille image
largeur =5
hauteur=5
# mise en niveau de gris
print("test 3 niveau de gris - enregistrement 5par5pix-3.bmp")
img=Image.open("5par5pix-1.jpg")
for x in range (largeur):
for y in range (hauteur):
r,v,b=img.getpixel((x,y))
gris=int((r+v+b)/3)
img.putpixel((x,y),(gris,gris,gris))
print(x,y,gris,gris,gris)
img.save("5par5pix-3.bmp")
img.save("5par5pix-3.jpg")
Analyse
Vous devez disposer de l'image précédente dans le dossier dans lequel vous lancez le script!!
- Même principe que précédement
- Mettre en gris, c'est faire la moyenne des 3 couleurs r,v et b :
gris=int((r+v+b)/3) - Puis affecter cette valeur de gris pour les trois valeurs r,v,b de la nouvelle image :
img.putpixel((x,y),(gris,gris,gris)) - Enregistrement de l'image 5par5pix-3.jpg
Script complet
Pour les gens pressés:
from PIL import Image
from random import *
#taille image
largeur =5
hauteur=5
# creation image 5 pix² couleur aleatoire
img=Image.new("RGB",(largeur,hauteur),(255,255,255))
print("test 1 creation de l'image source - enregistrement 5par5pix-1.jpg")
for x in range (largeur):
for y in range (hauteur):
b=randint(0,255)
v=randint(0,255)
r=randint(0,255)
img.putpixel((x,y),(r,v,b))
print(x,y,r,v,b)
img.save("5par5pix-1.jpg")
# inversion couleur
print("test 2 Inversion couleur - enregistrement 5par5pix-2.jpg")
img=Image.open("5par5pix-1.jpg")
for x in range (largeur):
for y in range (hauteur):
r,v,b=img.getpixel((x,y))
nr,nv,nb=255-r,255-v,255-b
img.putpixel((x,y),(nr,nv,nb))
print(x,y,nr,nv,nb)
img.save("5par5pix-2.jpg")
# mise en niveau de gris
print("test 3 niveau de gris - enregistrement 5par5pix-3.jpg")
img=Image.open("5par5pix-1.jpg")
for x in range (largeur):
for y in range (hauteur):
r,v,b=img.getpixel((x,y))
gris=int((r+v+b)/3)
img.putpixel((x,y),(gris,gris,gris))
print(x,y,gris,gris,gris)
img.save("5par5pix-3.jpg")