2012-11-01 76 views
1

我想實現DCT(離散餘弦變換)在Matlab但不使用快速傅立葉變換,只是使用下一個公式: enter image description hereDCT 2D無FFT

我知道這可能是低效的,但這種方式我會得到它的工作原理。

首先我把我的灰度圖像分成8x8塊,然後我把公式應用到每個塊。

for i=1:8:h 
    for j=1:8:w 
     dctMatrix(i:(i-1)+block,j:(j-1)+block) = dctII(img(i:(i-1)+block,j:(j-1)+block), block); 
    end 
end 

dctII功能如下:

function [newB] = dctII(segmento, b) 
    [h w] = size(segmento); 
    segmento = double(segmento); 
    newB = zeros(b,b); 
    for u=0:h-1 
     for v=0:w-1 
      if u == 0 
       Cu = 1/sqrt(2); 
      else 
       Cu = 1; 
      end 
      if v == 0 
       Cv = 1/sqrt(2); 
      else 
       Cv = 1; 
      end 
      sumRes = summation(segmento,u,v,b); 
      dct = (1/4)*Cu*Cv*sumRes; 
      segmento(u+1,v+1) = dct; 
     end 
    end 
    newB = segmento; 
end 

我還創建了一個求和函數讓事情變得更具有可讀性(至少對我來說)。

function [sum] = summation(segmento,u,v,b) 
    [h w] = size(segmento); 
    sum = 0; 
    for x=0:h-1 
     for y=0:w-1 
      sum = sum + (double(segmento(x+1,y+1))*cos((((2*x)+1)*u*pi)/(2*b))*cos((((2*y)+1)*v*pi)/(2*b))); 
     end 
    end 
end 

的問題是,我的算法結果相差Matlab的預建功能DCT2遠的結果。也許我根本沒有得到DCT算法。你知道我做錯了什麼嗎?我知道所有這些嵌套循環有效地殺死了性能,但我無法想象如何在不使用FFT的情況下解決這個問題。

任何幫助將非常感激,謝謝。

+0

至少你可以把(2 * b)放在求和函數中。 –

+0

你是對的,謝謝你注意 –

回答

0

已經解決!

我的結果與Matlab預構建函數dct2不同,因爲該函數並不像我這樣考慮8x8塊分割,所以矩陣不相等。

我還對我的代碼做了些微的修改,在讀取像素值之前,您需要對每個值減去128以在[-128,127]範圍內工作。這是我的代碼:

function [newB] = dctII(segmento, b) 
    [h w] = size(segmento); 
    segmento = double(segmento) - 128; 
    newB = zeros(b,b); 
    for u=0:h-1 
     for v=0:w-1 
      if u == 0 
       Cu = 1/sqrt(2); 
      else 
       Cu = 1; 
      end 
      if v == 0 
       Cv = 1/sqrt(2); 
      else 
       Cv = 1; 
      end 
      sumRes = summation(segmento,u,v,b); 
      dct = (1/4)*Cu*Cv*sumRes; 
      newB(u+1,v+1) = dct; 
     end 
    end 
end 

function [sum] = summation(segmento,u,v,b) 
    [h w] = size(segmento); 
    sum = 0; 
    for x=0:h-1 
     for y=0:w-1 
      sum = sum + (double(segmento(x+1,y+1))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b))); 
     end 
    end 
end 

效率不是很高,但它是公式的實現。希望有幫助

+0

它是什麼?爲什麼它說段落是未定義的? – Rocket

+0

它是8x8像素的塊,它不是未定義的,因爲是我的函數的參數 –