from PIL import Image # on importe la classe Image et ses méthodes de la
# bibliothèque Pillow alias PIL
image = Image.open("Mona_lisa.jpg") # Chargement d'une image avec PIL
# image est déclarée comme un objet de la classe Image de PIL
def taille(img):
return img.size # méthode propre à la classe Image
def format(img):
return img.format # méthode propre à la classe Image
def lire_pixel(img,x,y):
return img.getpixel((x,y)) # méthode propre à la classe Image
def changer_pixel(img,x,y,couleur):
image=img
image.putpixel((x,y),couleur) # méthode propre à la classe Image
return image
def afficher(img):
img.show()
# premieres fonctions de traitement de l'image
def eclaircir(img,e):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image_retour,x,y)
nouvelle_c=(c[0]+e,c[1]+e,c[2]+e)
image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
afficher(image_retour)
return image_retour
def canal_R(img):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image_retour,x,y)
nouvelle_c=(c[0],0,0)
image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
afficher(image_retour)
return image_retour
def canal_V(img):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image_retour,x,y)
nouvelle_c=(0,c[1],0)
image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
afficher(image_retour)
return image_retour
def canal_B(img):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image_retour,x,y)
nouvelle_c=(0,0,c[2])
image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
afficher(image_retour)
return image_retour
def superposition(img):
img1=canal_R(img)
img2=canal_V(img)
img3=canal_B(img)
image_retour=Image.new('RGB',taille(img1) , color=0) # on crée une image vide
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c1 = lire_pixel(img1,x,y)
c2 = lire_pixel(img2,x,y)
c3 = lire_pixel(img3,x,y)
nouvelle_c=(c1[0]+c2[0]+c3[0],c1[1]+c2[1]+c3[1],c1[2]+c2[2]+c3[2])
image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
afficher(image_retour)
return image_retour
def symetrie(img):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image,x,y)
image_retour=changer_pixel(image_retour,l-1-x,y,c)
afficher(image_retour)
return image_retour
def symetrie_1(img):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image_retour,x,y)
image_retour=changer_pixel(image_retour,l-1-x,y,c)
afficher(image_retour)
return image_retour
def symetrie_2(img):
image_retour=img.copy()
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c = lire_pixel(image_retour,l-1-x,y)
image_retour=changer_pixel(image_retour,x,y,c)
afficher(image_retour)
return image_retour
def photomaton(img):
'''
ne fonctionne qu'avec une image de dimensions paires
'''
image_retour=img.copy()
(l, h) = taille(image)
l1=int(l/2)
h1=int(h/2)
for x in range(0,l-1,2):
for y in range(0,h-1,2):
pixel1 = lire_pixel(img,x,y)
pixel2 = lire_pixel(img,x+1,y)
pixel3 = lire_pixel(img,x,y+1)
pixel4 = lire_pixel(img,x+1,y+1)
x1=int(x/2)
y1=int(y/2)
image_retour=changer_pixel(image_retour,x1,y1,pixel1)
image_retour=changer_pixel(image_retour,x1+l1,y1,pixel2)
image_retour=changer_pixel(image_retour,x1,y1+h1,pixel3)
image_retour=changer_pixel(image_retour,x1+l1,y1+h1,pixel4)
afficher(image_retour)
return image_retour
def boucle_photomaton(img,n):
image_retour=img.copy()
for i in range(n):
image_retour=photomaton(image_retour)
return image_retour
def difference(img1,img2):
image_retour=Image.new('RGB',taille(img1) , color=0) # on crée une image vide
(l, h) = taille(image)
for y in range(h):
for x in range(l):
c1 = lire_pixel(img1,x,y)
c2 = lire_pixel(img2,x,y)
nouvelle_c=(c1[0]-c2[0],c1[1]-c2[1],c1[2]-c2[2])
if nouvelle_c!=(0,0,0):
return False
image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
afficher(image_retour)
return image_retour
L’image originale :
Retour de la commande eclaircir(image,50) :
Retour de la commande eclaircir(image,-50) :
Retour des commandes canal_R(image),canal_V(image),canal_B(image).
La fonction superposition(image) superpose les valeurs des 3 images précédentes.
Les fonctions symetrie, symetrie_1 et symetrie_2
Un examen de ces trois fonctions peut-être utiles. Comprendre le fonctionnement des deux dernières est formateur.
La fonction photomaton()
La fonction boucle_photomaton(image,8) avec image = Image.open(« Mona_lisa_reduite.jpg »)
Cette transformation est cyclique parce que les dimensions de l’images Mona_lisa_reduite.jpg ont été choisies spécifiquement.
On peut s’intéresser à ces dimensions pour essayer de comprendre pourquoi cette image possède un cycle de longueur 8.