matlab 灰度图像dct变换,[Week2.4]图像DCT变换

均方差(Mean Square Error, MSE)

a3f5a9575ccaabff910dbddf1f5372c8.png

评价一幅图像压缩前和压缩还原后的差异,有两种常用方法:

①大家来找茬——进化程度高的人类可轻易识别;

②数学方法——压缩前和还原后的图像作均方差;

均方差计算方法:

tex_e66aaeb50332b03ded0f0ce67278f0e6.gif

显然,MSE越小,图像的质量越好。

K-L 转换:

要想获得最小均方差的转换,可以使用K-L转换。K-L转换(Karhunen-Loève Transform)是建立在统计特性基础上的一种转换,它是均方差(MSE, Mean Square Error)意义下的最佳转换,因此在资料压缩技术中占有重要的地位。K-L转换是对输入的向量x,做一个正交变换,使得输出的向量得以去除数据的相关性。

简单地说,只要能不辞劳苦地算出图像的K-L转换,就能找到MSE最小的转换。

我的天啊,这听起来真棒!等等,K-L转换的计算复杂度奇高,半天压缩才压缩一副图片,恐怕自拍狂们会hold不住。

那有没有简单的变换方法,计算简单,又能保证图像质量?

图像变换 - 从空间到频域

5a4377fb60ff2566b93c1a1df5a031b9.png

在进一步忽悠之前,先讲讲“变换”到底是个啥。

“变换”就是,换个角度看问题。讲得装逼点,就是将函数从“时域”投影到“频域”,于是我们就能从频率的角度分析问题。

2f550ceafc4d2e803f5fcfc5b02c515f.png

DCT - 离散余弦变换

fcafc68c0322c2e561814dbb93bbf55a.png

DCT( Discrete Cosine Transform),与傅里叶变换相关的一种变换,类似于离散傅里叶变换,但是只使用实数。离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换。

对二维灰度图像进行DCT变换,就能得到图像的频谱图:低阶(变化幅度小)的部分反映在DCT的左上方,高阶(变化幅度大)的部分反映在DCT的右下方。由于人眼对高阶部分不敏感,依靠低阶部分就能基本识别出图像内容,所以JPEG进行压缩的时候,基本上只存储DCT变换后的左上部分,而右下部分则直接丢弃。

885b12020db0997913949815fbc6acbf.png

为什么JPEG采用DCT而非DFT?

974737655e51dfe4d7e8a6823fbef654.png

DCT跟DFT都是将二维空间图像转换到频域,为什么JPEG会采用DCT而非DFT呢?一个重要的原因,是子图之间的连续性。DFT变换没有考虑到子图之间的边界,整幅大图变换出来会得到如图上方的波形,波形不连续容易导致Gibbs phenomenon;而DCT得到子图间的波形则是连续的。

MATLAB实验代码

>> %量化矩阵

>> quantization_mat = [16,11,10,16,24,40,51,61;

12,12,14,19,26,58,60,55;

14,13,16,24,40,57,69,56;

14,17,22,29,51,87,80,62;

18,22,37,56,68,109,103,77;

24,35,55,64,81,104,113,92;

49,64,78,87,103,121,120,101;

72,92,95,98,112,100,103,99;];

>> %读取原始图像

>> lena_ori = imread('F:/dip/lena.bmp');

>> lena_int = int16(lena_ori);

>> lena_offset = lena_int - 128;

>> % 作8*8 DCT

>> lean_dct = blkproc(lena_offset,[8 8],'dct2(x)');

>> % 量化

>> lena_quantization = blkproc(lean_dct,[8 8],'x./P1',quantization_mat);

>> lena_jpeg = int16(lena_quantization); %取整

>>

>> %还原图像

>> restore_dct = blkproc(lena_jpeg,[8 8],'x.*P1',quantization_mat);

>> restore_offset = blkproc(restore_dct,[8 8],'idct2(x)');

>> restore_img = restore_offset + 128;

>>

>> restore_img = mat2gray(restore_img); %图像经过反量化反DCT之后,灰度值的范围超出0-255之内,通过这个函数将像素范围缩小。

>>

>> % 原图与压缩后图像作差

>> lena_ori = mat2gray(lena_ori);

>> img_error = abs(restore_img - lena_ori);

>> figure; subplot(1,3,1); imshow(lena_ori);subplot(1,3,2); imshow(restore_img);subplot(1,3,3);imshow(img_error);

>>

实验结果图 左为原图,中为压缩后图像,右为前两者的差值 (没看出差别吧~)

DCT的高阶部分因量化损失掉了,所以前两者是有细节差别的,但人眼几乎无法识别。

d91574db14ea840076307381dbf93a55.png

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值