我正在尝试在 Matlab 中实现 DCT(离散余弦变换),但不使用快速傅里叶变换,只需使用下一个公式:
我知道这可能效率低下,但这样我就会知道它是如何工作的。
首先,我将灰度图像划分为 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 的情况下解决这个问题。
任何帮助将不胜感激,谢谢。