TP JPEG

LP SEICOM – TP : Transformation DCT & Compression JPEG

Objectifs du TP

1. Fonctions de base de la DCT

1.1 Méthodologie

Nous générons l’ensemble des bases DCT 8×8 via basisgrid(8). Chaque bloc 8×8 correspond à une paire de fréquences spatiales (u,v) : u horizontal, v vertical. Ces bases sinusoïdales permettent de décomposer tout motif image en composantes orthogonales.

1.2 Extrait MATLAB

      
      
  % 1. Fonctions de base DCT 8×8
  N = 8;
  B = basisgrid(N);
  figure; imshow(B, []);
  title('64 fonctions de base DCT 8×8');
      
    

1.3 Résultats & Analyse

Bases DCT 8x8
Fig. 1 : Visualisation des 64 bases DCT – de la basse fréquence (coin supérieur gauche) aux hautes fréquences (coin inférieur droit).

Les basses fréquences portent l’essentiel de l’énergie visuelle (zones uniformes), tandis que les hautes fréquences codent les détails et contours. Cette séparation justifie la quantification plus agressive sur les composantes élevées.

2. Décomposition et analyse par blocs

2.1 Chargement et DCT

Nous chargeons « lena.pgm » en double précision puis appliquons la DCT 2D sur chaque bloc 8×8 via blockproc.

2.2 Extrait MATLAB

      
      
  im = double(imread('lena.pgm'));
  imdct = blockproc(im, [8 8], @(b) dct2(b.data));
  figure; imshow(log(abs(imdct)), []);
  title('Coefficients DCT (échelle logarithmique)');
      
    

2.3 Résultats & Analyse

Coefficients DCT log
Fig. 2 : Carte des coefficients DCT (log|F(u,v)|). Le pic au DC (coin) chute rapidement, signe d’une énergie concentrée.

Le coefficient DC (u=v=0) correspond à la moyenne de chaque bloc. La décroissance rapide des coefficients AC illustre la forte corrélation spatiale.

2.4 Nombre de coefficients pour 99 % de l’énergie

      
      
  imci = blockproc(imdct, [8 8], @(b) nbcoef(b.data));
  b    = imci(1:8:end, 1:8:end);
  avg_nb = mean(b(:));
  fprintf('Moyenne ≈ %.2f coefficients pour 99%% de l''énergie\n', avg_nb);
      
    
Nombre de coefficients
Fig. 3 : Distribution du nombre de coefficients nécessaires par bloc pour 99 % de l’énergie. Les zones texturées exigent davantage de coefficients que les zones lisses.

Résultat : en moyenne 11 coefficients suffisent sur 64 pour restituer 99 % de l’énergie.

3. Reconstruction par DCT inverse

3.1 Extrait MATLAB

      
      
  imrec = blockproc(imdct, [8 8], @(b) idct2(b.data));
  err   = im - imrec;
  figure; imshow(uint8(imrec));
  title('Image reconstruite (IDCT)');
      
    

3.2 Résultats & Analyse

Image reconstruite
Fig. 4 : Image reconstruite sans quantification – MSE=0, PSNR=∞.

La reconstruction IDCT restitue exactement l’original pour un quantificateur unitaire, validant l’orthogonalité et l’exactitude numérique de la DCT.

4. Quantification des coefficients DCT

4.1 Méthodologie

On applique la quantification uniforme : F’(u,v) = round( F(u,v) / (λ·Q(u,v)) ), avec Q la table standard luminance et λ le facteur qualité.

4.2 Extrait MATLAB

      
      
  Q       = stdQ();               
  lambdas = [0.25 0.5 2 4 8];
  psnr    = zeros(size(lambdas));
  
  for k = 1:length(lambdas)
    L   = lambdas(k);
    P   = L * Q;
    imq = blockproc(im, [8 8], @(b) round(dct2(b.data) ./ P));
    imdq= blockproc(imq,[8 8], @(b) idct2(b.data .* P));
  
    mse = mean((im - imdq).^2, 'all');
    psnr(k) = 10*log10(255^2 / mse);
    fprintf('λ=%.2f → PSNR=%.2f dB\n', L, psnr(k));
  end
  
  figure;
  plot(lambdas, psnr, '-o', 'LineWidth',1.5);
  xlabel('\lambda'); ylabel('PSNR (dB)');
  title('Évolution du PSNR en fonction de \lambda');
  grid on;
      
    

4.3 Résultats & Analyse

PSNR vs lambda
Fig. 5 : PSNR vs λ – plus λ croît, plus la quantification est grossière et la PSNR diminue.

La courbe confirme la relation inverse entre le pas de quantification et la qualité perçue.