TP n°4 : Opérateurs locaux ========================== 1. Quelques opérateurs linéaires -------------------------------- a. Déterminer l'opérateur différentiel associé à chacun des masques de convolutions ci-dessous: [ -1 0 1 ] [ 1 1 1 ] [ 0 1 1 ] A= [ -2 0 2 ] B = [ 1 -8 1 ] C = [ -1 0 1 ] [ -1 0 1 ] [ 1 1 1 ] [ -1 -1 0 ] b. Choisir une image dans le répertoire $MEGAWAVE2/data/tp4 et la copier dans le fichier src: ls $MEGAWAVE2/data/tp4 ccopy ... src (remplacer les ... par le nom de l'image choisi, par exemple lena.img) c. Appliquer chacun des 3 filtres ci-dessus à l'image src et visualiser le résultat. Exemple pour le filtre A: echo "-1 0 1 -2 0 2 -1 0 1" | freadasc A 3 3 fconvol src A out fview out & Commenter le résultat obtenu pour chaque filtre (quel type de structure est révélée ?) 2. Courbure ----------- Après avoir éventuellement changé d'image src, calculer sa courbure fderiv -k courbure src et forcer par seuillage les valeurs à être dans [-20,20] avant de visualiser le résultat: fthre -m -20 -M 20 courbure c fview c & L'image de courbure vous semble-t-elle exploitable ? Pourquoi ? 3. Filtre de Canny ------------------ Le filtre de Canny est une méthode classique de détection de contours. Elle s'appuie sur une localisation précise des bords de l'image, sélectionnées par seuillage de la norme du gradient. Calculer les contours de l'image src pour un seuil de gradient de 20 au moyen des commandes canny src c binarize -t 20 c bords cview bords & Essayer plusieurs valeurs pour le seuil (moins de 20, plus de 20) et comparer les résultats obtenus. Y a-t-il une valeur du seuil qui permet de détecter exactement tous les bords intuitivement souhaitables dans l'image ? 4. Équation de la chaleur ------------------------- La commande heat de MegaWave2 implémente l'équation de la chaleur en itérant n fois l'opérateur [ 0 s 0 ] T u = u * [ s 1-4s s ] [ 0 s 0 ] (n et s étant des paramètres d'entrée de la commande heat). Choisir une image source puis lui appliquer l'équation de la chaleur: heat -s 0.1 -n 20 src out cview out & a. Donner la relation entre n, s et le temps t atteint dans l'équation de la chaleur (on conviendra qu'un pixel est de côté 1) b. Vérifier que l'on obtient visuellement le même résultat en changeant s et n tout en préservant la valeur de t calculée au 3.a. Quelle est, expérimentalement, la valeur maximale que l'on peut utiliser pour s ? Retrouver cette valeur par un argument théorique. 5. Mouvement par courbure ------------------------- a. Le mouvement par courbure peut être simulé par l'itération du filtre médian (ne pas oublier de passer en tcsh avant d'utiliser les commandes suivantes) : @ m = 1 ccopy src mov_1 while ($m < 20) @ n = $m + 1 echo $n median -r 2.5 mov_$m mov_$n @ m = $n end Mkmovie Cmovie mov 1 $n Le résultat est un film (la représentation multiéchelle de src par l'EDP du mouvement par courbure), qui se visualise à l'aide de la commande cmview -l mov & Comparez le résultat avec le scale-space linéaire obtenu en remplaçant la commande "median ..." par "heat ..." (avec des paramètres appropriés) dans la boucle précédente. b. Comme le médian est un opérateur morphologique il agit indépendamment sur les ensembles de niveau d'une image et il suffit donc d'examiner l'évolution d'une image binaire (un ensemble de niveau) pour comprendre son action. Choisissez un niveau de gris quelconque (au hasard ou interactivement à l'aide de la commande llview -b 2 -d 4 src puis seuillez l'image source à ce niveau (ici 100) par binarize -t 100 src bin Appliquez ensuite la même séquence de commandes qu'au 4.a., mais en replaçant l'image src par bin. Essayez ensuite de changer la valeur de r passée en paramètre au module median. Que prédit asymptotiquement la théorie pour le mouvement des lignes de niveau d'une image sous l'action du médian itéré ? Cela est-il en accord avec ce que vous venez d'observer ? Que se passe-t-il pour les zones de faible courbure ? c. Les observations précédentes nous indiquent que le médian n'est pas un bon schéma pour le mouvement par courbure, puisque la courbure discrète "calculée" par le médian est nulle quand la courbure réelle est en dessous d'un certain seuil. On peut calculer ce seuil en cherchant le disque (discret) de plus petit rayon invariant par l'action du médian. Pour un médian de rayon 1 (médian à 4 voisin), ce rayon critique vaut racine de 2, puisque l'image 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 (0) 0 1 1 1 0 0 0 0 0 0 est invariante par l'action de du médian de rayon 1. Que vaut ce rayon critique pour un médian de rayon 1.5 (médian à 8 voisins) ? d. Pour la même raison, le médian possède de nombreux points fixes, et lorsqu'on l'itère sur une image, on finit en général par atteindre un tel point fixe (ou un cycle) au lieu de converger vers une image constante. Ceci peut tout de même prendre un certain nombre d'itérations, donc commencez par extraire une sous-image de taille 64x64 de votre image source par cextract -r src ext 100 100 64 64 Appliquez ensuite un grand nombre d'itérations du médian à cette sous-image par median -n 1000 -r 1.5 ext fixe Le module median détecte automatiquement un point fixe, mais soyez patients car le programme peut tourner un certain temps, surtout si vous augmentez la valeur de r. Il se peut aussi qu'aucun point fixe ne soit atteint au bout de 1000 itérations (parce qu'un cycle est atteint par exemple). Dans ce cas, changez la position du coin supérieur gauche de votre sous-image (100,100) en un autre point. Lorsque vous avez atteint un point fixe, visualisez ensuite le résultat et ses ensembles de niveaux (commande llview). Vérifiez notamment que la courbure de chaque ensemble de niveau est partout faible. e. Le mouvement par courbure peut être implémenté plus efficacement (sans "bloquer" comme le médian) par un schéma aux différences finies qui évalue directement |Du| curv(u). Ceci est effectué par un module MegaWave2 nommé amss. Examiner le code source de ce module (procédure one_step) avec emacs `mwwhere amss.c` & f. Comparer, pour l'image julesz.img, la courbure calculée directement (paragraphe 2) par fderiv -k courbure julesz.img fthre -m -5 -M 5 courbure c fview c & à la représentation multiéchelle de la courbure donnée par amss -s 0.2 -l 7 -C curv julesz.img cmview -l curv & (utiliser la visualisation pas à pas avec les touches 'espace', 'b' et 'f') Quel est l'intérêt, sur cet exemple, de la représentation multiéchelle ?