Stage ÉNS Lyon 2013 Cours/TP Python Manipulations d’images Samedi 29 juin 2013 [email protected] Exercice 1 Créer un dossier de travail. Dedans, créer deux sous-répertoires FilesIn/ et FilesOut/. Placer joconde.bmp dans FilesIn/. Lancer Python. CTRL S ; F5 1 Manipulation des fichiers bitmap Quoi THE librairie... Ouverture (en lecture) Récupérer la taille Conversion en niveaux (Levels) de gris Sauvons Mona Lisa Si on préfère le jpg... ou le pdf... Comment import Image Mona = Image.open(’FilesIn/joconde.bmp’) Mona.size MonaBlack = Mona.convert(’L’) MonaBlack.save(’FilesOut/jocondeBW.bmp’) Mona.save(’FilesOut/joconde.jpg’) Mona.save(’FilesOut/joconde.pdf’) Les données sont accessibles via la méthode getdata(), qui fournit un objet pouvant être transformé en liste. Pour le travail inverse, il s’agit de la méthode putdata(). Si on travaille avec numpy (et c’est bien pratique...), on passera par des array. Quoi Extraire les données... et en faire une liste (linéaire) Mettre les données dans un tableau numpy Créer une image depuis la liste de ses pixels Pareil... depuis le tableau de ses pixels 2 Comment donnees = MonaBlack.getdata() ldonnees = list(donnees) bar = numpy.array(MonaBlack) MonaAgain = Image.new(MonaBlack.mode,MonaBlack.size) MonaAgain.putdata(ldonnees) OneMoreMona = Image.fromarray(bar,mode=’L’) Exercices 2.1 Distribution de niveaux de gris Faisons comme s’il n’existait pas de méthode histogram() faisant ce qu’on imagine... Exercice 2 L’image noir et blanc de Mona Lisa nous fournit 350 × 540 pixels, qui sont des entiers entre 0 et 255. Déterminer la loi de répartition de ces pixels (bref : une liste de 256 éléments décrivant le nombre de pixels ayant telle valeur). Sauver ces valeurs (ainsi que les sommes cumulées) dans un fichier csv. Comparer avec la méthode histogram(). Enfin, regarder l’effet de cette méthode sur une image en couleur. L’exercice suivant est réservé à ceux qui connaissent déjà matplotlib. Les autres iront voir le corrigé ! Exercice 3 Représenter l’histogramme de la Joconde avec matplotlib. Exercice 4 Comparer l’histogramme de Mona Lisa lorsqu’elle passe du format bmp au format jpg. 1 2.2 Floutage Pour flouter une image, un procédé raisonnable consiste à remplacer chaque pixel par la moyenne des pixels sur un certain voisinage (typiquement, les 9, 25 ou 49 voisins...). Si on travaille en couleurs, on fait la même chose sur chaque composante RGB. On va travailler avec numpy, qui offre ici trois avantages : – on récupère un tableau au bon format (au passage, ses dimensions sont données par le champ shape du tableau) ; – on peut « slicer » facilement un sous-tableau via t[i1:i2 , j1:j2], et on fait facilement la somme d’un tel sous-tableau via numpy.sum. – les calculs sont censés être rapides (mouais...). Exercice 5 Écrire une fonction réalisant le floutage d’une image (noir et blanc, ou RGB, composante par composante). 2.3 Découpage et collage Exercice 6 Mettre un bandeau bleu sur les yeux de Mona Lisa. Exercice 7 Échanger deux zones rectangulaires de la Joconde. 3.1 Annexes L’histogramme Distribution des pixels pour la Joconde 1.0 Distribution; somme normalisée 3 0.8 0.6 0.4 0.2 0.00 32 64 96 128 160 Niveaux de gris 192 Figure 1 – Mona Lisa dévoilée 2 224 256 3.2 Floutage Figure 2 – Les effets terribles du floutage 3.3 Copier/coller Figure 3 – Mona Lisa préfère ne plus voir ces bêtises 3