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

Documents pareils