2011-07-20 15 views
7

Me encontré con esta increíble respuesta Applying MATLAB's idwt2 several times que ejecuté para entenderlo por mí mismo. Sin embargo, no puedo obtener la forma de usar el mismo con el trabajo con una imagen RGB. Entonces, tengo 3 preguntas.Transformada Wavelet para N dimensiones

  1. ¿Cómo el código puede aplicar a una imagen RGB sólo con la imagen transformada se muestra en la salida que es junto con los componentes de alta y baja frecuencia a lo largo de la fila y la columna, es posible ver la fusión de todo los componentes como una sola imagen? Soy consciente de que tengo que poner el operador de gato, pero no puedo entender cómo hacerlo.

  2. En segundo lugar, ¡también estoy obteniendo una imagen mazed! Estoy perplejo ya que no puedo seguir el motivo. También he adjuntado el mismo código con la declaración que muestra cómo se ha generado esta imagen.

    3. ¿Qué significa el término db1 en la firma de función de dwt?

CÓDIGO:

load woman;    % Load image data 
%startImage=imread('pic_rgb.jpg'); % IF I WANT TO WORK WITH RGB IMAGE 
    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 
    startImage = X; 
    for iLevel = 1:nLevel, 
     [cA{iLevel},cH{iLevel},cV{iLevel},cD{iLevel}] = dwt2(startImage,'db1'); 



    startImage = cA{iLevel}; 
    end 

    figure;colormap(map); 
    imagesc(dwt2(startImage,'db1')); %THIS GIVES THE MAZED IMAGE INSTEAD OF THE TRANSFORMED IMAGE 
    figure; 
    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); 

    %reconstruct 
    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); 
+0

no ¿ya esta pregunta el día de hoy? Ya no veo la pregunta original, ¿la eliminaste y volviste a publicarla o algo por el estilo? –

+1

Sí, claro que sí y pasó desapercibido y sin respuesta durante todo el día. Entonces, supuse que podría volver a publicarlo para resaltarlo. Hubiera sido de gran ayuda si al menos pudieras hacer malabarismos con algunas respuestas en lugar de volver a editarlas nuevamente, aunque mantuve intacta tu versión editada anterior. ¡Gracias por el esfuerzo adicional! –

+2

Todo lo que hice fue corregir las etiquetas; no edité la pregunta en sí. Para referencia futura, debe tratar de mejorar la pregunta original si no obtiene ninguna respuesta, en lugar de volver a publicarla. –

Respuesta

9

La imagen muestra utilizada en my answer to that other question era un indexed image, por lo que hay algunos cambios que deben hacerse para conseguir que el código de trabajo para un RGB image.

Primero abordaré su pregunta sobre el argumento 'db1' pasado al DWT2. Esto especifica el tipo de wavelet a usar para la descomposición (en este caso, un Daubechies wavelet). Se puede encontrar más información sobre wavelets disponibles en la documentación para las funciones WFILTERS y WAVEINFO.

Voy a abordar sus dos primeras preguntas mostrándole cómo modificar el código de mi otra respuesta para trabajar con una imagen RGB. Usaré la imagen de muestra 'peppers.png'. Primero querrá cargar su imagen y definir la cantidad de valores que tiene cada componente de color. Dado que la imagen de la muestra es un tipo unsigned entero de 8 bits (la situación más común), nColors habrá 256:

X = imread('peppers.png'); %# Load sample image 
nColors = 256;    %# Number of values per color component 

Si las imágenes son tipos de enteros sin signo de mayor tamaño (por ejemplo 'uint16'), de manera general para encontrar el número de valores de color es utilizar la función de INTMAX así:

nColors = double(intmax(class(X)))+1; 

para el código subsiguiente, un tipo de imagen de 'uint8' se supone.

La aplicación de las descomposiciones no es diferente de la de la imagen indexada.Las matrices de coeficientes serán simplemente M-por-N-por-3 matrices en lugar de matrices M-por-N:

nLevel = 3;    %# Number of decompositions 
cA = cell(1,nLevel); %# Approximation coefficient storage 
cH = cell(1,nLevel); %# Horizontal detail coefficient storage 
cV = cell(1,nLevel); %# Vertical detail coefficient storage 
cD = cell(1,nLevel); %# Diagonal detail coefficient storage 
startImage = X; 
for iLevel = 1:nLevel, %# Apply nLevel decompositions 
    [cA{iLevel},cH{iLevel},cV{iLevel},cD{iLevel}] = dwt2(startImage,'db1'); 
    startImage = cA{iLevel}; 
end 

el código para crear la imagen en mosaico para mostrar los componentes horizontales, verticales y diagonales para cada uno de descomposición cambiará debido al hecho de que ahora estamos trabajando con matrices en 3-D y debemos utilizar la función CAT en lugar del operador de concatenación []:

tiledImage = wcodemat(cA{nLevel},nColors); 
for iLevel = nLevel:-1:1 
    tiledImage = cat(1,cat(2,tiledImage,... 
          wcodemat(cH{iLevel},nColors)),... 
        cat(2,wcodemat(cV{iLevel},nColors),... 
          wcodemat(cD{iLevel},nColors))); 
end 
figure; 
imshow(uint8(tiledImage-1)); %# Convert to unsigned 8-bit integer to display 

Esto le dará a la siguiente imagen que muestra la horizontal (arriba a la derecha), componentes verticales (abajo a la izquierda) y diagonales (abajo a la derecha) para cada paso de descomposición, a lo largo de ITH la reducida imagen (arriba izquierda):

enter image description here

Los pasos de reconstrucción no han cambiado desde la otra respuesta. Sólo el código para la visualización de las imágenes finales necesita ser modificado:

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; 
tiledImage = cat(1,cat(2,X,uint8(fullRecon)),... 
        cat(2,uint8(partialRecon),zeros(size(X),'uint8'))); 
imshow(tiledImage,'InitialMagnification',50); 

y obtendrá una imagen que muestra la imagen RGB originales (arriba a la izquierda), la imagen completamente reconstruido utilizando todas las matrices de coeficientes detalle almacenados (arriba a la derecha), y la imagen reconstruida parcialmente el uso de ninguna de las matrices de coeficientes de detalle almacenados (parte inferior izquierda):

enter image description here

+0

Gracias, pero ¿también es posible ver solo la imagen final descompuesta excluyendo todos los componentes? Solo una imagen en mosaico que muestra la transformación wavelet de la imagen de pimientos. Además, la variable X parece estar incorporada, lo que significa que ninguna otra variable funciona aparte desde el uso de X. –

+0

@Ria: Puede ver solo la imagen transformada de la siguiente manera: 'imshow (uint8 (wcodemat (cA {N}, nColors) -1));'. El valor de 'N' es 1, 2 o 3, dependiendo de si desea ver una imagen descompuesta una, dos o tres veces. 'X' es solo la variable en la que elegí almacenar los datos de la imagen. Simplemente puede reemplazar' X' en todas partes del código con lo que quiera llamar esa variable. – gnovice

+0

: Incluí la línea anterior después del primer ciclo for. Pero muestra la imagen original en lugar de la imagen transformada. Intenté con diferentes niveles de N pero todos dan la imagen original. :( –

Cuestiones relacionadas