TP 5 : Traitement d’images avec Numpy - SFR
MPSI 831, PCSI 833
TP 5 : Traitement d'images avec Numpy
Lyc?e Mass?na
Dans ce TP, on va manipuler des images, ? l'aide des tableaux Numpy vus dans le TP 3.
1 Cr?ation d'un r?pertoire de travail
Avant de commencer ce TP, cr?ez un r?pertoire sp?cifique dans votre espace personnel, par exemple TP5_image. R?cup?rer l'annexe sur le site web, que vous pouvez placer dans ce r?pertoire. On va avoir besoin d'indiquer ? Python o? chercher les images pour les charger, le plus simple est de d?finir ce r?pertoire comme r?pertoire de travail. Veuillez indiquer dans l'annexe le chemin vers votre r?pertoire (clic droit sur le dossier Propri?t?s, pour r?cup?rer le chemin).
os.chdir("U:\\Documents\chemin\vers\votre\r?pertoire\TP5_Image") #? modifier dans l'annexe.
Vous pouvez v?rifier que ce changement est bien effectif en tapant os.getcwd() (cwd pour current working directory ).
2 Compl?ment sur les tableaux Numpy
Ex?cutez le code suivant (manipulation de tableaux ? standard ? de type list), il est dans l'annexe :
T=[[0,1],[2,3]] # des tableaux dont les ?l?ments sont des tableaux. U=[[4,5],[6,7]] print(T+U) # concat?nation print(2*T) # concat?nation
Ex?cutez maintenant (manipulation de tableaux Numpy) :
import numpy as np #import? en haut de l'annexe T2=np.array(T) # conversion en tableau numpy. U2=np.array(U) print(T2+U2) # addition terme ? terme. print(2*T2) # multiplication de tous les ?l?ments par 2.
Remarquez qu'avec des tableaux numpy, le produit T2*U2 ne produit pas d'erreur et a bien un sens ici : celui du produit terme ? terme des tableaux, comme pour l'addition. Attention, pour avoir un sens, les op?rations pr?c?dentes doivent se faire sur des tableaux ayant m?me taille :
T=np.array([[0,1],[2,3],[4,5]]) U=np.array([[4,5],[6,7]]) print(T+U) #addition d'un tableau 3*2 avec un tableau 2*2: erreur.
En numpy, les tableaux sont homog?nes : ils repr?sentent un tableau multi-dimensionnel d'?l?ments de m?me type. Pour acc?der ?, ou modifier un ?l?ment d'un tableau Numpy, cela fonctionne comme pour des listes de listes, essayez la s?quence d'instructions :
T=np.array([[0,1],[2,3],[4,5]]) print(T[1]) print(T[1][0]) T[2][0]=10 print(T)
Pour copier un tableau, il faut utiliser la fonction copy de Numpy.
Svartz
Page 1/8
2020/2021
MPSI 831, PCSI 833
Lyc?e Mass?na
T=np.array([[0,1],[2,3],[4,5]]) T2=T # si un ?l?ment de T ou T2 est modifi? alors cette modification sera aussi appliqu?e ? l'autre
# tableau: T et T2 sont deux r?f?rences vers le m?me tableau en m?moire. T3=np.copy(T) # si un ?l?ment de T ou T3 est modifi? alors cette modification ne sera pas visible sur
# l'autre tableau: les ?l?ments ont ?t? recopi?s ailleurs en m?moire. T[0][0]=6 print(T) print(T2) print(T3)
C'est ? peu pr?s tout ce qu'on a besoin de savoir !
3 D?composition d'une image en pixels
Les images qu'on va utiliser sont des images dites matricielles. Elles sont compos?es d'une matrice (tableau) de points color?s appel?s pixels. Le format qu'on utilisera est PNG en ? couleurs vraies ?. Chaque pixel est un triplet de nombres entre 0 et 255 : un nombre pour chaque couleur primaire rouge, vert, bleu. Un tel nombre est repr?sentable sur 8 bits et s'appelle un octet. Il y a donc 2563 = 224 = 16777216 couleurs possibles. On utilise ici la synth?se additive des couleurs : le triplet (0, 0, 0) correspond ? un pixel noir alors qu'un pixel blanc est donn? par (255, 255, 255). Un pixel ? pur rouge ? est cod? par (255, 0, 0).
Voici ci-dessous la d?composition d'une image quelconque 1 en ses trois composantes rouge, verte et bleue.
Remarquez que comme l'image est assez mauve dans l'ensemble (m?lange de rouge et bleu) le contraste entre les parties claires et fonc?es est plus saisissant dans la teinte verte.
La s?quence Python suivante indique comment r?cup?rer un tableau numpy donnant un tableau tridimensionnel, de taille h ? ? 3 o? h est la hauteur de l'image et est sa largeur.
R?cup?ration d'une liste de pixels sous forme de tableau 3D from PIL import Image #importation du sous-module Image du module PIL im=Image.open("\chemin\vers\image.png") #ouverture d'une image au format png dans Python. tab=np.array(im)
R?cup?rez l'image lena.png sur le site web. Enregistrez-l? dans le r?pertoire que vous avez cr?? ? cet effet. Comme c'est maintenant le r?pertoire de travail, vous pouvez normalement ouvrir l'image avec Image.open("lena.png"). Ouvrez l'image lena.png et chargez-la (le code est fourni). Ex?cutez ?galement le code qui suit :
print(tab) #contrairement aux tableaux usuels, tout n'est pas affich? (heureusement !) print(im.size) #im.size renvoie la taille de l'image (largeur x hauteur) print(len(tab)) #nb de sous-tableaux de tab, c'est-?-dire nombre de lignes sur l'image print(len(tab[0])) #nb de sous-sous-tableaux de tab, c'est-?-dire nombre de colonnes print(len(tab[0][0])) #nb de couleurs additives utilis?es, ici 3 : R, V et B print(tab.shape) #renvoie un tuple contenant les ?l?ments pr?c?dents (h, l, 3)
Dans la suite, on va jouer avec les images en les modifiant, Pour cela, il suffit de modifier le tableau numpy associ? (ou d'en cr?er un nouveau). Voyons comment obtenir une image ? partir d'un tableau numpy :
Obtenir une image ? partir d'un tableau nouvelle_image=Image.fromarray(tab) nouvelle_image.show() # pour afficher l'image nouvelle_image.save("nom_de_la_nouvelle_image.png") # pour l'enregistrer au format voulu
1. Pas vraiment quelconque... Cette photo issue d'un num?ro de Playboy de 1972 est devenue l'image la plus utilis?e pour les tests d'algorithmes de traitement d'images.
Svartz
Page 2/8
2020/2021
MPSI 831, PCSI 833
Lyc?e Mass?na
Le tableau Numpy tab doit ?tre compos? d'?l?ments uint8 (c'est-?-dire d'entiers non sign?s 2 cod?s sur 8 bits, soit entre 0 et 255). Si ce n'est pas le cas (flottants, entiers cod?es sur 32 bits...), un message d'erreur comme TypeError: Cannot handle this data type s'affiche. Pour cr?er de nouvelles images, on proc?dera de deux fa?ons :
-- en modifiant un tableau Numpy obtenu ? partir d'une image : le tableau a d?ja le bon type ; -- en cr?ant un nouveau tableau pour le remplir. Dans ce cas, il faudra veiller ? ce que le tableau ait le bon type :
on peut cr?er un tableau de type uint8 ? partir d'un tableau tab qui n'est pas de ce type avec np.uint8(tab). on peut cr?er un tableau rempli de z?ros, de type uint8 avec np.zeros((h, l, 3), dtype="uint8"). Par
d?faut ? l'utilisation de np.zeros, le tableau cr?? est rempli de z?ros flottants. Ici, on pr?cise explicitement que l'on veut que les donn?es soit de type uint8.
4 ? vous de jouer
Dans ce TP, par convention on ?crit des fonctions qui prennent en entr?e des images et qui retournent des images. Par exemple la fonction suivante cr?e une image de la m?me taille que l'image pass?e en entr?e, mais remplie de pixels noirs (elle est fournie) :
from PIL import Image #ces modules sont d?ja import?s en haut de l'annexe import numpy as np
def image_noire(im): t=np.array(im) h,l,r=t.shape #on sait que r=3 for i in range(h): for j in range(l): for k in range(3): t[i][j][k]=0 return Image.fromarray(t)
Remarquez que 0*t aurait ?galement cr?? un tableau de m?me taille rempli de z?ros, mais on fera souvent usage de telles boucles imbriqu?es dans ce TP : i parcourt les indices des lignes, j parcourt les indices des colonnes, k parcourt {0, 1, 2} qui sont les indices des pixels. Il faut que les boucles soient imbriqu?es pour faire parcourir ? (i, j, k) toutes les valeurs [[0, h - 1]] ? [[0, - 1]] ? [[0, 2]]. Une utilisation peut-?tre :
lena=Image.open("lena.png") lena_noire=image_noire(lena) lena_noire.show() #affichage
4.1 D?composition d'une image en ses composantes
Question 1. Ecrire une fonction composante_rouge(im) retournant la composante rouge de l'image pass?e en param?tre. Servez-vous en pour calculer la composante rouge de lena.png. En travaillant sur le tableau associ? ? l'image im, il s'agit simplement de mettre ? 0 les composantes 1 et 2 des pixels.
def composante_rouge(im): ... A COMPLETER ...
lena=Image.open("lena.png") composante_rouge(lena).show()
Le r?sultat attendu est donn? ci-dessous.
2. Entier non sign? signifie entier naturel : la suite de 8 bits s'interpr?te comme vu en cours. Entier sign? serait entier relatif en compl?ment ? deux.
Svartz
Page 3/8
2020/2021
MPSI 831, PCSI 833
Lyc?e Mass?na
Faire de m?me avec les composantes vertes et bleues (on ?crira les fonctions associ?es).
4.2 N?gatif d'une image
Une image n?gative est une image dont les couleurs ont ?t? invers?es par rapport ? l'originale ; par exemple le rouge devient cyan, le vert devient magenta, le bleu devient jaune et inversement. Les r?gions sombres deviennent claires, le noir devient blanc. Pour cela il suffit d'inverser les niveaux de chacune des couleurs primaires : un pixel initialement ? (120, 10, 250) deviendra (135, 245, 5). Question 2. ?crire une fonction negatif(im) retournant l'image n?gative de l'image pass?e en param?tre.
def negatif(im): ... A COMPLETER ...
Le r?sultat attendu pour L?na est le suivant :
4.3 Mise en place d'un cadre autour d'une image
Question 3. ?crire une fonction cadre_noir(im,ep) prenant en entr?e une image, ainsi qu'un (petit) entier ep, renvoyant une nouvelle image, identique ? la pr?c?dente mais dont les pixels situ?s sur les bords de l'image ont ?t? remplac?s par des pixels noirs, sur une ?paisseur ep. Par exemple, le r?sultat attendu pour L?na et une ?paisseur de 5 est donn? ci-dessous.
Une fois votre fonction ?crite, appliquez-la ? L?na avec une ?paisseur de 5.
Svartz
Page 4/8
2020/2021
MPSI 831, PCSI 833
Lyc?e Mass?na
4.4 Rajout d'un cadre autour de l'image
Question 4. ?crire une fonction rajout_cadre(im,ep) fonctionnant comme pr?c?demment, mais retournant une image de taille (h + 2ep, + 2ep) (si l'image initiale a pour taille (h, )), le cadre ayant ?t? ajout? ? l'ext?rieur plut?t que par modification des pixels du bord. Voici le r?sultat avec une ?paisseur de 20 pixels. Le plus simple est de cr?er un nouveau tableau ? la bonne taille (avec np.zeros, dont le comportement a ?t? expliqu? plus haut, attention ? avoir le type uint8), et de le remplir. Rappel : le pixel num?rot? (0, 0) correspond au coin en haut ? gauche d'une image, et (i, j) au pixel situ? ? l'intersection de la i-?me ligne et de la j-?me colonne.
4.5 Conversion d'une image couleur en image en niveau de gris
Dans une image en niveaux de gris, les trois composantes R, V, B de chaque pixel ont la m?me valeur. Celle-ci vaut 0 pour un pixel noir, 255 pour un pixel blanc..
L'oeil est plus sensible ? certaines couleurs qu'? d'autres. Le vert (pur), par exemple, para?t plus clair que le bleu (pur). Pour tenir compte de cette sensibilit? dans la transformation d'une image couleur en une image en niveaux de gris, on ne prend g?n?ralement pas la moyenne arithm?tique des intensit?s de couleurs fondamentales, mais une moyenne pond?r?e. La formule standard donnant le niveau de gris en fonction des trois composantes est :
gris = 0.299 ? rouge + 0.587 ? vert + 0.114 ? bleu o? . d?signe la partie enti?re. Question 5. Ecrire une fonction niveau_gris(im) renvoyant une nouvelle image, en niveau de gris. Les trois niveaux R, V, B d'un pixel sont ?gaux au niveau de gris donn? par la formule ci-dessus. Le r?sultat attendu pour L?na est donn? ci-dessous.
Utilisez votre fonction pour obtenir une image que vous sauvegarderez sous le nom lena_gris.png
4.6 Image au format ? B ?
Dans une image en niveau de gris, les niveaux de rouge, vert et bleu ?tant identiques, les informations sont redondantes. Il existe un format pour stocker des images en noir et blanc (inutile de r?p?ter trois fois la m?me
Svartz
Page 5/8
2020/2021
................
................
In order to avoid copyright disputes, this page is only a partial summary.
To fulfill the demand for quickly locating and searching documents.
It is intelligent file search solution for home and business.
Related download
- binglongfeng e1001928 humanoidrobotnaoplaying
- school of computing national university of singapore cs
- tkinter ucv
- interfata in python folosind pyqt5 ucv
- image handling and processing with python
- digital image processing laboratory image filtering
- tutorial for the lecture applied machine learning
- tp traitement d images noir et blanc avec numpy
- tp 5 traitement d images avec numpy sfr
- implementing data augmentation
Related searches
- d d ideals
- 192 168 0 1 admin password tp link
- tp link 192 168 0 1 admin wireless settings
- 192 168 1 1 admin tp link
- 192 168 1 1 setup tp link
- tp link setup
- tp link router admin page
- 5 edition d d character sheet
- d d 3 5 character sheet pdf
- dsm 5 adjustment d o
- d d 3 5 random encounter generator
- d d 3 5 monster generator