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.
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")
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")
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")
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.