NSI,2022-2023,Traitement Image, suite

1. Filtre moyen

Il existe de nombreux filtres que l’on peut appliquer à une image.
Le filtre moyen consiste à remplacer la couleur de chaque pixel par la moyenne des couleurs des pixels mitoyens.
Par exemple, si la taille du filtre est 3, on remplacera la couleur du pixel central par la moyenne des couleurs des pixels situés dans le carré de côté 3 et centré sur ce pixel.
Pour une taille de filtre de 5, on considèrera les 25 pixels situés dans le carré de côté 5.

Recopier et compléter les fonctions moyenne() et adoucissement()

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

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

2. Pixelisation d’une image

On considère un carré de côté c placé au coin supérieur gauche de l’image et qui se déplace horizontalement ou verticalement par translation de longueur c.
On change la couleur de chaque pixel situé dans ce carré par la valeur moyenne des pixels contenus dans celui-ci.
On obtient alors un phénomène de pixelisation de l’image.
Ci-dessous un exemple de pixelisation pour c = 3

pixelisation pour c = 9

3. Filtre vert

On considère les deux images ci-dessous.
Créer une fonction incrustation() qui permet d’incruster la première dans la seconde.

On essaiera de limiter les bords verts au minimum.

Proposition de correction du filtre moyen et de la moyenne :

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() # méthode propre à la classe Image


def moyenne(img,x,y,c):
    moyenne_r,moyenne_v,moyenne_b=0,0,0
    compteur=0
    (l, h) = taille(image)
    for y1 in range(y-c//2,y+1+c//2):
        for x1 in range(x-c//2,x+1+c//2):
            if x1>=0 and x1<l and y1>=0 and y1<h:
                compteur+=1
                couleur = lire_pixel(image,x1,y1)
                moyenne_r+=couleur[0]
                moyenne_v+=couleur[1]
                moyenne_b+=couleur[2]
    return moyenne_r//compteur,moyenne_v//compteur,moyenne_b//compteur

def filtre_moyenne(img,c):
    image_retour=img.copy()
    (l, h) = taille(image)
    for y in range(h):
        for x in range(l//2):
            nouvelle_c=moyenne(img,x,y,c)
            image_retour=changer_pixel(image_retour,x,y,nouvelle_c)
    afficher(image_retour)
    return image_retour