La aplicación de idwt2 varias veces de MATLAB
-
12-09-2019 - |
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?
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:
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);
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.