Fourier sur les images - scilab Le logiciel SCILAB Il est nécessaire d installer une des dernières versions de SCILAB (version 5.4.1 par ex.) Puis, pour avoir les commandes sur les images, il faut installer le module SIVP : Ouvrir le gestionnaire de modules ATOMS (Applications/Gestionnaire ) Ouvrir la partie «Image Processing» Sélectionner et télécharger le Scilab Image and Video Processing toolbox Il faut relancer Scilab pour qu il prenne en charge le SIVP Une image comme signal périodique de dimension 2 Une image peut toujours être considérée comme un signal périodique : La période en largeur est la largeur de l image. La période en hauteur est la hauteur de l image. La «discontinuité» sur les bords est responsable de l effet de Gibbs lors de la reconstruction de l image à partir des coefficients de Fourier (dans l exemple ci-contre, on n a gardé que 10% des coefficients basses fréquences. On peut voir des traits en haut et en bas de l image) : Pour éviter ce phénomène, on peut, par des symétries, créer une image symétrique assurant la continuité des bords. La même manipulation sur cette image symétrique donne l image ci-dessous sans effet de Gibbs sur les bords. Page 1
Sommaire -1- Fonctions de base et leurs images dans la décomposition de Fourier - page 3 Fonctions élémentaires 2D correspondant aux e 2i Fnx des signaux 1D -2- Matrice d une image et matrice de Fourier - page 4 Comment sont représentées les images Comment sont calculés les coefficients de Fourier et leur stockage dans une matrice -3- Reconstruction de l image à partir de la matrice de Fourier - page 7 Détails des calculs pour la reconstruction de l image à partir de la matrice de Fourier sur un exemple -4- Bidouillage des coefficients de la matrice de Fourier - page 10 4.1 Enlever les basses fréquences 4.2 Garder que les basses fréquences 4.3 Enlever les hautes fréquences 4.4 Reconstruction progressive d une image des basses fréquences vers les hautes fréquences des hautes fréquences vers les basses fréquences 4.1 4.2 4.3 4.4-5- Marquage d une image - page 20 Mettre une marque invisible (HF) dans une image (pour indiquer la propriété par ex.) -6- Bruitage et débruitage d une image - page 22 Comment débruiter une image (suppression des hautes fréquences) -7- Principe et réalisation d une compression JPEG d une image - page 24 Page 2
-1- Base des fonctions et leurs images sur les quelles appliquer Fourier Fichier «base_image.sce» Les fonctions (correspondant aux sinusoïdes x e 2i kx/n des signaux 1D) sur laquelle se décompose l image (n lignes, p colonnes) sont pour chaque fréquence (u,v) : (x,y) e 2i (ux/n+vy/p). Les images (ici, 100*100 pixels- n=p=100) correspondant à ces fonctions 2D sont obtenues par: H u,v(ligne,colonne)= Round(127(1+cos(2 (u*(ligne-1)/n+v*(colonne-1)/p))) = couleur du pixel - entier entre 0 et 255 de l image] u = 0 v = 0 u = 0 v = 1 u = 0 v = 2 u = 0 v = 20 u = 0 v = 50 u = 1 v = 0 u = 1 v = 1 u = 1 v = 2 u = 1 v = 20 u = 1 v = 50 u = 2 v = 0 u = 2 v = 1 u = 2 v = 2 u = 2 v = 20 u = 2 v = 50 u = 4 v = 0 u = 4 v = 1 u = 4 v = 2 u = 4 v = 20 u = 4 v = 50 u = 20 v = 0 u = 20 v = 1 u = 20 v = 2 u = 20 v = 20 u = 20 v = 50 u = 50 v = 0 u = 50 v = 1 u = 50 v = 2 u = 50 v = 20 u = 50 v = 50 Toute image (de dimension n lignes et p colonnes) se décomposera sur ces n*p images : Page 3
-2- Les matrices image et Fourier dans Scilab Fichier «quadrillage.sce» La matrice d une image Une image (hauteur = n pixels, largeur = p pixels) en teintes de gris (en «noir & blanc») est stockée sous forme de nombres entiers d un octet (format «uint8») de 0 à 255, dans une matrice de n lignes et p colonnes (X(1 :n,1 :p)). Tableau de correspondance entre nombres et teinte de gris: Extrait d une image n&b : Une image couleur est stockée dans une matrice par 3 couches de gris : La 1 ère couche X(1 :n,1 :p,1) correspond à la couche rouge, la 2 ème couche X(1 :n,1 :p,2) correspond à la couche verte la 3 ème couche X(1 :n,1 :p,3) correspond à la couche bleue. La somme de ces 3 couches donne l image. Page 4
La matrice de Fourier (sur une image n&b) Si l image est dans la matrice x, la matrice de Fourier est obtenue sur Scilab par A=fft2(x) qui calcule les coefs: n p A(f, g) = (x(t, s)e 2iπ((t 1)(f 1) n t=1 s=1 + (s 1)(g 1) ) p ) A est une matrice [1 :n,1 :p] (même taille que la matrice image), f est la ligne et g la colonne. Les fréquences sont (u,v)=(f-1,g-1) et varient dans [0 ;n-1]* [0 ;p-1] Exemple : 5 lignes horizontales & verticales blanches d une image 100 x 100 pixels (espacées de 20 pixels : lignes & colonnes 10, 30, 50, 70, 90) Image des modules de la matrice de Fourier : 2 représentations Image «normale» La 1 ère colonne est v=0, u variant de 0 à n-1. La 1 ère ligne est u=0, v variant de 0 à p-1. Le centre de l image correspond à u=n/2, v=p/2 Commandes : * fft2(x) : calcule la transformée de Fourier de la matrice x. * abs pour module ou valeur absolue * Round pour arrondi (on ramène les coefficients à des entiers entre 1 et 255) * uint8 : ramène la matrice dans le format entier (1 octet) pour afficher l image. * imshow : affiche l image Image «centrée» Le centre de l image correspond à u=0, v=0 axe orienté vers le bas et vers la droite. Ce centrage est obtenu sur Scilab par fftshift Page 5
Voyons plus précisément : Image «non centrée»: En vert : les fréquences verticales (v) et horizontales (u). Ici de 0 à 99 En jaune : les colonnes (g) de 1 à 100 En orange : les lignes de 1 à 100 Le pixel (f,g)=(11,6) correspond à l amplitude du coef de Fourier de fréquences (u ; v)=(10 ; 5). Les hautes fréquences sont au centre : Voisinage de (50 ; 50) Les basses fréquences de l image (voisinage de (0 ;0) ) se situent au 4 coins- L image étant périodique (période 100 ici), la fréquence (90 ; 5) est la même que (-10 ; 5) qui dans le coin bas gauche Image «centrée»: La fréquence (0,0) est au centre de l image. Le carré haut gauche correspond aux fréquences dans [-50 ;0]*[-50 ;0]. Le carré haut droite correspond aux fréquences dans [-50 ;0]*[0 ;50[. Le carré bas gauche correspond aux fréquences dans [0 ;50[*[-50 ;0]. Le carré bas droite correspond aux fréquences dans [0 ;50[*[0 ;50[. Les basses fréquences sont au centre. Les hautes fréquences sont au 4 coins. Page 6
-3- Reconstruction de l image à partir de la matrice de Fourier : fichier :«ligneshorizontales.sce» Prenons une image plus simple de 100*100 pixels avec 5 lignes horizontales blanches (couleur = 255) espacées de 20 à partir de 10 sur fond noir (couleur = 0). Image du module des coefs de Fourier (centrée en (u,v)=(0 ;0) puis non centrée) : Matrice (A( :, : ) ) des coefficients : (non centrée) : Les 20 coefs non nuls sont dans la colonne 1 (v=0) et aux lignes 1+5k (u=5k) pour k entier allant de 0 à 19 : Ligne 1 ; colonne 1 : u = 0 ; v = 0 Ligne 6 ; colonne 1 : u = 5 ; v = 0 Ligne 11 ; colonne 1 : u = 10 ; v = 0 Ligne 16 : u = 15 Ligne 21 : u = 20 Ligne 26 : u = 25 Ligne 31 : u = 30 Ligne 36 : u = 35 Ligne 41 : u = 40 Ligne 46 : u = 45 Ligne 51 : u = 50 Ligne 56 : u = 55 Ligne 61 : u = 60 Ligne 66 : u = 65 Ligne 71 : u = 70 Ligne 76 : u = 75 Ligne 81 : u = 80 Ligne 86 : u = 85 Ligne 91 : u = 90 Ligne 96 : u = 95 On peut remarquer que, dans cette colonne 1 (v=0), les coefs sont conjugués (la matrice s appelle A): A(102 q,1) = A(q,1) pour q (ligne) entier de 2 à 99 Page 7
Par ex, pour q=16 : A(86,1) = 74 942,6197 + 103 149,6668 i A(16,1) = 74 942,6197 103 149,6668 i k q = 5k+1 u = 5k [100] V Coefficients A(q,0) (arrondi) Fonctions de la base ass. à (u,v) (x,y) e 2i (ux/n+vy/p) (n=100,p=100) x [0 ;99], y [0 ;99] x et y entiers Image de la fonction : (x,y) Round(127(1+cos(2 (ux/n+vy/p)))) [image réduite à 50 * 100] 0 1 0 0 127500 e 0 1 6 5 0 121259 39399 i e 2i (5x/100) 2 11 10 0 103150 + 74943 i e 2i (10x/100) 3 16 15 0 74943 103150 i e 2i (15x/100) 4 21 20 0 39400 + 121260 i e 2i (20x/100) 5 26 25 0 127500 i e 2i (25x/100) 6 31 30 0 39400 + 121260 i e 2i (30x/100) 7 36 35 0 74943 103150 i e 2i (35x/100) 8 41 40 0 103150 + 74943 i e 2i (40x/100) 9 46 45 0 121260 39400 i e 2i (45x/100) 10 51 50 0 127500 e 2i (50x/100) 11 56-45 0 121260 + 39400 i e 2i (-45x/100) 12 61-40 0 103150 74943 i e 2i (-40x/100) 13 66-35 0 74943 + 103150 i e 2i (-35x/100) 14 71-30 0 39400 121260 i e 2i (-30x/100) 15 76-25 0 127500 i e 2i (-25x/100) Page 8
16 81-20 0 39400 121260 i e 2i (-20x/100) 17 86-15 0 74943 + 103150 i e 2i (-15x/100) 18 91-10 0 103150 74943 i e 2i (-10x/100) 19 96-5 0 121260 + 39400 i e 2i (-5x/100) En bleu : les basses fréquences ; en marron :les hautes fréquences La matrice image peut être reconstruite ainsi : 19 B(x,y) = (A(5k + 1,1) e 2iπ5k(x 1) k=0 100 ) x [1 ;100] Ici y n intervient pas car les colonnes sont identiques. On calcule les coefficients de la matrice B, puis on prend la partie réelle, puis on normalise B sur [0 ;255] et on transforme en nombres uint8 : Matrice reconstruite B (extrait) Image reconstruite B Algorithme Image originale x1 Scilab reconstruit l image par la formule B=ifft(A) ; Algorithme Image reconstruite B Matrice reconstruite B (extrait) Page 9
-4- Travail sur les fréquences d une image : supprimer hautes, basses fréquences Fichier : «bali.sce» L image est «bali100.bmp» (200*300 pixels) Module des coefs de la matrice de Fourier (centrée en (0,0) Module des coefs de la matrice de Fourier (non centrée) -4.1 On enlève les basses fréquences à l image : On annule les coefs au voisinage u=0, v=0 dans un rayon de a sur les lignes et b sur les colonnes : rayons BF : a = n/50 (=4) et b = p/50 (=6) Module des coefs modifiés (centrés en (0,0)): on voit le trou noir au centre ; ce sont les basses fréquences annulées Page 10
rayons BF : a = n/10 (=20) et b = p/10 (=30) rayons BF : a = n/100 (=2) et b = p/100 (=3) rayons BF : a = n/5 (=40) et b = p/50 (=6) rayons BF : a = n/50 (=4) et b = p/5 (=60) Page 11
-4.2 On enlève les hautes & moyennes fréquences à l image : On annule les coefs au voisinage à l extérieur de l espace précédent. Ci-dessus, rayons BF : a = n/10 (=20) et b = p/10 (=30) Cela donne environ 97% de 0! rayons BF : a = n/4 (=50) et b = p/4 (=75) environ 80 % de 0 rayons BF : a = n/3 ( 66) et b = p/3 (=100) environ 65 % de 0 Page 12
-4.3 On enlève les hautes fréquences à l image : On annule les coefs au voisinage u=1+n/2, v=1+p/2 dans un rayon de a sur les lignes et b sur les colonnes : rayons HF : a = n/10 (=20) et b = p/10 (=30) (3 % de 0) rayons HF : a = n/3 (=66) et b = p/3 (=100) (35 % de 0) rayons HF : a = n/2 (=100) et b = p/2 (=150) (79 % de 0) Page 13
-4.4 Reconstruction de l image originale par tranche de fréquences des basses vers les hautes: On commence par les 4 coins de la matrices des coefs : A(1,1), A(200,1), A(200,300) et A(1,200). Puis les pavés A(1:10,1:15), A(192:200,1:15), A(192:200,287:300) et A(1 :10,287:300) Page 14
Puis les pavés A(1:20,1:30), A(182:200,1:30),A(182:200,272:300) et A(1 :20,272:300) Puis les pavés A(1:30,1:45), A(172:200,1:45), A(172:200,257:300) et A(1 :30,257:300) Puis les pavés A(1:40,1:60), A(162:200,1:60), A(162:200,242:300) et A(1 :40,242:300) Puis les pavés A(1:50,1:75), A(152:200,1:75), A(152:200,227:300) et A(1 :50,227:300) Page 15
Puis les pavés A(1:60,1:90), A(142:200,1:90), A(142:200,212:300) et A(1 :60,212:300) Puis les pavés A(1:70,1:105), A(132:200,1:105), A(132:200,197:300) et A(1 :70,197:300) Puis les pavés A(1:80,1:120), A(122:200,1:120), A(122:200,182:300) et A(1 :80,182:300) Puis les pavés A(1:90,1:135), A(112:200,1:135), A(112:200,167:300) et A(1 :90,167:300) Page 16
Et enfin les 2 dernières tranches : A(1:100,1:150), A(102:200,1:150), A(102:200,152:300) et A(1 :100,152:300) Puis tout : il manque juste la ligne 101 et la colonne 151 (très hautes fréquences Tout = original Page 17
Reconstruction de l image originale par tranche de fréquences des hautes vers les basses: On commence par le centre de la matrices des coefs : A(100:102,150 :152). Ci-dessous : image matrice Fourier non centré Puis le pavé A(81:121,121:181) Puis le pavé A(31:171,46:256) Puis le pavé A(11:191,16:286) Page 18
Puis le pavé A(5:196,7:294) Puis le pavé A(3:198,4:297) Puis tout A(1:200,1:300) Page 19
-5 Marquage de photo en Hautes Fréquences Fichier : «marquage.sce» A partir de 2 images (Bali et Depardieu) j en construis une 3 ème en enlevant les hautes fréquences de Bali et en gardant les hautes fréquences de Depardieu, en ajoutant leurs matrices de Fourier respectives et en reconstruisant l image : Photo 1 : Bali. Je garde les basses fréquences dans un rapport de 1/3,5 et enlève le reste : Original Image matrice Fourier (non centrée) modifiée Image reconstruite Algorithme Photo 2 : Le nom «Depardieu». J élimine les basses fréquences dans le même rapport de 1/3,5: Original Image matrice Fourier (non centrée) modifiée Page 20
Image reconstruite Algorithme Addition des 2 matrices de Fourier et construction de l image composite. Algorithme Matrice de Fourier composite On divise par 10 la matrice D de Fourier de «DEPARDIEU» Pour qu elle disparaisse dans l image composée FF Image composée «DEPARDIEU» est caché dans les hautes fréquences de cette image! Retrouver le nom du gros Gérard dans cette image. On va éliminer les BF de cette image FF. Page 21
-6 Bruitage en Hautes Fréquences Fichier : bruitage.sce Bruitage de la matrice de Fourier par de l alea uniforme : A est la matrice de Fourier de Depardieu, n et p sont le nombre de lignes et de colonnes Bruité Débruité (conservation des basses fréquences) Original Le débruitage consiste ici à ne garder que les basses fréquences dans un rapport 1/5 Matrice E de Fourier (centrée) de l image composite Perte d information lors du débruitage : imshow(x2-g+127) Page 22
-7 Compression JPEG Fichier : compression_jpeg.sce Principe: Pour coder l image : L image (n*p pixels) est décomposée en pavés de 8*8 pixels. Pour chacun de ces pavés, on calcule la matrice de Fourier. On la lisse en diminuant les hautes fréquences (on ne le fera pas ici) On conserve ces matrices dans une matrice A aux dimensions de l image (n*p pixels) On cherche a = le 90 ème (par exemple) centile des modules des coefs de la matrice A. On annule les coefs de A dont le module est inférieur à a ; cela donne la matrice B. Ainsi dans cette matrice B il y a 90% de 0. On stocke les valeurs non nuls par un algorithme spécifique : On utilise 3 tableaux : un tableau des valeurs un tableau des lignes de ces valeurs un tableau des colonnes de ces valeurs. Exemple : Pour stocker le tableau ci-dessous (256 nbs complexes- 95% de 0), on stocke les 3 colonnes comme ci-dessous: Gain de stockage = 1-240/4096 = 94% Pour décoder l image : On récupère la matrice CC en lisant les dimensions de l image et les 3 colonnes. La matrice A est décomposée en pavés de 8*8 pixels. Pour chacun de ces pavés, on reconstruit l image qu on stocke dans une grande matrice CC (n*p pixels). On normalise cette image et on l affiche Réalisation sur Scilab: Lecture de l image : Algorithme Commentaires Réduction des dimensions de l image pour avoir des dimensions multiples de 8. Page 23
Découpage de l image en pavé de 8*8 : Algorithme Commentaires A récupèrera toutes les matrices de Fourier 8*8 Les pavés 8*8 seront dans M Leurs matrices de Fourier seront dans P. Puis stockées dans A Image des modules de A Confection de la matrice avec 90% de 0 : Algorithme Commentaires Dans a(1) : le 90 ème centile des modules de A (mat B). Dans CC, on conserve les coefs dont le module est supérieur au 90 ème centile Image des modules de CC Quelques coefs de CC (90% de 0) Construction de l image à partir de CC : Algorithme Image reconstituée après traitement jpeg Page 24