NSI : fin correction tp traitement image

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 :