Domanda

Sto usando MATLAB per applicare la trasformata wavelet discreta su un'immagine. Mi candido più volte (3) al fine di ottenere un livello 3 a trasformare. Sto usando la funzione dwt2 fornita da MATLAB per comprimere e idwt2 per rendere la decompressione. Il problema è che io non so come per decomprimere più volte, come in applicano idwt2 più volte per l'uscita ricevuta precedente, in quanto restituisce una matrice. Prendiamo ad esempio:

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

Come dovrebbe essere applicato a idwt2 x?

È stato utile?

Soluzione

Guardando la documentazione per dwt2 e idwt2 , sembra che si hanno 2 opzioni generali per ricostruire le immagini si moltiplicano-decomposto:

  • Conservare tutte le matrici di coefficienti dettaglio orizzontali, verticali e diagonali di ogni stadio di decomposizione e utilizzarli nella ricostruzione.
  • Inserisci una matrice vuota ([]) per le matrici dei coefficienti dettaglio che non sono stati salvati dalle fasi di decomposizione precedenti.

Dato che era una giornata lenta, ecco qualche codice che mostra come farlo e quali sono i risultati assomigliano per ogni caso ...

In primo luogo, caricare un'immagine campione e inizializzare alcune variabili:

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

Ora, applicare le decomposizioni (in questo caso 3) e memorizzare le matrici di coefficienti dettaglio da ogni passo di una matrice di celle:

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

Per visualizzare quali l'immagine finale decomposta assomiglia, insieme a tutte le matrici di coefficienti dettaglio lungo il percorso, eseguire il codice seguente (che fa uso di 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);

Si dovrebbe vedere qualcosa di simile:

entrare descrizione dell'immagine qui

Ora è il momento di ricostruire! Il seguente codice esegue una ricostruzione "full" (usando tutti delle matrici di coefficienti dettaglio memorizzati) e una ricostruzione "parziale" (usando nessuna di loro), allora traccia il immagini:

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

entrare descrizione dell'immagine qui

Si noti che l'originale (in alto a sinistra) e la ricostruzione "pieno" (in alto a destra) appaiono indistinguibili, ma la ricostruzione "parziale" (in basso a sinistra) è molto pixel. La differenza non sarebbe così grave se è stato applicato un minor numero di passaggi di decomposizione, come solo 1 o 2.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top