Pergunta

Eu estou usando MATLAB para aplicar a Transformada Wavelet Discreta em uma imagem. Estou aplicando-a várias vezes (3) a fim de obter transformar um nível 3. Eu estou usando a função dwt2 fornecido pelo MATLAB, a fim de comprimir e idwt2 para fazer a descompressão. O problema é que eu não sei como para descomprimir várias vezes, como em aplicar idwt2 várias vezes para a saída recebida anterior, ele retorna uma matriz. Tomemos por exemplo:

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

Como deve idwt2 ser aplicado a x?

Foi útil?

Solução

Olhando para a documentação para dwt2 e idwt2 , parece que você tem 2 opções gerais para reconstruir suas imagens multiplicam-decompostos:

  • Guarde todas as matrizes de coeficientes detalhes horizontais, verticais e diagonais de cada etapa de decomposição e usá-los na reconstrução.
  • Digite uma matriz vazia ([]) para quaisquer matrizes de coeficientes detalhe que você não salvou a partir das etapas de decomposição anteriores.

Desde que foi um dia lento, aqui está um pouco de código mostrando como fazer isso e quais os resultados parecer para cada caso ...

Em primeiro lugar, carregar uma imagem de amostra e inicializar algumas variáveis:

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

Agora, aplicam-se as decomposições (neste caso 3) e armazenar as matrizes de coeficientes detalhe de cada passo de uma matriz de células:

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

Para ver o que os olhares imagem decompostos finais gosta, juntamente com todas as matrizes de coeficiente de detalhes ao longo do caminho, execute o seguinte código (que faz uso de 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);

Você deve ver algo como isto:

enter descrição da imagem aqui

Agora é hora de reconstruir! Os seguintes executa código de uma reconstrução "full" (usando todas do detalhe armazenado matrizes de coeficientes) e uma reconstrução "parcial" (usando nenhum deles), então ele traça o imagens:

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 descrição da imagem aqui

Observe que o original (canto superior esquerdo) e a reconstrução "full" (canto superior direito) veja indistinguíveis, mas a reconstrução "parcial" (canto inferior esquerdo) é muito pixelizada. A diferença não seria tão grave se você aplicou menos etapas de decomposição, como a apenas 1 ou 2.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top