1 Introduction

La transformée de Fourier permet de captuer les fréquences des données dans une image. Ainsi, en éliminant certaines fréquences, on pourrait compresser les images. Une autre technique de compression d’image est d’utiliser la décomposition en valeurs singulières.

L’utilisation de la transformée de Fourrier est bien sûr plus large que la compression. Le fait d’éliminer certaines fréquences permet de détecter les contours, ou de rendre l’image floue.

2 Lecture d’image

Le package EBImage permet de réaliser de nombreux traitements sur les images. On peut lire une image comment étant une matrice avec les coordonnées qui représentent la position du pixel, et les valeurs qui représentent les couleurs. Pour une image en couleur, on doit avoir 3 matrices de dimension 2 pour les paramètres de couleurs (rgb). Pour une image grise, un seul paramètre suffit et il représente le niveau de gris. Pour simplifier, on va utiliser manipuler une image en gris.

img <- readImage("images/IRIS.jpg")
gris <- imagematrix(img, type = "grey")
dim(gris)
## [1] 300 295
attributes(gris)
## $dim
## [1] 300 295
## 
## $type
## [1] "grey"
## 
## $class
## [1] "imagematrix" "matrix"
str(gris)
##  imagematrix [1:300, 1:295] 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "type")= chr "grey"
##  - attr(*, "class")= chr [1:2] "imagematrix" "matrix"
display(gris, method = "raster")

3 Transformée de Fourier

On peut utiliser la fonction fft Fast Fourrier Transform pour calculer la transformée de Fourrier.

ft=fft(gris)
ft[1:5,1:5]
##                     [,1]                 [,2]                 [,3]
## [1,] 76442.522+   0.000i  4252.3355-322.1925i  687.2417+ 585.4726i
## [2,]  1967.750+2559.686i -1348.9289+248.3981i 1362.2466-1220.6272i
## [3,]   705.458-1655.750i -1626.8116+961.1081i  376.5422- 309.6483i
## [4,]  3756.873- 654.192i  -610.3099+319.4272i  -70.4063- 673.8589i
## [5,] -1335.213- 341.585i  -791.9568-686.9447i  763.0816+ 142.0727i
##                      [,4]                [,5]
## [1,] -108.7878+1017.2112i  562.1677+322.6322i
## [2,]  179.8071-1481.4566i -215.2630+302.2823i
## [3,] -570.0651+ 396.5812i -277.0916-828.1936i
## [4,] -377.4027+1118.8951i  357.3649-274.6920i
## [5,]  -14.9058+ 171.1299i -235.8449+220.6539i

On peut ensuite visualiser l’amplitude, la partie réelle et la partie imaginaire:

# max(log(abs(ft)+1)[,])
# max(log(abs(Re(ft))[,]+1))
# max(log(abs(Im(ft))[,]+1))
display(fftshift2(log(abs(ft)+1)/12), method = "raster")

display(fftshift2(log(abs(Re(ft))+1)/12), method = "raster")

display(fftshift2(log(abs(Im(ft))+1)/12), method = "raster")

On faisant la transformée inverse, on retrouve bien l’image originale:

gris2=fft(ft,inverse = T)/length(ft)
display(Re(gris2), method = "raster")

4 Compression d’image

On peut supprimer les basses fréquences:

dim(ft)
## [1] 300 295
ftc=fftshift2(ft)
ftc[1:80,]=0
ftc[221:300,]=0
ftc[,1:80]=0
ftc[,215:295]=0
display((log(abs(ftc)+1)/12), method = "raster")

L’image serait légèrement moins nette:

gris_c=fft(ifftshift2(ftc),inverse = T)/length(ft)
display(Re(gris_c), method = "raster")

5 Filtre gaussien

On peut créer un filter gaussien pour éliminer les fréquences basses.

dim=dim(gris)
sigma=60

  center.row=trunc(dim[1]/2)
  center.col=trunc(dim[2]/2)
  A=matrix(0,dim[1],dim[2])
  for (i in 1:dim[1]){
   for (j in 1:dim[2]){
     A[i,j] = exp(-1.0 * ((i - center.row)^2 + (j - center.col)^2) / (2 * sigma^2))
   }
  }

plot_ly(z = A, type = "surface")

L’image est plus harmonieuse

ftb=fftshift2(ft)
ftb=(A)*ftb

gris2=fft(ifftshift2(ftb),inverse = T)/length(ftb)
display(Re(gris2), method = "raster")

Copyright © 2016 Kezhan SHI All rights reserved.