TP Ondelettes SI222
Transcription
TP Ondelettes SI222
Compression d’images par ondelettes SI 222 Le but de ce TP est de utiliser les ondelettes pour le codage d’images. D’abord vous essaierez les performances et les fonctionnalités des codeurs JPEG et JPEG2000. En suite il vous sera demandé de réaliser un algorithme de compression d’images basé sur une décomposition en ondelettes suivie d’une quantification optimale des sous-bandes. Avant de commencer le TP, il faut : 1. Au démarrage du PC, utiliser le système d’exploitation par défaut (notamment Debian GNU/Linux with Linux 3.12.18-enst.1). 2. Sur la page de connexion, choisir VM Windows XP (2014). 3. Une fois ouverte la session Windows, créer deux répertoires de travail sur le Bureau : H:\Desktop\TP et H:\Desktop\Wavelab 4. Ouvrir un navigateur Web et télécharger les fichiers supplémentaires (programmes et images) et le logiciel Wavelab de la rubrique “8 - TP compression d’images” à la page web : http://cagnazzo.wp.mines-telecom.fr/?p=445 5. Les instructions pour installer Wavelab sont ici : : http://cagnazzo.wp.mines-telecom.fr/?p=666 6. Extraire tous les fichiers des archives compressés dans le répertoire de travail H:\Desktop\TP. NB. Les comptes rendus doivent être envoyés au plus tard la veille de l’examen à : [email protected] 1 Codage avec JPEG2000 1. Chargez l’image peppers avec x=imread(’peppers.bmp’); et visualisez la avec image(x);. Codez cette image avec JPEG, en utilisant les instructions qui suivent : qualities = [ 4 10 24 45 65]; for q=qualities, outFile = sprintf(’peppers_%.2d.jpg’,q); imwrite(x,outFile,’quality’,q); rate = filesize(outFile)*8/size(x,1)/size(x,2); fprintf(’Quality: %d Rate: %1.3f bpp\n’,q,rate); end Visualisez les images codées à l’aide de l’explorateur de Windows. Que constatez-vous par rapport à la qualité de ces images ? 2. Codez l’image peppers avec JPEG2000 : !kdu_compress -i peppers.bmp -o peppers.jp2 -rate 0.1,0.2,0.3,0.5,0.75,1.0 Visualisez le résultats avec le programme kdu_show. Changez le débit de décodage à l’aide des touches < et >. Comparez avec la qualité obtenue dans le cas JPEG. 1 2 3. Décodez l’image peppers.jp2 avec différents niveaux de résolution : !kdu_expand -i peppers.jp2 -o peppers_R1.bmp -reduce 1 !kdu_expand -i peppers.jp2 -o peppers_R2.bmp -reduce 2 Visualisez les résultats avec l’explorateur de Windows. 4. Décodez l’image peppers.jp2 avec différents niveaux de résolution et de qualité : !kdu_expand !kdu_expand !kdu_expand !kdu_expand -i -i -i -i peppers.jp2 peppers.jp2 peppers.jp2 peppers.jp2 -o -o -o -o peppers_R1L4.bmp peppers_R1L3.bmp peppers_R1L2.bmp peppers_R1L1.bmp -reduce -reduce -reduce -reduce 1 1 1 1 -layers -layers -layers -layers 4 3 2 1 Visualisez les résultats avec l’explorateur de Windows. 5. Codez l’image peppers avec des “régions d’intérêt” statiques (commande à saisir sur une seule ligne) : !kdu_compress -i peppers.bmp -o peppers_ROI.jp2 -rate 0.05,4 Clayers=30 Rshift=14 Rlevels=5 -roi {0,0.45},{0.6,0.22} Visualisez le résultats avec le programme kdu_show. Changez le bit-rate de codage à l’aide des touches < et >. Comparez avec la qualité de la région d’intérêt par rapport à l’arrière-plane quand on varie le débit de codage. 6. Décodez l’image peppers.jp2 avec des “régions d’intérêt” dynamiques : !kdu_expand -i peppers.jp2 -o peppers_dynamicROI.bmp -region {0.4,0.45},{0.6,0.32} 2 Analyse multirésolution 1. Calculez la réponse impulsionnelle du filtre passe-bas de l’AMR orthogonale de Daubechies d’ordre 4 (c’est-à-dire, avec 4 moments nuls) au moyen de la fonction qmf = MakeONFilter(’Daubechies’,8). 2. Déterminez la réponse fréquentielle de ce filtre en effectuant une FFT sur 256 points de cette réponse impulsionnelle. Représentez graphiquement le module de cette réponse fréquentielle. Comment ce graphe est-il modifié quand on augmente ou on diminue l’ordre du filtre ? 3. Créez plusieurs signaux à partir de fonctions polynomiales d’ordres différents : rampe, polynomiale par morceaux, régulier par morceaux en utilisant la fonction MakeSignal). Effectuez la décomposition 1D en ondelettes de Daubechies-8 périodisées de ces signaux, au moyen de la fonction FWT_PO 1 . Qu’observezvous, en particulier par rapport aux détails et aux discontinuités ? Que se passe-t’il en utilisant des filtres de tailles différentes ? 4. Chargez l’image lena.pgm avec les fonctions imread et transformez-la en format double avec la commande double (nécessaire pour manipuler l’image). Affichez l’image avec les commandes image et colormap(gray(256)), ce dernier assurant une correcte visualisation. 5. Réalisez les décompositions 2D en ondelettes de l’image lena avec la fonction FWT2_PO sur 1 niveau puis sur 2 niveaux et visualisez-les avec image et avec imagesc. Qu’observez-vous à propos de la dynamique des différentes sous-bandes ? Quelles conclusions concernant la compression pouvez-vous en tirer ? 6. Reprenez les questions précédentes, en générant des ondelettes biorthogonales à l’aide de la fonction [qmf,dqmf] = MakeBSFilter(Type,Par), avec Type =’Villasenor’ et Par=1, ce qui correspond aux ondelettes 9/7, et en réalisant la décomposition multirésolution au moyen des fonctions FWT_SBS et FWT2_SBS. Que constatez-vous par rapport aux problèmes d’extension de l’image (périodique/symétrique) ? 1. Soit N = 2K la durée du signal, et soit M le nombre de niveaux de décomposition souhaités. Le paramètre L de la fonction FWT_PO doit alors être égal à K − M . SI 222 08 Février 2015 Compression d’images par ondelettes 3 3 Allocation de débit et quantification On fixe pour la suite une décomposition Daubechies-9/7 et un nombre de niveaux de décomposition M = 4. 1. Utilisez la fonction bd = getsb(wc,i,M), capable d’isoler la i-ème sous-bande de la décomposition multirésolution de M niveaux pour visualiser chaque sous-bande. Calculez la variance des sous-bandes résultantes. Affichez aussi les histogrammes de ces sous-bandes au moyen de la fonction hist. Quelles observations pouvez-vous faire ? 2. On peut allouer d’une manière optimale le débit en fonction des variances des sous-bandes en utilisant la relation suivante : I Nj Y 1 σj2 N , bi = b̄ + log2 σi2 / 2 j=1 ∀i ∈ {1, 2, . . . , I} où bi représente le nombre de bits/pixel dans la sous-bande i, I est le nombre total de sous- bandes,b est le débit moyen que l’on s’impose, σi2 la variance de la sous-bande i, Ni le nombre de points de cette même sous-bande et N le nombre total de points dans l’image. Écrivez un programme qui réalise l’allocation de débit en utilisant la formule précédente. Quelle contrainte doivent satisfaire les bi ? Pour un débit global de b̄ = 1 bit/pixel, quels sont les débits des différentes sous-bandes ? Comparez vos résultats à ceux de la fonction ratealloc. 3. On veut calculer les quantificateurs optimaux de Lloyd-Max dans chaque sous-bande. Utilisez la fonction wcq = quantsb(wc,J,b) pour réaliser la quantification optimale des sous-bandes de débits b. Quantifiez l’image au débit global fixé de b̄ = 1 bit/pixel. 4. Utilisez la fonction entropyQ pour calculer l’entropie H de l’image originale. En moyennant par le nombre de coefficients les entropies de chaque sous-bande, quelle est l’entropie moyenne de l’image décomposée et quantifiée ? La diminution de l’entropie vous paraît-elle significative ? Faites varier le nombre de niveaux de résolution ainsi que le type et la longueur du filtre. Quels sont les paramètres optimaux ? 5. Quel est le taux de compression maximum que l’on pourrait obtenir en codant ces sous-bandes ? Comment peut-on approcher ce taux en pratique ? SI 222 08 Février 2015 Compression d’images par ondelettes