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.