Die Anwendung idwt2 der MATLAB mehrmals
-
12-09-2019 - |
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?
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.