2011-07-20 13 views
7

Je suis tombé sur cette étonnante réponse Applying MATLAB's idwt2 several times que j'ai exécutée pour la comprendre moi-même. Cependant, je suis incapable d'obtenir comment utiliser la même chose avec le travail avec une image RVB. Donc, j'ai 3 questions.Transformée en ondelettes pour N dimensions

  1. Comment le code est appliqué à une image RGB avec seulement l'image transformée affichée dans la sortie qui est en même temps que les composantes de fréquence haute et basse le long de rangées et de colonnes, est-il possible de voir la fusion de toutes les composants en tant qu'image unique? Je suis conscient que je dois mettre l'opérateur de chat, mais je ne comprends pas comment s'y prendre.

  2. Deuxièmement, je reçois également une image mazed! Je suis perplexe car je n'arrive pas à suivre la raison. J'ai également joint le même code avec la déclaration montrant comment cette image a été générée.

    3.Que signifie le terme db1 dans la signature de fonction de dwt?

CODE:

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

ne vous demande pas déjà plus tôt aujourd'hui? Je ne vois plus la question originale - l'avez-vous supprimée et reprise? –

+1

Oui, bien sûr que je l'ai fait et il est passé inaperçu et sans réponse pour toute la journée. Donc, je devine peut être de le rediffuser pour le mettre en évidence. Cela aurait été d'une grande aide si au moins vous pouviez jongler avec certaines réponses au lieu de les ré-éditer à nouveau, bien que j'avais gardé intacte votre version précédente. Merci pour l'effort supplémentaire! –

+2

Tout ce que j'ai fait était de corriger les tags - je n'ai pas édité la question elle-même. Pour référence future, vous devriez essayer d'améliorer la question initiale si vous n'obtenez aucune réponse, plutôt que de la rediffuser. –

Répondre

9

L'image de l'échantillon utilisé dans my answer to that other question était un indexed image, donc il y a quelques changements qui doivent être faits pour obtenir ce code de travail pour un RGB image.

Je vais d'abord répondre à votre question à propos de l'argument 'db1' passé à DWT2. Cela spécifie le type d'ondelette à utiliser pour la décomposition (dans ce cas, un Daubechies wavelet). Vous trouverez plus d'informations sur les ondelettes disponibles dans la documentation des fonctions WFILTERS et WAVEINFO.

Je vais répondre à vos deux premières questions en vous montrant comment modifier le code de mon autre réponse à travailler pour une image RVB. Je vais utiliser l'image 'peppers.png' échantillon. Vous devez d'abord charger votre image et définir le nombre de valeurs de chaque composant de couleur. Étant donné que l'image de l'échantillon est un type entier 8 bits non signé (la situation la plus courante), nColors seront 256:

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

Si vos images sont des types entiers non signés plus importants (par exemple 'uint16'), d'une manière générale pour trouver le nombre de valeurs de couleur est d'utiliser la fonction INTMAX comme ceci:

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

pour le code qui a suivi, un type d'image de 'uint8' est supposé.

L'application des décompositions n'est pas différente de celle du cas de l'image indexée.Les matrices de coefficients seront simplement M par N par 3 matrices au lieu des matrices M par 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 

Le code pour créer l'image en mosaïque pour montrer les composantes horizontales, verticales et diagonales pour chaque décomposition changera en raison du fait que nous travaillons maintenant avec des matrices 3-D et doit utiliser la fonction CAT au lieu de l'opérateur de concaténation []:

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 

Cela donnera l'image montrant l'horizontale (en haut à droite), verticale (en bas à gauche) et diagonale (en bas à droite) pour chaque étape de décomposition vec l'image réduite (en haut à gauche):

enter image description here

Les étapes de reconstruction sont inchangées par rapport à l'autre réponse. Seul le code pour afficher les images finales doit être modifié:

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

Et vous obtiendrez une image montrant l'image RVB d'origine (en haut à gauche), l'image entièrement reconstruite en utilisant toutes les matrices de coefficients de détails stockés (haut à droite), et l'image partiellement reconstruite en utilisant aucune des matrices de coefficients de détail stockés (en bas à gauche):

enter image description here

+0

Merci, mais est-il également possible de visualiser uniquement l'image décomposée finale excluant tous les composants? Juste une image en mosaïque affichant la transformée en ondelettes de l'image de poivrons.En outre, la variable X semble être intégrée signifiant qu'aucune autre variable ne fonctionne d'utiliser X. –

+0

@Ria: Vous pouvez voir seulement l'image transformée comme suit: 'imshow (uint8 (wcodemat (cA {N}, nColors) -1));'. La valeur de 'N' est 1, 2 ou 3 selon que vous voulez voir une image qui a été décomposée une fois, deux fois ou trois fois. 'X' est juste la variable que j'ai choisi pour stocker les données d'image. Vous pouvez facilement remplacer' X' partout dans le code avec ce que vous voulez appeler cette variable. – gnovice

+0

: J'ai inclus la ligne ci-dessus après la première boucle. Mais il affiche l'image originale au lieu de l'image transformée. J'ai essayé avec différents niveaux de N mais tous donnent l'image originale. :( –

Questions connexes