Le module matplotlib.image⚓︎

Nous utilisons cette version de la Joconde : MonaLisa.jpg
Le module matplotlib.image permet de transformer une image en une matrice de taille (hauteur x largeur) de composantes couleurs (format [r v b]).
La peinture, remplacée par un nuage de points isolés.⚓︎
Nous allons garder seulement un nombre restreint de pixel de l'image. Ces pixels sont choisis aléatoirement avec en moyenne un point sur 100 retenu, en parcourant le rectangle de l'image de gauche à droite, et de haut en bas.
Voici le code de sélection :
Maintenant, nous avons un dictionnaire nuage, dont les clés sont les coordonnées du pixel et les valeurs la couleur du pixel correspondant dans l'image initiale.
En représentant ce nuage obtenu alétoirement, voici ce que l'on obtient :

Reconstruction d'une image avec l'algorithme des k plus proches voisins.⚓︎
Évidemment, on se demande si l'image va nous évoquer quelque chose qui ressembleau tableau de Léonard de Vinci.
Pour ce qui est de faire tourner l'algorithme, plusieurs questions se posent.
Nous avons en gros 3730 points dans le nuage, et nous voulons pour chacun des points de la taille de l'image Ă reconstruire (746 x 500) trouver les k plus proches voisins.
En voulant faire tourner l'algorithme sans optimisation nous aurions : - le tri des 3730 points du nuages par rapport Ă la distance pour chaque pixel - choix des k plus proches et calcul de la couleur moyenne de ces k points.
Le calcul peut ĂŞtre long...
D'où l'idée de ne pas trier sur tous les points du nuage mais sur une sélection carrée (un cercle pourrait aussi convenir, le carré simplifie les calculs avec la distance de Manhattan) autour du point suffisament grande pour contenir toujours k points, et suffisament petite pour réduire le nuage.
Voici donc notre première étape, écrire une fonction qui retourne une sélection du nuage des points les plus proches du point concerné.
Nous avons aussi besoin de la fonction qui calcule une distance pour trier les points du sous-nuage.
Le choix de la distance de Manhattan est pour accélérer le traitement.
| Text Only | |
|---|---|
Et, au coeur de ce code des k plus proches voisins, une fonction qui prend en entrée le nuage et un point, calcule la sélection du nuage autour de ce point, trie cette sélection et retourne la valeur moyenne (ici la fonction np.mean() est utilisée, elle permet de calculer des moyennes sur les 3 composante de la couleur en manipulant les couleur comme des vecteurs).
Et enfin la boucle pour construire l'image:
| Python | |
|---|---|
Ce code montre une utilisation de l'algorithme des k plus proches voisins (KNN).
Un défi peut être de chercher (avec les connaissances de terminale NSI) quelles structures de données permettent de réduire sa compléxité temporelle.