Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Table des matières
Quart de tour d'une image
Nous allons étudier un algorithme consistant à partir d'une image et à produire le résultat de la rotation d'un quart de tour de cette image, en place à coût spatial réduit : La lecture de l'image produira un seul gros tableau à deux dimensions et on souhaite ne pas en utiliser d'autres. Toutes les manipulations se feront dans ce tableau.
Nous allons utiliser la méthode diviser pour régner qui sera grandement simplifiée si notre image à des dimensions en puissance de 2, de façon à pouvoir couper en 2 facilement.
Vous pouvez tester avec cette image.
Ouverture du fichier
Suivant les versions de Python, il peut y avoir des choix différents.
module imageio
import imageio import matplotlib.pyplot as plt image = imageio.imread(filename)
imageionous permettra d'ouvrir l'image et de la sauvegardermatplotlib.pyplotnous permettra de l'afficherimageest le tableau obtenu après ouverture
module Pillow
from PIL import Image import matplotlib.pyplot as plt import numpy as np imp = Image.open(filename) image = np.array(imp.getdata()).reshape(imp.size[1], imp.size[0], 3)
PILnous permettra d'ouvrir l'image et de la sauvegardermatplotlib.pyplotnous permettra de l'afficherimageest obtenu après conversion, est un tableau numpy
Tableau numpy
image est un tableau numpy
Quelques commandes :
>>> image.shape # tuple contenant les dimensions (256, 256, 3) # 256 lignes, 256 colonnes, 3 canaux de couleurs >>> image[70, 100] # contenu du pixel ligne 70, colonne 100 [161, 76, 9] # représente les canaux RGB de ce pixel >>> copie = image[10:50, 100:140] # copie une portion du tableau / image >>> image[120:160, 30:70] = copie # contenu de copie copier dans une zone de image >>> image[120:160, 30:70] = image[10:50, 100:140] # idem, sans passer par la copie
Les deux dernières commandes vous montrent comment on peut manipuler des blocs entiers d'image.
Vous avez intérêt à procéder de cette façon car ainsi vous exploitez la vitesse de calcul de numpy qui est optimisé en C, donc infiniment plus rapide que tout ce que vous pourriez faire avec du pur Python.
Voir l'image
Vous pouvez afficher l'image avec
plt.imshow(image) plt.show()
Rotation de zones
Considérons une zone de l'image. Cette zone est carrée de côté taille. Son coin supérieur gauche – marqué en rose – est en ligne, colonne.
À faire : écrivez une fonction qui fasse tourner les zones :
- le contenu de 1 passe en 3,
- le contenu de 3 passe en 4,
- le contenu de 4 passe en 2,
- le contenu de 2 passe en 1.
Ce en fonction du choix de taille', ''ligne et colonne.
La méthode repose sur l'utilisation de numpy qui permet de manipuler efficacement des blocs entiers. S'il fallait manipuler pixel à pixel, la méthode n'aurait aucun intérêt.
Tourner d'un quart de tour récursivement
Dans la fonction précédente on travaillait sur le carré 1234.
Supposons que l'on découpe la zone 1 en 4 zones plus petites, 1'2'3'4', et que l'on applique le même traitement, puis récursivement sur 1'…
À faire : explorez cette idée pour produire un quart de tour de l'image.


