1. Transformée en cosinus discrète

<< | Liste des exercices | Utilisation de la DCT pour la compression JPEG >>

Le but de cet exercice est d'implanter et de valider la transformée en cosinus discrète (DCT) sur une image de taille réduite, de façon à l'appliquer ensuite à chaque bloc d'une image quelconque.

Remarque. Afin que le lien avec le cours soit immédiat, nous allons ici implémenter directement la formule de la DCT donnée en cours. Cependant, il existe des algorithmes bien plus rapides et optimisés pour ce calcul. On trouvera des détails à ce propos dans un intéressant rapport de projet sur JPEG et JPEG2000.

Transformée 2D directe

Afin d'implanter la DCT 2D, nous allons utiliser la propriété de séparabilité de cette transformation. Cette propriété stipule qu'en 2D, la transformation peut être réalisée en effectuant successivement deux transformations 1D : l'une d'abord sur chaque ligne, puis une seconde sur chaque colonne de l'image résultante.

Pour faciliter l'implantation, la classe DCT1D implémentant la DCT monodimensionnelle est fournie. Celle-ci fait partie du package DCT, tout comme DCT2D.java qu'il vous est demandé de compléter. Pour cela,

  • télécharger l'archive du package ;
  • décompresser cette archive dans le répertoire propre <répertoire plugin>/src/DCT/.
  1. Examiner comment sont implémentées les transformées en cosinus discrètes directe et inverse en 1D (dans le fichier DCT1D.java) : expliciter l'entrée, la sortie et la formule de chacune d'elles.
  2. En utilisant la propriété de séparabilité de la DCT, compléter la méthode de classe implémentant la transformation directe en 2D :
public static void forwardDCT(FloatProcessor f)

qui se trouve dans le fichier DCT2D.java. On notera que, dans un souci d'optimisation et contrairement à l'implémentation en 1D, cette méthode transforme sur place (ang. « in-place transform ») un tableau de valeurs transmis sous la forme d'une image FloatProcessor. Autrement dit, elle ne retourne pas de résultat mais écrase les données d'entrée par celles de sortie.

Validation sur un exemple

Afin de valider la transformation précédemment implémentée, on propose de l'appliquer sur l'exemple considéré dans l'article wikipedia (section Discrete cosine transform) traitant de la compression JPEG. Cet exemple correspond à l'image 8x8 suivante :

  1. Écrire un nouveau plugin ImageJ permettant simplement de valider la DCT sur l'image 8x8 en niveau de gris ci-dessus (comparer le résultat obtenu avec celui de l'article wikipedia).

Remarque : Ne pas oublier de centrer les valeurs (en leur soustrayant 128) avant d'appliquer la DCT.

Afin de comparer aisément le résultat obtenu avec celui de l'article wikipedia, on pourra :

  • utiliser la méthode Math.floor pour arrondir une valeur réelle à l'entier inférieur ;
  • utiliser le plugin OOo_Matrix_Writer pour visualiser les valeurs d'une image 8 bits sous la forme de matrice.