2013-09-29 14 views
5

Lavoro su una funzione in Matlab che calcola il DCT (discreto coseno trasformato) di un'immagine. Non so cosa non funzioni nel mio codice, ma ho ottenuto un'immagine di output con lo stesso numero. Voglio usare questa formula per il mio DCT.Trasformata coseno discreta (DCT) di un'immagine

Qualsiasi idea per favore.

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

Il codice funziona con la correzione indicata di seguito. Ma ti suggerisco di leggere i loop, altrimenti avrai problemi a lavorare con molti dati. –

risposta

3

Nel ciclo interno su xey, non state leggendo dalla posizione corretta in image_t. Hai copiato il blocco locale in una posizione con k, l come angolo in alto a sinistra per l'utilizzo in elaborazione, ma nel ciclo interno stai sempre leggendo dallo stesso blocco che inizia con 1,1 come l'angolo in alto a sinistra in image_t.

+0

Grazie a te che lavoro. Ho un'altra domanda per favore. Se voglio fare l'idct ora quali sono le modifiche che dovrei fare. Qui il mio codice è così buono. – user2827482

+0

Il DCT inverso per il DCT di tipo II è di tipo III DCT. È una semplice questione di cambiare leggermente la matematica. Vedi le sezioni DCT-II e DCT-III da: http://en.wikipedia.org/wiki/Discrete_cosine_transform – mikeTronix

Problemi correlati