Outils pour utilisateurs

Outils du site


nsi:tds:quart_de_tour

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

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)
  • imageio nous permettra d'ouvrir l'image et de la sauvegarder
  • matplotlib.pyplot nous permettra de l'afficher
  • image est 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)
  • PIL nous permettra d'ouvrir l'image et de la sauvegarder
  • matplotlib.pyplot nous permettra de l'afficher
  • image est 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.

nsi/tds/quart_de_tour.txt · Dernière modification : de goupillwiki