Le 29 novembre 2013, Rapport projet TS114 COMPRESSION/DECOMPRESSION D UNE IMAGE BINAIRE Par Marc BELLINGER et Antoine BINON. 2eme année Télécommunications. 1
Introduction : Le but de ce projet est d implémenter la compression et décompression sans perte d image binaire d après la recommandation T.4 de l ITU-T (RFC 804). Cette compression est basée sur un codage de Huffman modifié : elle code ligne par ligne les pixels noirs et blancs. Nous verrons dans un premier temps la compression et dans un deuxieme temps la décompression. On appliquera l algorithme de compression à l image monochrome suivante : Figure 1 :test_bin.tif I) Principe du codage à une dimension. a) Détection des séquences 0 et des 1 On va appliquer la fonction longueur_bits à toutes les lignes de l image. Celle-ci va renvoyer un tableau contenant la longueur des suites de pixels noirs (valeur 0) et blancs (valeur 1), en commençant toujours par le calcul des pixels blancs. Le cas où la ligne commence par des pixels noirs est traité au début de la fonction: la première valeur donnée par la fonction est alors 0. Sinon, tant que l on lit des pixels blancs, on incrémente la variable de longueur. Par exemple la séquence de bits suivant «000110010100» sera codé [0 3 2 1 1 1 2]. 2
b) Codage Cette deuxième étape consiste à coder une ligne complète de pixels en noirs et blancs. On va utiliser pour cela deux fichiers, white_codes et black_codes, qui vont coder les longueurs des séquences de pixels blancs et noirs obtenues précédemment avec un codage de Huffman. Ce codage sera fixe et donc pas adapté de manière optimale à l image traitée. Il en résultera cependant une réduction de nombre de bits à transmettre, d où la compression. Ces fichiers codent deux types d informations : Terminating et MakeUp. Chaque séquence de pixels est représentée soit par un code Terminating seul (longueur comprise entre 0 et 63) soit par la concaténation d un code MakeUp et d un code Terminating(longueur supérieure ou égale à 64).Dans le dernier cas, le code MakeUp indique le multiple de 64 le plus proche par valeur inférieure tandis que le code Terminating indique la différence de la longueur totale de la séquence avec la longueur ainsi codée. Dans le cas du code 64 (ou de n importe quel multiple de 64), on codera donc un Terminating nul. De plus à la suite du vecteur renvoyé par la fonction, on ajoute le code de fin de ligne (code EOL= End Of Line) 000000000001. Ce code ne fait pas partie des dictionnaires, il sert donc à resynchroniser le décodage en cas d erreur dans la transmission des données. On ajoute de plus à la fin du codage du document un code de fin de document (code EOF= End Of File), qui correspond à six codes EOL consécutifs On utilise la fonction lire_codes pour lire dans les fichiers, white_codes et black_codes,, les codes binaires correspondant aux différentes longueurs de séquences. Puis on utilise la fonction codage qui retourne le codage complet d une ligne obtenue par la concaténation des codes binaires correspondant aux séquences successives de pixels noirs et blancs. c) Ecriture dans le fichier Cette dernière étape de la compression consiste à simuler la transmission des données en écrivant la séquence retournée par la fonction précédente dans fichier. Pour cela les bits sont regroupés dans des formats permettant l écriture dans un fichier (uint8,uint16, etc ) dans ce TP nous avons choisi le format uint8 pour cela nous avons converti la suite binaire en décimal sur 8 bits.. Toutes la difficulté de cette partie réside dans la gestion des derniers bits car le code final n est pas obligatoirement multiple de 8 ou 16. Pour cela on rajoute nous effectuons un padding de 0 afin de chaine afin d obtenir un code multiple de 8. 3
II) Décompression On va reprendre les opérations effectuées sur l image dans l ordre inverse de la première partie. a) Lecture dans un fichier Cette étape est l inverse de la précédente.il s agit de lire un fichier en effet on lit les données en uint8 que l on convertit en binaire par le biais de la fonction imread qui prends en paramètre le format uint8. b) Décodage Cette étape consiste à décoder une suite de 0 et 1 en suivant un des principes du codage de Huffman disant qu un code ne peut pas être le préfixe d un autre. Ainsi en suivant l énoncé du TP, il est possible de représenter les codes sous la forme d un arbre : Figure 2 : Représentation des codes sous la forme d arbre Le meilleur moyen d implémenter ces arbres est l utilisation de tableau. Il en faut un pour les pixels blancs et un pour les pixels noirs. On peut donc stocker les codes binaires dans un tableau dont chaque case représente un code binaire et contient la longueur de la séquence associée au code binaire. Pour accéder au bon indice du tableau en fonction de la séquence décodée on suit l algorithme suivant: - Si c'est un 1, on multiplie l'indice actuel par deux et on lui ajoute un. -Si c'est un 0, on le multiplie simplement par deux. On décode les arbres grâce au fichier arbres_code.txt (Figure 2) qui contient white_tree et black_tree les deux arbres différents pour chaque couleur, en avancant dans l arbre grâce au 0 et 1 contenus dans la chaine, jusqu'à tombé sur une valeur de code de white ou black differentes de -1 ou 8193 correspondant a un EOL (2 2) 2 + 1. On remplis 4
alors le vecteurs par les chiffres retournés par les arbres. Ce sont les nombres de 1 pour les pixels blancs et 0 pour les pixels noirs qui se suivent. Il devient alors facile de reconstruire l image. c) Reconstruction des séquences de 0 et de 1 Une fois en possession de la matrice des longueurs de séquences de 0 et de 1, on parcourt chaque ligne de la matrice. On recrée l image en juxtaposant successivement des séquences de 1 puis de 0 de la longueur lue dans la matrice, sachant que la première longueur est celle d une séquence de 1. Et enfin on remets en forme le vecteurs à la taille de l image de base. d) Pertes et taux de compression A partir des vecteurs générer sous Matlab on a pu calculer les pertes entre le signal décompressé et le signal d origine, on n observe aucune perte. Puis on a calculé le taux de compression entre l image d origine et le fichier compressé qui est de l ordre 62%. Conclusion : Dans ce TP, nous avons pu aborder le fonctionnement d envoie d image par fax. En effet, nous avons d abord implémenté une partie de codage ligne par ligne ainsi que de transmission d un fichier binaire à partir d une image donnée. Ensuite, tout en respectant les normes de codage et d identification des lignes, nous avons restitué des lignes de pixels afin de reconstituer l image de départ. Il a été intéressant d étudier un type de compression qui s appuie sur la redondance des pixels et un codage de Huffman que nous avons pu étudier plus théoriquement en 1 ère année. Ainsi les répétitions de pixels redondants peuvent êtres binarisées avec moins de mémoire que l information portée par les pixels eux-mêmes. Ce TP nous a permis d illustrer l importance de la compression et notamment la nécessité de respecter des normes précises pour permettre le codage d une part et le décodage de l autre. 5