2009-07-13 8 views
3

Ich verwende MATLAB, um die diskrete Wavelet-Transformation auf ein Bild anzuwenden. Ich verwende es mehrmals (3), um eine 3-Level-Transformation zu erhalten. Ich verwende die dwt2 Funktion von MATLAB zur Verfügung gestellt, um zu komprimieren und idwt2, um die Dekomprimierung zu machen. Das Problem ist, dass ich nicht weiß, wie man mehrere Male dekomprimiert, wie in Anwendung idwt2 mehrmals auf die vorherige empfangene Ausgabe, da es eine Matrix zurückgibt. Nehmen Sie zum Beispiel:MATLABs IDWT2 mehrmals anwenden

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

Wie soll idwt2 auf x angewendet werden?

Antwort

11

bei der Dokumentation der Suche nach dwt2 und idwt2, scheint es, dass Sie Ihre mehrfach zerlegt Bilder zur Rekonstruktion von 2 allgemeinen Optionen:

  • Shop alle horizontalen, vertikalen und diagonalen Detail Koeffizientenmatrizen von jedem Zerlegungsschritt und benutze sie in der Rekonstruktion.
  • Geben Sie eine leere Matrix() für alle Detailkoeffizientenmatrizen ein, die Sie nicht aus vorherigen Zerlegungsschritten gespeichert haben.

Da es ein langsamer Tag war, hier ist etwas Code zeigen, wie dies zu tun ist und was die Ergebnisse aussehen wie für jeden Fall ...

Zuerst ein Beispielbild laden und einige Variablen initialisieren:

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 

Jetzt gelten die Zersetzungen (in diesem Fall 3) und speichert das Detail Koeffizientenmatrizen aus jedem Schritt in einem Zellenfeld:

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

Um zu sehen, was das endgültige zerlegt Bild sieht aus wie, zusammen mit allen Details Koeffizientenmatrizen auf dem Weg, den folgenden Code ausführen (die Verwendung von wcodemat macht):

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); 

Sie etwas sehen sollen:

enter image description here

Jetzt ist es Zeit zu rekonstruieren! Der folgende Code eine „vollständige“ Rekonstruktion führt (all des gespeicherten Detail Koeffizientenmatrizen verwendet wird) und eine „teilweise“ Rekonstruktion (mit keine von ihnen), dann zeichnet es die Bilder:

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

Beachten Sie, dass das Original (oben links) und die "vollständige" Rekonstruktion (oben rechts) nicht zu unterscheiden sind, aber die "partielle" Rekonstruktion (unten links) ist sehr pixelig. Der Unterschied wäre nicht so gravierend, wenn Sie weniger Zerlegungsschritte anwenden würden, wie nur 1 oder 2.

+0

Danke, sehr nette Antwort. – hyperboreean