2011-07-20 17 views
7

Natknąłem się na tę niesamowitą odpowiedź Applying MATLAB's idwt2 several times, którą wykonałem, aby ją zrozumieć. Jednak nie jestem w stanie uzyskać, jak używać tego samego z pracą z obrazem RGB. Mam 3 pytania.Transformacja falkowa dla wymiarów N

  1. Jak kod być stosowane do obrazu RGB tylko przekształconego obrazu wyświetlanego na wyjściu, który jest wraz z komponentów wysokiej i niskiej częstotliwości wzdłuż wiersza i kolumny, to jest możliwe, aby zobaczyć fuzję wszystko składniki jako pojedynczy obraz? Zdaję sobie sprawę, że muszę postawić operatora kotów, ale nie mogę zrozumieć, jak sobie z tym poradzić.

  2. Po drugie, otrzymuję również obraz w postaci mazi! Jestem zakłopotany, ponieważ nie mogę podążać za przyczyną. Dołączyłem również ten sam kod z instrukcją pokazującą, w jaki sposób wygenerowano ten obraz.

    3.Co oznacza pojęcie db1 w sygnaturze funkcji dwt?

KOD:

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

Czy nie masz już zadać to w dniu dzisiejszym? Nie widzę już oryginalnego pytania - czy usunąłeś je i odesłałeś, czy coś? –

+1

Tak, zrobiłem to i pozostało niezauważone i bez odpowiedzi przez cały dzień. Tak więc, domyślam się, może to być powtórzenie go ponownie, aby to podkreślić. Byłoby mi niezmiernie pomocnie, gdybyś mógł przeszukać kilka odpowiedzi zamiast ponownie je edytować, mimo że zachowałem nienaruszoną poprzednią wersję. Dzięki za dodatkowy wysiłek! –

+2

Wszystko, co zrobiłem, to naprawienie tagów - nie edytowałem samego pytania. W celu późniejszego odniesienia, powinieneś spróbować poprawić oryginalne pytanie, jeśli nie otrzymujesz żadnych odpowiedzi, a nie repostować. –

Odpowiedz

9

Próbka obrazu stosowane w my answer to that other question był indexed image, więc istnieje kilka zmian, które muszą być wykonane, aby uzyskać ten kod pracujących dla RGB image.

Najpierw napiszę pytanie dotyczące argumentu 'db1' przekazanego do DWT2. Określa typ falki używanej do dekompozycji (w tym przypadku: Daubechies wavelet). Więcej informacji na temat dostępnych falek można znaleźć w dokumentacji funkcji WFILTERS i WAVEINFO.

Opiszę pierwsze dwa pytania, pokazując, jak zmodyfikować kod z mojej drugiej odpowiedzi na pracę dla obrazu RGB. Będę używał przykładowego obrazu 'peppers.png'. Najpierw będziesz chciał załadować obraz i zdefiniować liczbę wartości, jakie ma każdy składnik koloru. Ponieważ obraz próbki jest niepodpisany 8-bitowy typ całkowity (najczęstsza sytuacja), nColors będzie 256:

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

Jeśli obrazy są większe niepodpisane typy Integer (np 'uint16'), ogólny sposób, aby znaleźć liczba wartości kolorów jest użycie funkcji INTMAX tak:

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

dla kodu wywiązała, zakłada typ obrazu 'uint8'.

Stosowanie dekompozycji nie różni się od przypadku w indeksowanym obrazie.Macierze współczynników będzie po prostu M przez N-o-3 macierzy zamiast M przez N macierzy:

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 

kod do tworzenia się obraz, aby pokazać poziome, pionowe i przekątne części do każdy rozkład będzie zmieniać się na skutek faktu, że obecnie pracuje z 3-D matryc i musi wykorzystać funkcję CAT zamiast operatorem konkatenacji []:

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 

to daje się następujący obraz ukazujący poziomy (górny prawy), pionowe (u dołu po lewej) i przekątne (u dołu po prawej) komponenty dla każdego etapu dekompozycji, wzdłuż w ith zmniejszonego obrazu (lewy górny róg):

enter image description here

Etapy rekonstrukcji są niezmienione od drugiej odpowiedzi. Tylko kod do wyświetlania końcowych obrazów musi być modyfikowany:

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

I dostaniesz obrazek przedstawiający oryginalną RGB obrazu (u góry po lewej), obraz w pełni zrekonstruowany przy wszystkich przechowywanych macierzy współczynników detal (w prawym górnym rogu), a częściowo zrekonstruowany obraz używając żaden z przechowywanych szczegółów macierzy współczynników (na dole po lewej):

enter image description here

+0

Dziękuję, ale czy możliwe jest również wyświetlenie tylko ostatecznego obrazu składającego się z wyłączeniem wszystkich komponentów? Tylko jeden kafelkowy obraz przedstawiający transformację falkową obrazu papryki. Co więcej, zmienna X wydaje się być wbudowana, co oznacza, że ​​żadna inna zmienna nie działa za pomocą X. –

+0

@Ria: Możesz zobaczyć tylko przekształcony obraz w ten sposób: 'imshow (uint8 (wcodemat (cA {N}, nColors) -1));'. Wartość 'N' wynosi 1, 2 lub 3, w zależności od tego, czy chcesz wyświetlić obraz, który został zdekomponowany raz, dwa razy lub trzy razy. 'X' jest po prostu zmienną, którą wybrałem do przechowywania danych obrazu. Możesz łatwo zastąpić' X' wszędzie w kodzie tym, co chcesz nazwać tą zmienną. – gnovice

+0

: Zawarłem powyższą linię po pierwszej pętli for. Wyświetla jednak oryginalny obraz zamiast przekształconego obrazu. Próbowałem z różnymi poziomami N, ale wszystkie dają oryginalny obraz. :( –