离散余弦变换(DCT)

  • 实验原理

DCT是目前比较好的图像变换,它有很多优点。DCT是正交变换,它可以将8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,如采用快速傅立叶变换可以进行高效的运算,因此它在硬件和软件中都容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。

由于DCT主要应用在数据和图像的压缩,因此希望原信号的能量在变换后能尽量集中在少数系数上,且这些大能量的系数能处在相对集中的位置,这将有利于进一步的量化和编码。但是如果对整段的数据或整幅图像来做DCT,那就很难保证大能量的系数能处在相对集中的位置。因此,在实际应用中,一般都是将数据分成一段一段来做,一般分成8x8或16x16的方块来做。

  • 实验要求

   利用DCT变换对灰度图像进行压缩,求出压缩比;对比不同压缩比的图像。

  • 实验结果

根绝DCT编码原理编写matlab程序如下所示:

% 设置压缩比cr=0.5为2:1压缩;cr=0.25为4:1;cr=0.1250为8:1压缩

cr = 0.125;

initialimage = imread('lena.bmp');

initialimage = double(initialimage)/255;

figure();

subplot(121);

%imshow(initialimage);


%对图像进行DCT变换

t = dctmtx(8);

dctcoe = blkproc(initialimage, [8 8], 'P1*x*P2', t, t');


%将DCT变换后的矩阵转换成列,并按升序排列

coevar = im2col(dctcoe, [8 8], 'distinct');

coe = coevar;

[y, ind] = sort(coevar);


[m, n] = size(coevar);


%舍去不重要的系数

snum = 64-64 * cr;

for i = 1:n

    coe(ind(1:snum), i) = 0;

end


%把列变换为二维矩阵

b2 = col2im(coe, [8 8], [512 512], 'distinct');


%逆DCT变换

i2 = blkproc(b2, [8 8], 'P1*x*P2', t', t);

%subplot(122);

imshow(i2);


e = double(initialimage)-double(i2);

[m, n] = size(e);

erms = sqrt(sum(e(:).^2)/(m*n))

图1为原始图,图2为2:1压缩图,图3为4:1压缩图,图4为4:1压缩图:

  

  • 实验总结

DCT为正交变换,将图像从空间域转换到频率来实现图像的压缩,而且DCT产生的系数很容易被量化,因此能获得好的块压缩,而且DCT的算法性能优良,同时从本实验的实验结果中可以看到,压缩比越小,DCT反变换后的图像效果越差。但可以利用人眼对某些图像成分不敏感的特点,来完成既不影响人对画面清晰度的感知,又能达到压缩图像,减少编码量的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值