Échauffement Télécharger le fichier TP8Image.jpg qui se trouve sur CDP.
Mettez-le dans le
même dossier que votre fichier Python actuel, alors les commandes suivantes
transforment l’image en une matrice. Attention, vous devez la première fois que
Exercice 1 ( ‹). Écrire une fonction Moyenne(L) qui, pour une liste L non vide vous exécutez ces commandes utiliser la combinaison CTRL+SHIFT+E, sinon Pyzo
de nombres, renvoie la moyenne des éléments de cette liste. ne trouve pas le fichier 2 .
import matplotlib.pyplot as plt
Listes et Matrices import numpy as np
import imageio
Pour représenter une matrice, on peut 1 l’écrire comme une liste de listes, c’est-
à-dire une liste dont les éléments sont eux-mêmes des listes. Par exemple,
Img=imageio.imread("NomDelImage.jpg").tolist()
L=[[1,2,3],[5,8,-1]] #Convertit une image en liste#cette commande n'est pas à connaître.
peut être vu comme une matrice dont la première ligne est 1,2,3 et la seconde À partir de maintenant, votre image est sous forme d’une matrice notée Img,
est 5,8,-1. Ainsi, L[1][1] vaut 8. De manière générale, L[i][j] est le coefficient lorsque l’on mentionnera l’image, on fera référence à cette matrice Img et non au
à la i-ième ligne et j-ième colonne. Le nombre de lignes est donné par len(L) fichier original TP8Image.jpg. Tester ce que vaut Img[3][5], trouver le nombre
et le nombre de colonnes par len(L[0]). de lignes et de colonnes de Img. Pour afficher l’image Img :
plt.figure()#Commandes non exigibles, crée une nouvelle figure
Attention aux indices qui commencent à 0 plt.imshow(Img)
En python, les lignes et les colonnes des matrices commencent donc à 0 plt.title("Image originale")#Titre de la figure
contrairement aux maths. plt.show()#Affiche la figure
Pour définir une liste de longueur p ne contenant que des 0, on peut utiliser la
commande :
Manipulons les images (comme les média ?)
[0 for j in range(p)] Pour l’instant, Img est une image en couleur, cela veut dire que si i est un numéro
de ligne et j un numéro de colonnes Img[i][j] est une liste de trois nombres
Pour définir la matrice nulle à n lignes et p colonnes, on écrit : représentant l’intensité de rouge, vert et bleu. Pour simplifier ce TP, on va d’abord
transformer cette Image en noir et blanc.
Z=[[0 for j in range(p)] for i in range(n)]
Exercice 2 (‹). Écrire une fonction ConversionNB(Img) qui va transformer
Img en une image en noir et blanc. Pour cela, il suffit de remplacer Img[i][j]
Images en Python (actuellement une liste de trois nombres) par la moyenne de cette liste (grâce à la
fonction moyenne déjà créée). Attention, cette fonction doit directement modifier
Une image en noir et blanc peut être vue comme une matrice M. Pour un couple Img et n’aura donc pas de return. Une fois fait, tester votre fonction avec votre
(i,j) donnée, M[i][j] désigne l’intensité du pixel situé à la ligne i et la co- image. Pour l’afficher, utilisez la commande : plt.imshow(Img,cmap="gray")
lonne j. Cette valeur est traditionnellement donné entre 0 et 255, à 0 le pixel est afin d’indiquer à Python que vous voulez du noir et blanc 3 .
noir, à 255 il est blanc, les valeurs entre 0 et 255 codent un gris plus ou moins
foncé. Exercice 3 (‹). Écrire une fonction Negatif(Img) qui a une image Img, va
Si l’image est en couleur, alors chaque pixel à un niveau de rouge, de vert et renvoyer une autre image qui est son négatif. Plus précisément, à partir de la
de bleu, ainsi M[i][j] au lieu d’être un nombre sera une liste de trois nombres, matrice nulle et de même taille que Img, la valeur d’un pixel de cette image sera
chacun représentant le niveau dans une des trois couleurs. la différence entre 255 et la valeur du même pixel de l’image d’origine.
1. Ce n’est pas la seule possibilité, on peut aussi utiliser les matrices de numpy mais ce n’est 2. Ceci est vraiment propre à Pyzo et pas à Spyder.
pas au programme. 3. Sinon, il essaye de la colorer avec des pseudo-couleurs.
[email protected] PCSI du Lycée Lavoisier, 23-24, TP8 1
Exercice 4 (‹). Écrire une fonction Symetrie(Img) qui retournera l’image sy- liste Img, alors on va convoluer Img avec M plus précisément, la valeur du pixel
métrique de Img par un axe vertical qui passe par le centre de l’image. Pour cela, de la nouvelle image au pixel (i,j) est :
pour un pixel (i,j) et son pixel symétrique (i’,j’) donner une relation entre
d d
i et i’ et j et j’, puis à l’aide de boucles, échanger leur valeur. ÿ ÿ
Imgri ` ksrj ` ℓs ˆ M rd ´ ksrd ´ ℓs
Exercice 5 (‹). Écrire une fonction DessineContours(Img) qui va renvoyer une k“´d ℓ“´d
nouvelle image contenant les contours des objets de l’image Img. Pour cela, créer
Voilà plusieurs matrices qui serviront de filtres :
une nouvelle image P telle que 4
P[i][j]=|Img[i+1][j]-Img[i-1][j]|+|Img[i][j+1]-Img[i][j-1]| 0 0
¨
1{36 0 0
˛
¨ ˛
0 1{4 0 ˚ 0 1{18 1{9 1{18 0 ‹
La fonction abs dans Python renvoie la valeur absolue d’un nombre. ˚ ‹
M1 “ ˝ 1{4 0 1{4 ‚ M2 “ ˚1{36 1{9 2{9 1{9 1{36‹
˚
‹
0 1{4 0 ˝ 0 1{18 1{9 1{18 0 ‚
Rajouter du bruit 0 0 1{36 0 0
¨ ˛ ¨ ˛
0 ´1 0 1 2 1
1
Supposons que l’on souhaite rajouter du bruit, c’est-à-dire que l’on veuille dégra- M3 “ ˝´1 5 ´1‚ C “ J S“˝ 0 0 0 ‚ R “ ST
der sa qualité. Alors, il suffit pour chaque pixel de rajouter un nombre aléatoire. 25
0 ´1 0 ´1 ´2 ´1
Les lignes suivantes font ce travail :
Où J P M5 pRq est la matrice qui n’a que des 1. Concrètement le filtrage par la
def Bruit(Img,r): matrice M1 va remplacer la valeur d’un pixel (i,j) par la moyenne des pixels
"""Crée du bruit d'un niveau r sur une image""" voisins de ce pixel (ceux qui sont directement à gauche, à droite, en haut ou en
n,p=len(Img),len(Img[0]) bas de lui).
B=[[Img[i][j]+r*(np.random.rand()-0.5)
for j in range(p)] for i in range(n)] Exercice 6 ( ‹‹). Écrire une fonction Filtre(Img,M) qui applique le filtre
return B décrit par la matrice M à Img et retourne l’image filtrée. Essayez avec comme
filtre M1 , M2 puis M3 et avec comme image, l’image original puis l’image bruitée,
imageBruit=Bruit(Img,100) à quoi servent ces filtres ? Enfin, appliquez les filtres, dits de Sobel, en appliquant
plt.figure() successivement à la même image les matrices C, S et R. Puis, à partir de la matrice
plt.imshow(imageBruit,cmap="gray") nulle, on mettra à 255 les pixels dont l’intensité de l’image, obtenue après les
plt.title("Image bruitée") filtres de Sobel, dépasse un seuil de 10. À quoi cela sert-il ?
plt.show()
Filtrage par convolution
Pour traiter une image, il est courant d’appliquer un filtre. Un filtre peut essayer
de débruiter l’image (atténuer le bruit), augmenter le contraste, créer une image
avec les contours des objets etc. Pour ce faire ici, les filtres seront des matrices
carrées 5 M “ pmi,j q 0ďiď2d P M2d`1 pRq. Si on a une image représentée par une
0ďjď2d
4. La valeur d’un pixel sera d’autant plus grande que les variations entre les voisins de ce
pixels seront grands. Cela veut dire dans ce cas, qu’on est à une frontière entre deux parties de
l’image de niveaux de gris très différents.
5. Ici, on écrit la matrice en commençant les indices à 0 pour coller aux conventions de
Python.
[email protected] PCSI du Lycée Lavoisier, 23-24, TP8 2