• Aucun résultat trouvé

14 : Traitement d’images

N/A
N/A
Protected

Academic year: 2022

Partager "14 : Traitement d’images"

Copied!
4
0
0

Texte intégral

(1)

Lycée Louis-Le-Grand,Paris 2020/2021 MPSI 4– Informatique pour tous

N. Carré, A. Troesch

TP n

o

14 : Traitement d’images

Problème– Manipulation d’images

L’objectif de ce TP est de manipuler des images via Python. Pour cela, nous utiliserons les bibliothèques numpy et matplotlib étudiées rapidement en début d’année. Pour pouvoir utiliser correctement ces bibliothèques, on prendra garde à lancer la bonne version de Pyzo, à savoir celle qui se trouve dansD:\pyzo2015a\IEP.exeen salle VH244, sur le bureau en salle VH241. On importera les bibliothèques avec :

In [1]: import numpy as np

In [2]: from matplotlib import pyplot as plt

Rappelons-le, lesnumpy.ndarray sont des tableauxet non des listes, c’est-à-dire (entre autres) qu’ils sont de taille fixe (pas de append) et que tous les éléments contenus doivent être du même type. De plus, les opérateurs + et * n’effectuent pas de la concaténation ou de la concaténation itérée, mais de l’addition ou multiplication terme à terme.

In [3]: t = np.array([1, 2]) In [4]: 3 * t

Out[4]: array([3, 6]) In [5]: t + t

Out[5]: array([2, 4])

On pensera à utiliser la commande copy pour copier un tableau ou np.zeros pour créer une matrice de zéros (en précisant si besoin le type, qui par défaut correspond aux flottants) :

In [6]: s = t.copy() In [7]: np.zeros((3, 2)) Out[7]:

array([[0., 0.], [0., 0.], [0., 0.]])

Pour ce TP, nous manipulerons l’image lena.png, disponible à l’adresse http://alain.troesch.free.fr/. Cette photo de Lena Söderberg publiée dans le magazine Playboy en 1972 est devenue une référence en matière de tests en traitement d’images. Après l’avoir enregistrée sur votre ordinateur (dans un dossier personnel), il sera possible de l’ouvrir en précisant le chemin complet de l’image, puis de l’afficher via Python (le format après ouverture est un tableaunumpy.ndarray) :

lena = plt.imread("U:/Chemin/du/dossier/lena.png") plt.imshow(lena)

plt.show()

Attention, les classiques\des chemins de Windows doivent être remplacés par des/ou des\\dans la commande.

On rappelle qu’on peut récupérer les dimensions d’un tableau numpyimsoit en utilisantlensur chaque composante, soit directement en tapant la commande (pour un tableau à 3 dimensions, ce qui sera le cas des images manipulées) :

n, p, q = im.shape

1

(2)

Partie I – Prise en main

Une image en couleurs est représentée par une matrice de pixels, chaque pixel correspondant à un triplet de valeurs numériques. Ainsi, les valeurs numériques sont comprises entre 0 et 1. À chacune des composantes est associée une couleur primaire rouge, vert ou bleu : c’est le codage RGB (red, green, blue). Un pixel noir sera codé par p0,0,0q et un pixel blanc parp1,1,1q. Lorsque les trois composantes prennent la même valeur, cela code une certaine nuance de gris (le noir et le blanc en font partie et il y en a plus que 50). Lorsqu’une seule des composantes est non nulle, l’image prend un teinte de la couleur primaire associée.

1. Écrire des fonctionsrouge(im),vert(im)et bleu(im)qui prennent chacune un tableau correspondant à une image et renvoie un tableau correspondant à la même image où on a effacé les nuances des deux autres couleurs primaires. On vérifiera leur bon fonctionnement en les affichant.

2. Écrire une fonctionsymetrie(im)qui renvoie la transformée par symétrie verticale et une fonctionrotation(im) qui renvoie l’image pivotée de900dans le sens direct.

Partie II – Niveaux de gris

Pour convertir une image en couleurs en une image en noir et blanc, il faut convertir chaque pixel en niveau de gris.

Pour cela, on associe à chacune des trois composantes la même valeur appeléeluminance, qui représente la luminosité du pixel. Il existe plusieurs formules permettant de trouver la luminance associée à un pixel, mais nous utiliserons celle-ci :

x“0,2126ˆR`0,7152ˆG`0,0722ˆB 3. Écrire une fonctiongris(im)qui renvoie l’image en noir et blanc.

On cherche à augmenter le contraste de l’image précédente, c’est-à-dire à rendre plus sombres les pixels sombres et plus lumineux les pixels lumineux.

