2009-07-13 8 views
3

J'utilise MATLAB pour appliquer la Transformée d'ondelettes discrètes sur une image. Je l'applique plusieurs fois (3) afin d'obtenir une transformation à 3 niveaux. J'utilise la fonction dwt2 fournie par MATLAB afin de compresser et idwt2 pour faire la décompression. Le problème est que je ne sais pas comment décompresser plusieurs fois, comme dans idwt2 appliquer plusieurs fois à la sortie reçue précédente, car elle retourne une matrice. Prenez par exemple:Application de plusieurs fois l'idwt2 de MATLAB

x = idwt2(scaled3, vertical3, horizontal3, diagonal3, Lo_R, Ho_R); 

Comment idwt2 doit-il être appliqué à x?

Répondre

11

regardant la documentation dwt2 et idwt2, il semble que vous avez 2 options générales pour reconstruire vos images décomposées se multiplient-:

  • magasin toutes les matrices de coefficients de détail horizontales, verticales et diagonales de chaque étape de décomposition et les utiliser dans la reconstruction.
  • Entrez une matrice vide ([]) pour les matrices de coefficients de détail que vous n'avez pas sauvegardées lors des étapes de décomposition précédentes.

Comme il était un jour lent, voici un code montrant comment faire et ce que les résultats ressemblent pour chaque cas ...

En premier lieu, charger une image de l'échantillon et initialiser certaines variables:

load woman;    % Load image data 
nLevel = 3;    % Number of decompositions 
nColors = size(map, 1); % Number of colors in colormap 
cA = cell(1, nLevel); % Approximation coefficients 
cH = cell(1, nLevel); % Horizontal detail coefficients 
cV = cell(1, nLevel); % Vertical detail coefficients 
cD = cell(1, nLevel); % Diagonal detail coefficients 

maintenant, appliquer les décompositions (dans ce cas 3) et stocker les matrices de coefficients de détail de chaque étape dans une matrice de cellules:

startImage = X; 
for iLevel = 1:nLevel, 
    [cA{iLevel}, cH{iLevel}, cV{iLevel}, cD{iLevel}] = dwt2(startImage, 'db1'); 
    startImage = cA{iLevel}; 
end 

Pour voir ce que l'image décomposée finale ressemble, ainsi que toutes les matrices de coefficients de détail le long du chemin, exécutez le code suivant (qui utilise wcodemat):

tiledImage = wcodemat(cA{nLevel}, nColors); 
for iLevel = nLevel:-1:1, 
    tiledImage = [tiledImage     wcodemat(cH{iLevel}, nColors); ... 
       wcodemat(cV{iLevel}, nColors) wcodemat(cD{iLevel}, nColors)]; 
end 
figure; 
imshow(tiledImage, map); 

Vous devriez voir quelque chose comme ceci:

enter image description here

Maintenant il est temps de reconstruire! Le code suivant effectue une reconstruction « complète » (en utilisant tous des matrices de coefficients de détail stockées) et une reconstruction « partielle » (en utilisant aucune d'entre eux), il trace les images:

fullRecon = cA{nLevel}; 
for iLevel = nLevel:-1:1, 
    fullRecon = idwt2(fullRecon, cH{iLevel}, cV{iLevel}, cD{iLevel}, 'db1'); 
end 
partialRecon = cA{nLevel}; 
for iLevel = nLevel:-1:1, 
    partialRecon = idwt2(partialRecon, [], [], [], 'db1'); 
end 
figure; 
imshow([X fullRecon; partialRecon zeros(size(X))], map, ... 
     'InitialMagnification', 50); 

enter image description here

Notez que la reconstruction originale (en haut à gauche) et la reconstruction "complète" (en haut à droite) ne se distinguent pas, mais la reconstruction "partielle" (en bas à gauche) est très pixellisée. La différence ne serait pas aussi sévère si vous appliquiez moins d'étapes de décomposition, comme juste 1 ou 2.

+0

Merci, très belle réponse. – hyperboreean

Questions connexes