BE 1 –Transformation DCT – Compression d`image
Transcription
BE 1 –Transformation DCT – Compression d`image
François Tassin / Guillaume Dutertre 1 BE 1 –Transformation DCT – Compression d’image BE ‐ La transformation en cosinus discrète (DCT, inverse DCT) et son application à la compression d’image Le but de ce BE est d’étudier la compression JPEG, tout du moins une partie de la compression, à savoir la transformation en cosinus discrète puis quantification. Dans un premier temps, on codera une fonction MATLAB permettant d’effectuer une transformation DCT sur une matrice de taille 8*8. Ensuite, on intègrera cette fonction dans un ensemble permettant la compression d’images. On s’intéressera à l’influence du facteur de quantification (qui détermine la matrice de quantification utilisée dans le processus de compression) sur le taux de compression (on se contentera de compter le nombre de coefficients non nuls dans les matrices) et sur l’erreur entre une image avant et après compression/décompression. Les étapes de la compression d’une image sont les suivantes : 1) La fonction « lecture_image_bmp » renvoie les 3 matrices de dimensions 2 contenant les valeurs de chaque composante RGB des pixels de l’image. 2) La fonction « conversion_spatial_frequantiel » convertit chaque bloc 8*8 de la matrice en appliquant la DCT sur ces blocs, puis divise ces blocs par une matrice de quantification dont les coefficients dépendent du facteur de quantification demandé (on utilise ici des facteurs entre 1 et 25). 3) La fonction « ecriture_jpg » se charge d’enregistrer les coefficients calculés dans un fichier. Ajout de la fonction « m_DCT2 » dans MATLAB On se charge d’insérer une fonction « m_DCT2 » permettant de renvoyer la transformée en cosinus discrète d’une matrice. La formule est la suivante : Avec DCT la matrice de sortie (après transformation), pixel celle d’entrée de taille N*N. Voici le code MATLAB de cette fonction : function [a] = m_DCT2(m) [N,N] = size(m); a = zeros(N,N); for i=0:N-1 for j=0:N-1 if i==0 c1=1/sqrt(2); else c1=1; François Tassin / Guillaume Dutertre 2 BE 1 –Transformation DCT – Compression d’image end if j==0 c2=1/sqrt(2); else c2=1; end for u=0:N-1 for v=0:N-1 a(i+1,j+1)=a(i+1,j+1)+1/sqrt(2*N)*c1*c2*m(u+1,v+1)*cos(pi*i/N*(u+1/2))*cos(pi*j/N*(v+1/2)); end end end end end Application de la compression DCT à une image On intègre cette fonction dans le processus de compression DCT, puis on applique cette compression à une image de 352*288 pixels avec un facteur de quantification allant de 1 à 25. On observe l’image décompressée, on calcule le facteur de compression (nombre de termes non nuls après compression divisé par le nombre de termes au départ (353*288*3)) ainsi que l’erreur (on calcule la norme 2 de la matrice de différence entre la matrice initiale et celle décompressée). Voici l’image originale : François Tassin / Guillaume Dutertre 3 BE 1 –Transformation DCT – Compression d’image Voici quelques images obtenues après compression puis décompression pour différents facteurs de quantification : 1 5 10 15 20 25 On remarque que plus le facteur de quantification augmente, plus la qualité diminue. En effet, l’image paraît de plus en plus « floue » lorsque le facteur augmente, et on visualise de plus de plus le découpage de l’image par bloc de 8*8 pixels. En effet, plus le facteur de quantification est élevé, plus les termes de la matrice de quantification sont grands, et donc plus de termes de la matrice DCT François Tassin / Guillaume Dutertre 4 BE 1 –Transformation DCT – Compression d’image après quantification (division par la matrice de quantification) sont négligés, il y a donc plus de données perdues. Les matrices de coefficients DCT ne contiennent pas de zéros après l’application de l’algorithme de quantification. Il faut donc choisir la valeur minimale des coefficients à garder dans la matrice et utiliser un algorithme qui va remplacer les coefficients inférieurs à cette valeur par zéro. On choisit de ne garder que les valeurs absolues supérieures à 1. On obtient les résultats suivants : Compression en fonction de la quantification Taux de compression 0,6 0,5 0,4 0,3 0,2 0,1 0 0 5 10 15 20 25 30 Indice de quantification On remarque que le taux de compression diminue lorsque le facteur de quantification augmente, mais non linéairement. En effet, les termes de la matrice de quantification dépendent du facteur de quantification (de façon affine), donc lorsque l’on divise les termes de la matrice DCT par ceux de la matrice de quantification, ces derniers évoluent de manière inversement proportionnelle au facteur de quantification. On peut supposer que c’est la raison pour laquelle la courbe de compression évolue de cette manière. On observe ensuite l’erreur entre l’image originale et l’image compressée puis décompressée : Erreur en fonction de la quantification 7000000 Norme de l'erreur 6000000 5000000 4000000 3000000 2000000 1000000 0 0 5 10 15 Indice de quantification 20 25 30 François Tassin / Guillaume Dutertre 5 BE 1 –Transformation DCT – Compression d’image On calcule de même l’erreur moyenne que l’on divise par la valeur moyenne des termes de la matrice de départ, on obtient le pourcentage d’erreur moyen : Pourcentage d'erreur moyenne Pourcentage d'erreur en fonction de la quantification 20 15 10 5 0 0 5 10 15 20 25 30 Indice de quantification On remarque que l’erreur augmente avec le facteur de quantification. En effet, plus on compresse l’image de départ, plus on perd une partie de l’information, c’est pourquoi l’évolution de l’erreur est complémentaire à celle de la compression. Conclusion Le procédé de compression JPEG permet en général de compresser l’image sans perte significative de qualité. Cependant, si on cherche à diminuer de façon plus importante la taille de l’image, la perte de qualité devient visible par l’œil humain. D’après les courbes obtenues plus haut, on peut trouver un taux de compression optimum permettant d’effectuer un bon compromis entre une erreur faible et une bonne compression.