2013-09-29 15 views
5

Pracuję nad funkcją w programie Matlab, która oblicza DCT (dyskretną transformację kosinusową) obrazu. Nie wiem, co nie działa w moim kodzie, ale otrzymałem obraz wyjściowy z tym samym numerem. Chcę użyć tej formuły dla mojego DCT.Dyskretna transformacja kosinusowa (DCT) obrazu

Wszelkie pomysły proszę.

function image_comp = dctII(image, b) 
    [h w] = size(image); 
    image = double(image) - 128; 
    block = zeros(b,b); 

image_t=zeros(size(image)); 
for k=1:b:h 
    for l=1:b:w 
     image_t(k:k+b-1,l:l+b-1)= image(k:k+b-1,l:l+b-1); 
     for u=1:b 
      for v=1:b 
       if u == 0 
        Cu = 1/sqrt(2); 
       else 
        Cu = 1; 
       end 
       if v == 0 
        Cv = 1/sqrt(2); 
       else 
        Cv = 1; 
       end 
       Res_sum=0; 
       for x=1:b; 
        for y=1:b 
         Res_sum = Res_sum + ((image_t(x,y))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b))); 
        end 
       end 
       dct= (1/4)*Cu*Cv*Res_sum; 
       block(u,v) = dct; 

      end 
     end 
     image_comp(k:k+b-1,l:l+b-1)=block(u,v); 
    end 
end 
end 
+0

Kod działa z korekcją wymienioną poniżej. Ale sugeruję, żebyś przeczytał pętle, w przeciwnym razie dostaniesz kłopotów z dużą ilością danych. –

Odpowiedz

3

W wewnętrznej pętli powyżej x i y, nie czytasz z właściwego miejsca w image_t. Skopiowałeś blok lokalny w miejsce o k, l jako górnym lewym rogu do wykorzystania w przetwarzaniu, ale w wewnętrznej pętli zawsze czytasz z tego samego bloku, który zaczyna się od 1,1 jako górny lewy róg w obrazie.

+0

Dziękuję Ci za tę pracę. Mam inne pytanie. Jeśli chcę zrobić idct teraz, jaka jest modyfikacja, którą powinienem zrobić. Tutaj mój kod się opłaca. – user2827482

+0

Odwrotny DCT dla DCT typu II to DCT typu III. Jest to prosta sprawa nieznacznej zmiany matematyki. Zobacz sekcje DCT-II i DCT-III z: http://en.wikipedia.org/wiki/Discrete_cosine_transform – mikeTronix

Powiązane problemy