TP n°3 : Radiométrie et géométrie ================================= 1. Visualisation d'un histogramme --------------------------------- La commande chisto calcule l'histogramme numérique d'une image (Cimage), sous la forme d'un tableau (Fsignal) h dont la case i (0<=i<=25) contient le nombre de pixels de l'image ayant le niveau de gris i. La commande splot permet de visualiser un tel signal. Tapez 'h' dans la fenêtre splot pour obtenir la liste des commandes interactives. chisto src histo splot histo & L'histogramme d'une image est la dérivée de la fonction de répartition, qui est donc définie dans le cas discret par H(k) = h(0)+h(1)+...+h(k). Numériquement, il est toujours préférable de manipuler une fonction (ici H) que sa dérivée (h). Calculez la fonction de répartition de l'image src en utilisant l'option -i de la commande chisto, puis visualisez le résultat. 2. Réhaussement affine ---------------------- Visualisez l'image nimes.img puis son histogramme. Q1. Que constatez-vous ? Pouvait-on prévoir l'allure de l'histograme en visualisant l'image ? Pour augmenter la dynamique de cette image, nous pouvons lui appliquer un changement de contraste affine g(s) = a.s + b afin d'envoyer, par exemple, l'intervalle [15, 143] où l'image prend la plupart de ses valeurs, vers l'intervalle [0, 256]. Q2. Déterminez les valeurs de a et b adéquates et réalisez le changement de contraste correspondant à l'aide de la commande faxpb. Visualisez ensuite l'histogramme de l'image résultat : que remarque-t-on ? (pensez à utiliser la commande 'p' et le zoom sous splot) Expliquez comment réaliser la même opération (sans calculer a et b) avec la commande fthre. 3. Égalisation d'histogramme ---------------------------- L'histogramme d'une image mesure le poids (nombre d'occurences) attribué dans l'image à chaque niveau de gris. Pour donner un poids identique à chaque niveau de gris, et tenter en quelque sorte d'optimiser ainsi la représentation de l'information contenue dans l'image, on peut appliquer une égalisation d'histogramme à l'image. Comme nous l'avons vu en cours, cette opération se réalise en appliquant à l'image u le changement de contraste g = H (H étant la fonction de répartition moyenne de u). L'image obtenue, H o u, est le rang de u ; elle peut être calculée au moyen de la commande frank : frank -c -r egalise src cview egalise & Q3. Commentez l'effet visuel de la commande frank. Obtient-on un histogramme plat à la sortie ? Pourquoi ? Comment vérifier que la commande frank a effectué le "bon" changement de contraste ? En fait, l'égalisation d'histogramme n'est pas un outil très subtil pour réhausser une image, et présente de nombreux défauts. Il est bien souvent préférable d'appliquer un réhaussement affine. Q4. Vérifiez cette affirmation notamment sur l'image nimes.img. Quels défauts peut-on reprocher à l'égalisation d'histogramme ? 4. Quantification ----------------- Même si la qualité d'une image peut être améliorée par un réhaussement de contraste adéquat, l'interprétation que nous faisons de l'image est essentiellement insensible aux changements de contraste raisonnables. Du coup, on peut se demander si les 256 niveaux de gris utilisés pour coder les images en teintes de gris sont bien nécessaires. Commençons par quantifier l'image source avec seulement 5 niveaux de gris : fquant -ftype IMG src quant 5 L'option -ftype, que nous avons déjà utilisée à plusieurs reprises, permet de forcer le format du résultat : ici, IMG, c'est-à-dire une image codée avec des entiers (Cimage). Vérifiez la quantification effectuée en visualisant l'histogramme du résultat. Q5. Déterminez le nombre minimal de niveaux de gris requis pour obtenir une image quantifiée "acceptable" (ne présentant pas de différence avec l'image originale à première vue). Quelles sont les zones de l'image les plus sensibles à la quantification ? Pour mesurer les effets de la quantification, il est pratique de soustraire à l'image originale l'image quantifiée, puis de visualiser la différence (en valeur absolue). Par exemple, pour une quantification en 10 niveaux de gris, exécutez les commandes fquant -ftype IMG src quant 10 fdiff -a src quant diff fview diff & Dans la fenêtre fview, cliquez sur le bouton gauche de la souris pour connaître les valeurs prises par l'image diff. Q6. Utilisez cette méthode pour déterminer la quantification optimale pour le critère suivant : "la différence entre l'image originale et l'image quantifiée ne laisse pas apparaître la structure de l'image originale". 5. Ensembles de niveau ---------------------- Définissez une image de travail (ccopy ... src) et visualisez ses ensembles de niveau pour des niveaux de gris multiples de 20 au moyen des commandes @ g = 10 @ n = 0 while ( $g < 256 ) @ n ++ binarize -t $g src lset_$n @ g += 20 end Mkmovie Cmovie lset 1 $n cmview -p -l lset & Utilisez les touches 'f' (forward) et 'b' (backward) dans la fenêtre pour changer la valeur de *, ou éspace' pour faire dérouler le film. Comme on peut le constater, les ensembles de niveau révèlent beaucoup d'information sur la structure d'une image. On peut l'expliquer en remarquant que la formation d'une image est dominée par un processus d'occlusion : quand un objet (non transparent) est vu devant un autre, une occlusion se produit et l'objet le plus loin est partiellement masqué. C'est la raison pour laquelle en effectuant des seuillages, on révèle la plupart des bords des objets. 6. Lignes de niveau ------------------- Les lignes de niveau d'une image sont les courbes de Jordan qui délimitent les ensembles de niveau. Visualisons ces courbes au moyen de la commande interactive llview src & Si l'image affichée est de taille trop importante, utilisez l'option -z 1 pour empêcher le zoom x2 automatique. En cliquant avec le bouton de gauche de la souris, vous sélectionnez la ligne de niveau passant par ce point. Vous pouvez aussi modifier le niveau de gris courant ou changer le mode d'interpolation de l'image grâce à la fenêtre auxiliaire. Nous pouvons aussi visualiser toutes les lignes de niveau d'intensités multiples de 50 llview -b 2 -d 1 -l 0 -s 50 src & Qu'aurait-on obtenu en tentant de visualiser directement toutes les lignes de niveau de l'image de départ (multiples de 1) ? Vérifiez votre prédiction, puis zoomez plusieurs fois à l'aide du bouton de droite de la souris pour examiner la structure fine des lignes de niveau. Visualisez toutes les lignes de niveau entier, zoomez plusieurs fois puis changez la méthode d'interpolation (testez les 6 choix possibles). Q7: Quelle est la régularité des courbes obtenues ? Commentez les avantages et inconvénients liés aux différentes méthodes possibles. Précisez notamment la nature exacte des courbes calculées dans le cas de l'interpolation au plus proche voisin et dans le cas de l'interpolation bilinéaire. 7. Invariance par changement de contraste ----------------------------------------- Par définition, les lignes de niveau d'une image sont invariantes vis-à-vis de tous les changements de contraste injectifs. Vérifiez qu'en cliquant sur le même point dans chaque fenêtre llview, vous obtenez les même courbes après les commandes frank -c -r contrasted src llview src & llview contrasted & Cette propriété d'invariance justifie l'emploi des lignes de niveau en analyse d'images : on peut ainsi analyser une image indépendamment du contraste absolu (conditions d'éclairage, réponses des capteurs, ...) en limitant l'observation à ses lignes de niveau. 8. Influence du bruit --------------------- Lorsqu'on cherche à modéliser une image de façon réaliste, on introduit généralement un modèle de bruit pour tenir compte des fluctuations aléatoires qui peuvent intervenir dans le processus d'acquisition de l'image. Parmi les principaux modèles, citons * le bruit additif Gaussien, qui dégrade une image u en une image v telle que v(x) = u(x) + n(x), o`u les n(x) sont des variables aléatoires i.i.d. suivant une loi Gaussienne centrée de variance donnée Un tel modèle de bruit rend plutôt compte de la multitude de dégradations physiques qui affectent l'image (fluctuations lumineuses dues à la nature quantique du photon, imperfection de l'intégration des capteurs, ...) * le bruit impulsionnel, qui dégrade une image u en une image v telle que v(x) = n(x) si b(x) = 1, v(x) = u(x) sinon, où les n(x) sont des variables aléatoires i.i.d. uniformes sur l'intervalle correspondant à la dynamique de u, et les b(x) sont des variables aléatoires i.i.d. suivant une loi de Bernoulli de paramètre p (0<=p<=1). Ce type de bruit modélise des pertes d'information de nature numérique (défaut de transmission de certains niveaux de gris, pixels au comportement erratique, ...). Q8: Testez l'effet d'un bruit Gaussien (fnoise -g 5) et impulsionnel (fnoise -i 10) sur les lignes de niveau (par exemple pour des niveaux de gris multiples de 50), et expliquez les résultats que vous obtenez. 9. Correction gamma (facultatif) -------------------------------- Lors de l'affichage d'une image sur un écran, une intensité numérique u (0 <= u <= 255) provoque l'émission d'un flux de photon d'intensité I = cte . u^q, avec typiquement 1 <= q <= 3. Ceci est à comparer au fait que notre perception des contrastes est à peu près uniforme par rapport à I^(1/3), où I est l'intensité lumineuse reçue par l'oeil. Pour compenser ces phénomènes, on applique parfois aux images une correction gamma, consistant simplement en le changement de contraste u^(1/q). La fonction flgamma permet de créer un changement de contraste de type g(s) = s^r, qui peut ensuite être appliqué à une image au moyen de la commande fcontrast : flgamma -f 256 -g 2 g fcontrast src g src_gamma Q9. Testez plusieurs valeurs de r et donnez la valeur qui vous semble la plus esthétique pour l'image choisie. Dans certaines situations, il est nécessaire de calibrer précisément un écran afin de garantir un affichage linéaire des intensités. Par affichage linéaire, on entend ici qu'une mosaïque composée de pixels alternés d'intensité a et b doit produire, à une distance suffisante, le même effet qu'une image constante d'intensité (a+b)/2 . Vérifiez si c'est le cas sur votre écran à l'aide des commandes fconst flip_1 0 256 256 fpset flip_1 128 128 1 flip_1 fft2d -A flip_1 flip_1 faxpb -ftype IMG -a 64 -b 128 flip_1 flip_1 fconst flip_2 128 256 256 Mkmovie Cmovie flip 1 2 cmview -l -p flip & (utilisez la touche 'f' pour faire un flip entre les deux images du film). En s'inspirant de ce type de technique, on peut ainsi calibrer manuellement la fonction gamma propre à l'écran et restituer un affichage linéaire.