Le code complet :
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
# calcul de valeur moyenne
def moyenne(img,x,y,c):
'''
calcule la moyenne des pixels du carré de côté c
centré sur le pixel de coordonnées (x,y)
return : tuple de type (R,V,B)
attention aux pixels sur le bord de l'image
'''
R_moyenne=0
V_moyenne=0
B_moyenne=0
(l, h) = taille(img)
d=int((c-1)/2)
n=0
for i in range(x-d,x+d+1):
for j in range(y-d,y+d+1):
if (i>=0) and (i<=l-1) and (j>=0) and (j<=h-1) :
n+=1
pixel=lire_pixel(img,i,j)
R_moyenne+=pixel[0]
V_moyenne+=pixel[1]
B_moyenne+=pixel[2]
R_moyenne=int(R_moyenne/n)
V_moyenne=int(V_moyenne/n)
B_moyenne=int(B_moyenne/n)
return (R_moyenne,V_moyenne,B_moyenne)
# filtre moyenne
def filtre_moyenne(img,c):
'''
remplace tous les pixels de l'image
par la valeur moyenne calculée sur le
carré de côté c pixel
'''
image_retour=img.copy()
(l, h) = taille(img)
for x in range(0,l):
for y in range(0,h):
nouvelle_couleur=moyenne(img,x,y,c)
# on remplace la couleur des pixels du carré par leur moyenne
image_retour=changer_pixel(image_retour,x,y,nouvelle_couleur)
afficher(image_retour)
return image_retour
# pixelisation
def pixelisation(img,c):
image_retour=img.copy()
(l, h) = taille(img)
for x in range(0,l-c,c):
for y in range(0,h-c,c):
nouvelle_couleur=moyenne(img,x,y,c)
# on remplace la couleur des pixels du carré par leur moyenne
for i in range(x,x+c):
for j in range(y,y+c):
image_retour=changer_pixel(image_retour,i,j,nouvelle_couleur)
afficher(image_retour)
return image_retour
# superposition image fond vert
def superposition():
img=Image.open("seoul.jpg")
image_incrustee=Image.open("JCVD.jpg")
(l, h) = taille(image_incrustee)
(l1,h1)=taille(img)
l=min(l,l1)
h=min(h,h1)
image_retour=Image.new('RGB',(l,h) , color=0) # on crée une image vide
pixel=lire_pixel(image_incrustee,1,1)
r=pixel[0]
v=pixel[1]
b=pixel[2]
t=100 # tolerance
for x in range(0,l):
for y in range(0,h):
fond=lire_pixel(image_incrustee,x,y)
if (fond[0]>r-t) and (fond[0]<r+t) and (fond[1]>v-t) and (fond[1]<v+t) and (fond[2]>b-t) and (fond[2]<b+t) :
# on remplace la couleur des pixels du carré par leur moyenne
nouvelle_couleur=lire_pixel(img,x,y)
image_retour=changer_pixel(image_retour,x,y,nouvelle_couleur)
else :
nouvelle_couleur=lire_pixel(image_incrustee,x,y)
image_retour=changer_pixel(image_retour,x,y,nouvelle_couleur)
afficher(image_retour)
return image_retour
Le filtre moyenne en action:
Le filtre pixelisation :
La fonction superposition de 2 images dont l’une avec un fond vert :