Frage

Ich bin mit MATLAB auf ein Bild anwenden Transformation der diskreten Wavelet. Ich bewerbe mich mehrmals (3), um ein 3-Level-Transformation zu erhalten. Ich bin mit der dwt2 Funktion von MATLAB vorgesehen, um zu komprimieren und idwt2, um die Dekompression zu machen. Das Problem ist, dass ich weiß nicht, wie mehrmals zu dekomprimieren, wie in idwt2 mehrmals auf den vorherigen empfangenen Ausgangs gelten, da sie eine Matrix zurückgibt. Nehmen Sie zum Beispiel:

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

Wie soll idwt2 auf x angewendet werden?

War es hilfreich?

Lösung

in der Dokumentation der Suche nach dwt2 und idwt2 , scheint es, dass Sie zwei allgemeine Optionen haben Ihre mehrfach zerlegt Bilder zu rekonstruieren:

  • Geschäft all horizontalen, vertikalen und diagonalen Detail Koeffizientenmatrizen von jedem Zersetzungsschritt und sie bei der Rekonstruktion verwendet werden.
  • Geben Sie eine leere Matrix ([]) für alle Detail Koeffizientenmatrizen, die Sie sich nicht aus der Zersetzung Schritte 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 laden Sie ein Beispielbild und initialisieren einige Variablen:

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 speichern 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 (die Verwendung von 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);

Sie sollten etwas wie diese:

Jetzt ist es Zeit zu rekonstruieren! Der folgende Code führt einen „voll“ Umbau (mit alle des gespeicherten Angaben zum Koeffizientenmatrizen) und ein „teilweise“ Umbau (mit kein 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);

Beachten Sie, dass das Original (oben links) und die „voll“ Rekonstruktion (oben rechts) sehen nicht zu unterscheiden, aber die „partielle“ Rekonstruktion (unten links) ist sehr pixelig. Der Unterschied wäre nicht so schwerwiegend sein, wenn Sie wenige Zersetzungsschritte, wie nur 1 oder 2 angewandt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top