COMPRESSION D'IMAGE PAR
(TRANSFORMÉE COSINUS DISCRETE)

Philippe COVAL - étudiant en DESS I2N / UPS

(Tout le contenu est sous licence GPL ; Vous avez aucun droit avant d'avoir lu cette page : http://rzr.online.fr/license.htm )

INTRODUCTION

Il existe différentes méthodes de compression d'images.
La méthode étudiée est un traitement non conservatif (l'image décompressée est dégradée par rapport à l'originale).

Le principe de compression est le suivant :

  1. Transformée en sinus dicrète de l'image
  2. Filtrage des fréquences non pertinentes.
  3. Transformée inverse

RÉSULTATS

Seuil nbre de pixels coupées Taux compression Qualité visuelle
5 21997 1.4014 pas de différence visuelle
10 39781 2.0746 pas de différence visuelle
15 51944 3.0898 pas de différence visuelle
20 59514 4.4429 Différence à peine visible sur le crépit de la maison
150 . 136.6548 Scène juste interprétable par un humain

FONCTION TCD (SOURCE MATHLAB)

% Programme Principal de  compression spectrale d'images
% Auteur : Philippe COVAL - http://RzR.online.FR
% DESS Imagerie Numérique / U.P.S.
% Date : 2000.01.28
% Filename tcd1.m (Mathlab)

function [Bn]=tcd1(n)

[U,I]=meshgrid(1:n,1:n);
Bn=sqrt(2/n) * cos (pi * ( U -1) .* (2*I - 1) /(2*n) );
Bn(:,1) =  Bn(:,1)/sqrt(2);

PROGRAMME DE TEST (SOURCE MATHLAB)


% Programme Principal de compression spectrale d'images
% Auteur : Philippe COVAL - http://RzR.online.FR
% DESS Imagerie Numérique / U.P.S.
% Date : 2000.01.28
% Filename : main.m (Mathlab)


% Lecture de l'image 
[X,map]=imread('..\data\maison.bmp');
image(X);
colormap(map);

% Crop
[iw,ih]=size(X);
str=input('Largeur region ? : ');

if ( not (isempty(str) ))
iw = str ;
end;
   
str=input('Hauteur region ? : ');
if ( not (isempty(str) ))
ih = str ;
end;
   
xoffset=1;
yoffset=1;
Y=X(xoffset:xoffset+iw-1, ...
   yoffset:yoffset+ih-1 );

% Affichage de l'image cropée
image(Y);
map(Y(iw-1,ih-1),:);

% convertion en type double
imd=double(Y);

% Transformee cos disc directe
F=tcd1(iw)'*imd*tcd1(ih); 

figure
image(F);
colormap(hot);


% Saisie du seuil
seuil=5
str = input('Seuil ? [(5),10,15,20] : ? ');

if ( not (isempty(str) ))
seuil = str ;
end;


% Filtrage par Seuil de l'image des fréquences

ncut=0;
for i=1:iw
   for j=1:ih
      if seuil > abs(F(i,j)) 
         F(i,j)=0;
         ncut=ncut+1;
      end
   end
end

% Calcul du taux de compression C
sprintf( 'nbre_de_pixels_coupées : %d',ncut)
C=(iw*ih)/(iw*ih-ncut)

figure
image(F);
colormap(hot);

% Transformee Cos Disc Inverse
F=tcd1(iw)*F*tcd1(ih)';
%F=uint8(round(F));
figure
image(F);
colormap(map);

% Qualite de l'image : disparitee :
% difference des images x 10
D=255+(abs(F-imd)*-10);
figure;
image(D);
colormap(gray);

2000.02.03
Philippe.COVAL - http://rzr.online.fr