我想實現DCT(離散餘弦變換)在Matlab但不使用快速傅立葉變換,只是使用下一個公式: DCT 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的情況下解決這個問題。
任何幫助將非常感激,謝謝。
至少你可以把(2 * b)放在求和函數中。 –
你是對的,謝謝你注意 –