====== TP1 - Recherche par similarité par histogrammes de couleur. ====== Objectif : se familiariser avec python, numpy, matplotlib et effectuer quelques traitements élémentaires sur des images. ===== Lecture et traitement d'une image ===== Voir le tutoriel : https://matplotlib.org/users/image_tutorial.html \\ Documentation numpy : https://docs.scipy.org/doc/numpy-1.15.0/user/quickstart.html \\ Documentation python : https://docs.python.org/3.7/tutorial/ lancer avec interface graphique : ipython --matplotlib puis : %autoindent import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np Charger une image jpeg : img=mpimg.imread('votre_image.jpg') Commandes utiles (à essayer) : img.ndim img.shape img img[0] img[0].shape img.shape[0] img.shape[1] img.shape[2] lum_img = img[:,:,0] lum_img.shape plt.imshow(lum_img, cmap="gray") plt.imshow(lum_img, cmap="hot") h = np.zeros( (4,4,4) ) h h.ndim h.shape Exercice : calcul de l'histogramme tridimensionnel RGB en 4x4x4 d'une image jpeg et comparaison par distance du Chi2 entre deux images Pour le calcul de l'histogramme, il ne faut pas ultiliser la fonction de matplotlib (qui ne fonctionne que pour le cas monodimensionnel). Il faut parcourir les pixels de l'image et pour chacun, incrémenter la valeur de la case correspondante de l'histogramme. Récupérer une dizaine d'images JPEG, calculer les histogrammes pour toutes puis en choisir une comme image requête et classer les autres par similarité visuelle évaluée selon leurs histogrammes et la distance du Chi2. Afficher la requête et la liste de résultats. Normaliser les histogrammes (L1) et tester avec la même image à des tailles différentes. Affichage des histogrammes : il n'est pas nécessaire d'afficher les histogrammes pour ce TP, il est juste prévu de les comparer avec une distance Chi2. Si toutefois vous voulez les visualiser, la fonction plt.hist calcule l'histogramme avant de l'afficher. S'il est déjà calculé et qu'il n'y a plus qu'à l'afficher, la méthode suivante fonctionne : plt.hist(range(0,64),64,weights=np.ravel(h)) On doit aussi pouvoir afficher avec une couleur pour chaque barre comme dans l'exemple du cours mais il faut utiliser une séquence d'histogrammes, contenant chacun juste une barre, parce qu'une couleur ne peut être associée qu'à un histogramme entier et pas juste à une barre.