====== 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/fr/3.5/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))
Pour vérification, l'histogramme RGB 4×4×4 de l'image
{{:2008_000015.jpg|2008_000015.jpg}}
[[http://mrim.imag.fr/voc10/images/2008_000015.jpg|http://mrim.imag.fr/voc10/images/2008_000015.jpg]] est :
0.452789 0.045333 0.039810 0.000000
0.011272 0.014196 0.012398 0.000037
0.000000 0.000000 0.000031 0.000000
0.000000 0.000000 0.000000 0.000000
0.025755 0.004826 0.000917 0.000000
0.018153 0.118135 0.017584 0.003156
0.000000 0.001872 0.002043 0.000312
0.000000 0.000000 0.000000 0.000000
0.000049 0.000000 0.000000 0.000000
0.000018 0.007131 0.001205 0.000116
0.000000 0.005645 0.145388 0.001853
0.000000 0.000000 0.003835 0.000361
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.006612 0.000147
0.000000 0.000000 0.035187 0.023835
Ce affichage correspond à l'ordre h[r][g][b] :
h[0][0][0] h[1][0][0] h[2][0][0] h[3][0][0]
h[0][1][0] h[1][1][0] h[2][1][0] h[3][1][0]
h[0][2][0] h[1][2][0] h[2][2][0] h[3][2][0]
h[0][3][0] h[1][3][0] h[2][3][0] h[3][3][0]
h[0][0][1] h[1][0][1] h[2][0][1] h[3][0][1]
h[0][1][1] h[1][1][1] h[2][1][1] h[3][1][1]
h[0][2][1] h[1][2][1] h[2][2][1] h[3][2][1]
h[0][3][1] h[1][3][1] h[2][3][1] h[3][3][1]
h[0][0][2] h[1][0][2] h[2][0][2] h[3][0][2]
h[0][1][2] h[1][1][2] h[2][1][2] h[3][1][2]
h[0][2][2] h[1][2][2] h[2][2][2] h[3][2][2]
h[0][3][2] h[1][3][2] h[2][3][2] h[3][3][2]
h[0][0][3] h[1][0][3] h[2][0][3] h[3][0][3]
h[0][1][3] h[1][1][3] h[2][1][3] h[3][1][3]
h[0][2][3] h[1][2][3] h[2][2][3] h[3][2][3]
h[0][3][3] h[1][3][3] h[2][3][3] h[3][3][3]