Imprimer
Catégorie : Programmation Python - 2nde SNT
Affichages : 28640

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í, FigueresGala nue...


Installation de la bibliothèque Pillow


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

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!!


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!!


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")