加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]使用Matlab实现离散余弦变换(DCT)

(2011-03-14 11:02:39)
标签:

转载

分类: 变换

%通过矩阵形式实现离散余弦变换,Y=M*X*N'
%参数:X是二维图像矩阵,Y是变换后的系数矩阵
function Y = dct21(X)

[m,n] = size(X);
AM = zeros(m,m);    %DCT系数,当m=n=8时,AM(AN)就是JPEG中常用的8*8的变换矩阵
AN = zeros(n,n);

for i = 0:m-1
    for j = 0:m-1
        if i == 0
            AM(i+1,j+1) = sqrt(1/m)*cos(((2*j+1)*i*pi)/(2*m));
        else
            AM(i+1,j+1) = sqrt(2/m)*cos(((2*j+1)*i*pi)/(2*m));
        end
    end
end

for i = 0:n-1
    for j = 0:n-1
        if i == 0
            AN(i+1,j+1) = sqrt(1/n)*cos(((2*j+1)*i*pi)/(2*n));
        else
            AN(i+1,j+1) = sqrt(2/n)*cos(((2*j+1)*i*pi)/(2*n));
        end
    end
end

X = double(X);      %注意变换后的矩阵数据类型为double
Y = AM*X*AN';       %实现DCT逆变换仅仅将本行换为Y = AM'*AN即可

 

%%%%%%%%%%%%DCT变换函数完成后,读入图像,然后调用即可

img = imread('marog.bmp');

 

imgdct = dct21(img);        %DCT正向变换
imgidct = dct22(imgdct);    %DCT逆变换

figure (1)
subplot(131);
imshow(img);
title('原始图象')

subplot(132);
%imshow(imgdct,[]);
imshow(uint8(imgdct))
title('DCT变换图象');

subplot(133);
%imshow(imgidct,[]);
imshow(uint8(imgidct));
title('DCT逆变换图象');

 

                                                  集萃园软件工作室

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有