初学DCT(离散余弦变换)

介绍

:离散余弦变换,适用于图像压缩等场合,并且在图像处理比FFT快很多,得到广泛应用。我简单学习了下一维和二维的离散余弦变换,做下笔记。参考链接在此。

https://blog.csdn.net/yanceyxin/article/details/82080242
https://blog.csdn.net/ahafg/article/details/48808443

一维DCT变换

在这里插入图片描述
其中,f(i)为原始的信号,F(u)是DCT变换后的系数,N为原始信号的点数,c(u)可以认为是一个补偿系数,可以使DCT变换矩阵为正交矩阵。

二维DCT变换

在这里插入图片描述
看出来变换范围都是到N-1,所以适用于方阵,如果不是的话,需要先补齐再做变换(看论文也的确是这样,这点比较重要),然后应该是逆变换后再去除重构部分得到原始(图象等等)。
在这里插入图片描述
这个公式是说DCT变换高度对成性(从变换结果无法观察是对称的,应该是变换过程有对称)。(根据这个可以在matlab中自己编程,利用这个更简单的表达式求DCT系数)。

matlab代码

此处代码非原创,参考链接:

https://blog.csdn.net/ahafg/article/details/48808443

I = [12,23,53,16;42,16,68,45;34,62,73,26;72,15,34,28]; %数据块
D1 = dct(I); %matlab DCT函数进行DCT变换
D2 = dct2(I);
A = zeros(4); %变换矩阵A,也可以通过函数dctmtx(n)求得
for i = 0:3
for j = 0:3
if i == 0
a = sqrt(1/4);
else
a = sqrt(2/4);
end
A(i+1,j+1) = acos((j+0.5)pii/4);
end
end
D = A
I*A’; %DCT变换
(以上是我跑出来的)
(下面是参考idct)
D1 = dct2(I); %matlab DCT函数进行DCT变换
D2 = A’DA; %DCT逆变换
经过理解得知,matlab中dct是一维DCT,而dct2是二维dct,上面的for循环构建的变换矩阵A是用于dct2(二维dct变换)的,不要混淆了。

发布了22 篇原创文章 · 获赞 4 · 访问量 3126

猜你喜欢

转载自blog.csdn.net/weixin_43633568/article/details/103006592