Question

Je Matlab pour appliquer la discrète transformée en ondelettes sur une image. Je demande plusieurs fois (3) afin d'obtenir un niveau 3 de transformation. J'utilise la fonction dwt2 fournie par Matlab afin de comprimer et idwt2 pour faire la décompression. Le problème est que je ne sais pas comment décompressez plusieurs fois, comme appliquer idwt2 à plusieurs reprises à la sortie reçue précédente, car il renvoie une matrice. Prenons par exemple:

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

Comment devrait idwt2 être appliqué à x?

Était-ce utile?

La solution

En 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-:

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

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

Tout d'abord, 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:

Maintenant, il est temps de reconstruire! Le code suivant effectue une « complète » reconstruction (en utilisant tous des matrices de coefficients de détail stockées) et une reconstruction « partielle » (en utilisant pas 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);

Notez que l'original (en haut à gauche) et la reconstruction « complète » (en haut à droite) semblent impossibles à distinguer, mais la reconstruction « partielle » (en bas à gauche) est très pixélisé. La différence ne serait pas aussi grave si vous avez appliqué moins d'étapes de décomposition, comme à seulement 1 ou 2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top