Sujet de TP ()
Transcription
Sujet de TP ()
UE Champs aléatoires, modélisation de textures (M2 TI, 2016-2017) TP : Champs aléatoires gaussiens pour la synthèse de textures Bruno Galerne Le but de cet TP est d’implémenter et de tester sous Scilab les algorithmes de synthèse de texture vus en cours. 1 Mise en route Depuis un terminal, placez vous dans le dossier de votre choix (e.g. dans un dossier tp_textures réservé aux TPs de ce cours...) et tapez les commandes suivantes pour télécharger les fichiers nécessaires au TP : wget http://w3.mi.parisdescartes.fr/~bgalerne/m2ti/tp1.zip unzip tp1.zip cd tp1 scilab & Le dossier tp1 contient plusieurs images et quelques fichiers de fonctions. Vous pouvez compléter le fichier mon_script.sce pour tester les fonctions que vous implémenterez. Dans la console Scilab, éxecuter les commandes : getd(’.’); // charge toutes les fonctions du dossier stacksize(50000000); // augmente la limite de mémoire 2 2.1 Lecture d’images et visualisation Lecture d’une image La fonction read_bmp permet de charger une image au format bitmap non compressé sous forme de matrice dans Scilab. Pour utiliser une image ayant un autre format (e.g. .jpg, .png, ...), il faut la convertir dans un terminal avec la fonction convert : (Dans un terminal linux, pour une image nommée ’image.jpg’) convert image.jpg +matte +compress image.bmp N’hésitez pas à utiliser d’autres images que celles présentes dans le dossier tp1 ! Voici comment charger et visualiser une image. u = read_bmp(’bois.bmp’); // ccview(u); // yu = luminance_from_rgb(u);// ccview(yu); // lire image couleur ’bois.bmp’ visualiser une image couleur luminance de h visualiser une image en niveau de gris 1 2.2 Visualisation en faux niveaux de gris On est souvent amener à vouloir visualiser comme une image en niveau de gris des images qui ne sont pas de vrais niveaux de gris entre 0 et 255 (par exemple le module d’une transformée de Fourier). Dans ce cas, on effectue un changement de variable affine de façon à ramener l’intervalle [min u, max u] à l’intervalle [0, 255]. Cela a pour effet de produire l’image de contraste maximal. Ce changement de niveaux de gris est effectué par la fonction fview (sans changer les valeurs de niveau de gris de l’image). I Question 1 : Observez les différences entre les deux visualisations lors de l’exécution du script ci-dessous. u = 180*ones(500,500); u(201:400,101:300) = 80*ones(200,200); ccview(u); fview(u); 3 Transformée de Fourier discrète La transformée de Fourier discrète 2D est calculée par la fonction fft (Fast Fourier Transform). Pour centrer la fréquence nulle au centre on utilise la fonction fftshift. Pour remettre la fréquence nulle en coordonnée (1, 1), on utilise ifftshift. I Question 2 : Testez le script suivant, avec u une image en niveau de gris. tfu = fftshift(fft(u)); v = ifft(ifftshift(tfu)); norm(u(:)-v(:)) ccview(real(v)); Remarque : La TFD inverse est calculée avec la fonction ifft. A cause des erreurs de calcul, l’image obtenue peut avoir une partie imaginaire non nulle (mais qui doit être très petite). Dans ce cas on extrait la partie réelle avec la fonction real. 3.1 Visualisation du module de la TFD Pour une image u en niveau de gris (image de luminance d’une des images couleur du dossier tp1), exécutez le script suivant : u = luminance_from_rgb(read_bmp(’tissu.bmp’)); tfu = fftshift(fft(u)); mtfu = abs(tfu); M = size(u,1); N = size(u,2); mtfu(M/2+1,N/2+1) = 0; // mis a 0 pour visualiser fview(mtfu); // échelle linéaire fview(log(1+mtfu)); // échelle logarithmique 2 I Question 3 : Quelle symétrie observe-t-on ? On ne visualisera pas la phase d’une image car son interprétation est assez difficile (voir un sujet de recherche ouvert...). Néanmoins, comme le montre les expériences qui suivent, la phase d’une image est au moins aussi importante que son module du point de vue de l’information qu’elle contient. 3.2 Echange du module et de la phase de deux images I Question 4 : Faire un script qui permette d’échanger le module et la phase de deux images u et v en remarquant que les TFD des deux images sont données par ŵ1 = |û| v̂ |v̂| et ŵ2 = |v̂| û . |û| I Question 5 : Calculez et visualisez les deux images obtenues en échangeant le module et la phase des luminances des images building.bmp, tile.bmp ou encore lena.bmp. Recommencez l’expérience d’échange du module et de la phase avec les couples d’images (sand.bmp, water.bmp) et (lena.bmp, sand.bmp). 3.3 Convolution La fonction w = convolutionimages(u,v) du dossier tp1 calcule le produit de convolution entre les images u et v en passant par la TFD. L’opération principale de cette fonction est le produit des DFT de u et v avec la ligne : tfw = tfu.*tfv; On remarquera que cette formule ne correspond pas à la formule u[ ∗ v(k, l) = M N û(k, l)v̂(k, l) du cours. Ceci est dû à la différence de normalisation entre la fft de Scilab et la DFT du cours. I Question 6 : Calculez le produit de convolution entre une image donnée u de taille carrée N ×N (par exemple tile.bmp) et l’image v = gauss_image(N,0.1*N), et visualisez les trois images. Qu’observe-t-on ? Recommencez l’expérience en remplaçant v par ifftshift(v) afin de centrer le spot gaussien à l’origine. 4 Spot noise discret I Question 7 : Ecrivez une fonction v = translation_periodique(u,t) qui translate une image u en l’image u(· − t), t ∈ ΩM,N . Pour cela remarquez que pour tout entier n ∈ Z, la commande pmodulo(n-1, N) + 1 3 renvoie l’unique représentant modulo N de n compris entre 1 et N . Testez cette fonction sur une image. On rappelle que la fonction Scilab rand() renvoie un nombre aléatoire de loi uniforme dans [0, 1[. I Question 8 : Ecrivez une fonction v = SND(h,n) qui simule un spot noise discret d’ordre n associé à l’image h. Testez cette fonction sur une image simple (e.g. carré blanc sur fond noir). On affichera le résultat avec fview. 5 Spot noise discret asymptotique On simulera un bruit blanc gaussien X de taille M × N à l’aide de la commande X = rand(M,N,"normal") I Question 9 : Ecrivez une fonction Y = SNDA(h) qui simule un spot noise discret asymptotique associé à l’image h. On rappelle que Y =√ 1 (h − m) ∗ X, MN où M × N est la taille de h et m la moyenne arithmétique de h. Testez cette fonction sur plusieurs images simples (e.g. carré blanc sur fond noir, disques de différents rayons, versions floues de ces images...). On affichera les résultats avec fview. I Question 10 : Vérifiez que le SNDA et SND d’ordre n élevé produisent des résultats visuellement similaires. 6 Synthèse de texture par spot noise asymptotique I Question 11 : Ecrivez une fonction Y = SNDA_RGB(h) qui renvoie l’image (hr − mr ) ∗ X mr 1 (hg − mg ) ∗ X Y = mg + √ M N (hb − mb ) ∗ X mb où mr , mg , mb sont les moyennes arithmétiques des trois canaux. 7 Texton et synthèse de texture de plus grande taille Pour cette section on ne considère que des images en niveaux de gris (un seul canal). Le texton th associé à une image h est définit comme étant l’image qui a le même module de Fourier que h et dont toutes les phases sont nulles. I Question 12 : Ecrivez une fonction t = texton(h) qui calcule le texton asscocié à l’image d’entrée (centré au centre de l’image grâce à fftshift). Visualisez ce texton pour plusieurs images (on utilisera fview pour visualiser, les niveaux de gris du texton étant bien plus grands que 255). 4 I Question 13 : Ecrivez une fonction Y = SNDA_etendu(h,r) qui produit une image de SNDA de taille r fois plus grande que l’image d’entrée (r strictement plus grand que 1). Pour cela, il faut créer l’image étendue t̃h = m + r(th − m)1Ω que l’on utilise comme entrée pour un ADSN de taille rM × rN . Testez cette fonction en utilisant des textures de petites tailles (128x128, voir plus petit). 5