TD 11 - Images
I - Mon image à moi
1. Télécharger une image en couleurs depuis internet. (les nus de M.Mollier sont interdits)
2. Ecrire un programme qui charge votre image couleurs dans un tableau imgCOL puis qui ache votre image.
Quelle est la résolution de votre image ?
3. Ecrire une fonction grayscale(i) prenant en argument une image couleur (sous forme de tableau 3D) et renvoyant le tableau 2D correspondant à l'image i convertie en niveaux de gris,
puis acher votre image convertie par grayscale.
On travaillera désormais avec img=grayscale(imgCOL) et on considèrera que votre variable img est globale, an de ne pas la passer en paramètre dans chacune des fonctions à venir.
II - Seuillage / Contraste
1. Ecrire une fonction seuillage(s) prenant en argument un entier s∈[0,255]et achant votre image de telle sorte que tous les pixels de luminosité6s apparaissent en noir pur, et ceux>s en blanc pur.
2. Créer une fonction f(t,a) prenant en argument des réels t∈[0,1]et a∈]0,12[,
et renvoyant la valeur defa(t)oùfa est ane par morceaux et passe par les points(0,0),(a,0.25),(1−a,0.75)et(1,1). 3. Avec Python, dessiner le graphe de la fonctionf1
10.
4. Ecrire une fonction contraste(a) achant votre image dont chaque pixel est transformé à l'aide de la fonctionfa. Quelle valeurs de a augmentent le contraste ? Quelles valeurs de a le diminuent ?
Eectuer des tests d'achage avec diérents paramètres a et voir comme c'est joli.
Nouvelle instruction : plt.figure()
plt.figure() # cette instruction est hors programme plt.implot(img1,cmap="gray")
plt.figure()
plt.implot(img2,cmap="gray")
plt.show() # cela affiche les images dans 2 fenêtres séparées !
III - Compression d'images en noir et blanc
On considère une image en pur noir et blanc, représentée par une matrice de taille n×pdont les coecients valent 0 pour noir et 1 pour blanc.
An d'économiser de la place sur le disque dur, une image a été enregistrée dans un chier sous forme d'une liste d'entiers.
L'entier numéro 0 est le nombre de pixels en largeur.
L'entier numéro 1 est le nombre de pixels en hauteur.
L'entier numéro 2 est la couleur du pixel le plus en haut à gauche. (0 ou 1)
Les entiers suivants codent le nombre de pixels de couleurs identiques si on imagine qu'on a disposé tous les pixels de l'image à la queue leu leu ligne après ligne, c'est-à-dire dans l'ordre (0,0) , (0,1) , ... , (0,p-1) , (1,0) , (1,1) , ... , (1,p-1) , (2,0) , ... etc
Par exemple, la liste [4, 5, 1, 5, 2, 2, 2, 9] représenterait l'image
1. Ecrire une fonction uncompress(L) prenant en argument une liste d'entiers au format compressé présenté ci-dessus, et renvoyant une matrice de 0 et de 1 représentant l'image décompressée.
On s'assurera que uncompress([4, 5, 1, 5, 2, 2, 2, 9]) renvoie bien la liste [ [1,1,1,1], [1,0,0,1], [1,0,0,1], [1,1,1,1] ,[1,1,1,1] ]
2. Le chier "moijamais.txt" contient une liste d'entiers représentant une image mystère, compressée au format présenté ci-dessus... ;)
1
IV - Redimensionnement - Force 1 : interpolation linéaire
1. Ecrire une fonction pixel(iR,jR) qui prend en argument des coordonnées réelles (iR,jR) et qui renvoie la moyenne des pixels de la case(biRc,bjRc)et de ses voisines ( 8 au maximum ),
sachant que chaque case voisine est pondérée par sa distance entre son centre et le point (iR,jR).
2. En déduire une fonction redimensionner(ny,nx) qui renvoie le tableau 2D de votre image img redimensionnée en taille (ny,nx) à l'aide de pixel.
Faire des essais avec votre image et voir combien c'est joli... ou moche...
V - Redimensionnement - Force 2 : Seam carving
Pour chaque pixel(i, j), on dénit son énergiee(i, j) =abs(img[i-1][j]-img[i+1][j]) + abs(img[i][j-1]-img[i][j+1]) (et si un point img[y][x] déborde de l'image, celui-ci est remplacé par img[i][j])
1. Ecrire une fonction energie() renvoyant un tableau 2D de même taille que img et dont chaque case contient l'énergie du pixel dans img.
2. Acher l'image dont l'intensité des pixels vaut l'énergie de ce pixel dans img
Remarque : l'instruction plt.imshow(A,cmap='gray') ache automatiquement des pixels allant du noir au blanc, en calculant le min et le max de A
•Pour une image de largeur wet de hauteurh,
on appellera "colonne tordue" toute suite de pixels de coordonnées i, xi
i∈[[0,h−1]]où∀i∈[[1, h−1]],|xi−xi−1|61.
•Nous allons réduire la largeur de l'image de`pixels de la façon suivante :
`fois de suite, on va enlever à l'image sa "colonne tordue" d'énergie minimale. (l'énergie d'une colonne étant la somme des énergies des pixels qui la composent)
3. Ecrire une fonction energieMin() qui renvoie un tableau 2D de même taille que img et dont chaque case contient l'énergie minimale d'une colonne tordue qui serait partie de n'importe où sur la 1ère ligne et qui se serait arrêtée sur cette case.
(au besoin, lire la page wikipedia sur le "seam carving" )
4. Ecrire une fonction supprime() qui supprime la colonne tordue d'énergie minimale de img.
5. Eectuer supprime() jusqu'à avoir divisé par 2 la largeur de votre image initiale.
Comparer le résultat obtenu avec celui de redimensionner.
2