Pour cela, on applique une transformation affine à la luminancexd’un pixel, selon un coefficient de contraste : fpxq “aˆ px´0,5q `0.5

Le contraste augmentera siaą1. Attention, on remplacera une valeur négative par0 et une valeur plus grande que 1par1.

4. Écrire une fonctioncontraste(im, a)qui renvoie une image contrastée selon un coefficienta. L’image donnée en argument devra être une image en niveaux de gris.

2

(3)

Partie III – Photomaton

On souhaite découper l’image en 4 petites comme des photos d’identité faites dans un photomaton. Pour ce faire, on considère les pixels par blocs de 4 (2ˆ2), pour lesquels les quatre pixels se retrouveront dans une des 4 images différentes. Pour effectuer cette transformation, il est nécessaire que les dimensions de l’image d’origine soient paires.

Attention : aucun pixel ne doit disparaître lors de cette transformation, ils sont juste déplacés ! 5. Écrire une fonctionphotomaton(im)qui effectue cette transformation.

6. Afficher la254789542147e itération dephotomaton surlena.png.

Partie IV – Stéganographie

Pour cette partie, on utilisera des codes RGB codés sur 24 bits : chaque composante est codée sur un octet (donc entre 0et 255). On convertira alors le tableau de flottants entre transformant les valeurs en entiers, grâce à la commande :

steg2 = (255 * steg[:,:,:3]).astype(np.uint8)

La stéganographie consiste à cacher un message dans un autre. Il est ainsi possible de cacher une image dans une autre selon le procédé suivant : en considérant que chaque couleur primaire d’un pixel est codée sur un octet, il est possible d’« arrondir » ces valeurs au multiple de 16 le plus proche. Ainsi, le code couleur ne nécessitera que 4 bits (ceux de poids fort) sur les huit disponibles. On utilise alors les 4 bits restant pour y cacher une image.

7. Écrire une fonctionretrouve(im) qui prend une image stéganographiée et renvoie l’image cachée. Retrouver l’image cachée derrière l’imagepy094-steg.png.

8. Écrire une fonctionsteganographie(im1, im2)qui cache l’image 1 dans l’image 2.

Il reste une image cachée dans l’image précédente, à vous de la retrouver. . .

Partie V – Réduction du nombre de couleurs

On cherche à recolorer une image en diminuant le nombre de couleurs. Pour ce faire, on utilise un algorithme itératif selon le principe suivant :

‚ on crée une listeLdeN couleurs choisies aléatoirement,N étant le nombre de couleurs qu’on souhaite obtenir ;

‚ on répète le processus suivant tant qu’il y a des modifications effectuées (ou jusqu’à un nombre limite d’itéra- tions) :

˚ pour chaque pixel de l’image I, on détermine la couleur L dont ce pixel est le plus proche (au sens d’une distance euclidienne, en utilisant les trois coordonnées du code RGB) ;

˚ on crée une listeN Lde tailleN, telle queN Lrisest la couleur qui est le barycentre (c’est-à-dire la moyenne composante par composante) des pixels dontLrisest le plus proche ;

˚ on recolore chaque pixel deI par la couleurN LrissiLrisest le plus proche de ce pixel ;

˚ on remplaceLparN L.

Un exemple avec 10 couleurs 3

(4)

Les tableauxnumpyne sont pas optimisés pour faire un parcours des pixels avec des boucles. Pour gagner en complexité, au lieu de travailler avec des tableaux de tableaux de couleurs (qui sont des tableaux de taille 3), on choisira de transformer une image en liste de listes de couleurs. Après avoir fait les transformations, on pensera à reconvertir la liste de liste en tableau. On pourra utiliser les commandes suivantes pour faire les conversions :

im_liste = [[c.copy() for c in ligne] for ligne in im_tableau]

im_tableau = np.array(im_liste)

9. Écrire une fonctioncouleur_proche(pixel, L)qui prend en argument un tableau de taille 3 correspondant à une couleur, et une listeLde couleurs, et renvoie l’indiceitel queL[i]est la couleur la plus proche depixel.

10. Écrire une fonctioniteration(I, L)qui calcule une itération du processus décrit précédemment et renvoie le coupleNI, NLcorrespondant à l’image modifiée et la nouvelle liste de couleurs.

11. En déduire une fonctionrecoloration(im, N, k)qui prend en argument une imageimet un entierNcorres- pondant au nombre de couleurs autorisées et renvoie l’image modifiée selon l’algorithme décrit précédemment, en effectuant au plusk itérations. On pourra utiliser la commande suivante pour créer une liste aléatoire de couleurs :

L = [np.random.rand(3) for i in range(N)]

Remarque –Le temps de calcul peut être assez long, même avec des listes. Comptez de l’ordre de 10 à 30 secondes par itération.

4

Références

Documents relatifs

Dans un premier temps, on r´ epondra aux questions ` a l’´ ecrit puis pour v´ erifier que nos algorithmes sont bien ´ ecrits, on les programmera sur machine.. Exercice

[r]

Question 5 : en ne considérant que les 5 mois d’hiver (novembre à mars), donner une estimation de la production d’énergie électrique sur une année pour l’ensemble

Pendant qu’un demi groupe travaillait sur ordinateur avec le professeur d’espagnol, l’autre demi groupe était au CDI avec le documentaliste (non hispanisant) pour préparer un

Écrire une fonction Y(pix) qui prend en argument une liste de trois valeurs correspondant à un pixel au format RVB et qui renvoie la valeur Y du niveau de gris dans l’espace

Écrire une fonction erasemulti qui prend en argument une liste d’entiers lis et qui renvoie une liste lismul de même taille que lis et dont les valeurs sont lismul[i]=0 si lis[i] est

** Exercice 7 (1) : Écrire en Python une fonction qui prend en entrée une matrice carrée M de taille n, un indice de ligne i et un indice de colonne j et qui détermine la liste

** Exercice 9 (4) : Écrire en Python une fonction qui prend en entrée une matrice carrée M de taille n, un indice de ligne i et un indice de colonne j et qui détermine la liste