NSI, Traitement image Proposition correction.

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.