Traitement de l'image TP n° 5


Écrire votre nom ici

Nom :


L'image pour ce TP

<p style="text-align:left";> </p> Pour utiliser/manipuler des images en Python, il faut utiliser une bibliothèque.

Nous utiliserons la bibliothèque: pillow

Si elle n'est pas déjà installée :

In [0]:
#pip install pillow

Pour ceux qui utilise la version(jupyter) de EduPython:

Exécutez cette cellule au préalable afin d'importer le module display pour l'affichage dans le notebook

In [0]:
from IPython.display import display

Le code suivant affiche l'image

L'image est hébergée sur un serveur et est chargée dans ce notebook

Exécutez le

In [0]:
#chargement des bibliothèques 
from PIL import Image
import requests
from io import BytesIO
# chargement de la photo se trouvant à l'adresse donnée
url=" http://isn-icn-ljm.pagesperso-orange.fr/photo/median4.jpg"
response = requests.get(url)
img = Image.open(BytesIO(response.content))
#affichage de l'image
display(img)

Dans tout ce TP la variable img contient l'image téléchargée depuis le serveur


Filtre médian

Réaliser un filtre médian consiste à partir d'une image en niveau de gris:

  • À remplacer chaque pixel par la valeur médiane de ce pixel et de ses 8 voisins
  • On ne tiendra pas compte des bords de l'image ( ils n'ont pas 8 voisins..)

Le principe

  • Comme l'image est en niveau de gris les composantes (r , v , b) sont égales
  • On stocke dans une liste les valeurs du pixel et de ses 8 voisins
  • On trie la liste par ordre croissant
  • On récupère la cinquième valeur ( la médiane )
  • Le pixel prendra alors cette valeur

Voici le programme qui réalise cette transformation:

In [0]:
#on récupère les dimensions
largeur,hauteur=img.size


#traitement
def median(img):
    #création d'une image vide
    img2=Image.new('RGB',(largeur,hauteur))
    for y in range(1,hauteur-1,1):
        for x in range(1,largeur-1,1):
            liste=[]
            r1,v1,b1=img.getpixel((x-1,y-1))
            liste.append(r1)# stockage de la valeur dans la liste
            r2,v2,b2=img.getpixel((x,y-1))
            liste.append(r2)
            r3,v3,b3=img.getpixel((x+1,y-1))
            liste.append(r3)
            r4,v4,b4=img.getpixel((x-1,y))
            liste.append(r4)
            r5,v5,b5=img.getpixel((x,y))
            liste.append(r5)
            r6,v6,b6=img.getpixel((x+1,y))
            liste.append(r6)
            r7,v7,b7=img.getpixel((x-1,y+1))
            liste.append(r7)
            r8,v8,b8=img.getpixel((x,y+1))
            liste.append(r8)
            r9,v9,b9=img.getpixel((x+1,y+1))
            liste.append(r9)
            liste.sort()# tri de la liste
            r=liste[4] # récupération de la médiane
            img2.putpixel((x,y),(r,r,r))
    return(img2)

var=median(median(img))# appel de la fonction median()
display(img,var)

À faire:

Reprendre l'ensemble avec cette image

<p style="text-align:left";> </p>

In [0]:
# code