Pregunta

Estoy utilizando MATLAB para aplicar la Transformada Wavelet Discreta en una imagen. Estoy aplicando varias veces (3) con el fin de obtener una transformada de nivel 3. Estoy utilizando la función dwt2 proporcionada por MATLAB con el fin de comprimir y idwt2 para hacer la descompresión. El problema es que no sé cómo descomprimir varias veces, como en idwt2 se aplican varias veces a la salida recibida anterior, ya que se obtiene una matriz. Tomemos, por ejemplo:

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

¿Cómo debe ser aplicado a idwt2 x?

¿Fue útil?

Solución

En cuanto a la documentación de dwt2 y idwt2 , parece que tienes 2 opciones generales para la reconstrucción de sus imágenes se multiplican descompuesta:

  • Tienda todas las matrices de coeficientes detalle horizontales, verticales y diagonales de cada etapa de descomposición y utilizarlos en la reconstrucción.
  • Introduzca una matriz vacía ([]) para cualquier matrices de coeficientes detalle que no se salvó de los pasos anteriores de descomposición.

Ya que era un día lento, aquí hay un código que muestra cómo hacer esto y lo que los resultados se ven como en cada caso ...

En primer lugar, cargar una imagen de muestra e inicializar algunas variables:

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

Ahora, aplicar las descomposiciones (en este caso 3) y almacenar las matrices de coeficientes detalle de cada paso en una serie 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 lo que la imagen descompuesta última parece, junto con todas las matrices de coeficientes detalle a lo largo del camino, ejecute el siguiente código (que hace 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);

Debería ver algo como esto:

introducir descripción de la imagen aquí

Ahora es el momento de reconstruir! El código siguiente realiza una reconstrucción "completa" (utilizando todos de las matrices de coeficientes detalle almacenados) y una reconstrucción "parcial" (utilizando no de ellos), entonces se traza la imágenes:

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

introducir descripción de la imagen aquí

Tenga en cuenta que el original (arriba a la izquierda) y la reconstrucción "completa" (arriba a la derecha) parecen indistinguibles, pero la reconstrucción "parcial" (abajo a la izquierda) es muy pixelada. La diferencia no sería tan grave si ha aplicado un menor número de pasos de descomposición, como sólo 1 o 2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top