均方差(Mean Square Error, MSE)

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

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

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

均方差计算方法:

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

K-L 转换:

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

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

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

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

图像变换 - 从空间到频域

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

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

DCT - 离散余弦变换

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

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

为什么JPEG采用DCT而非DFT?

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的高阶部分因量化损失掉了,所以前两者是有细节差别的,但人眼几乎无法识别。

matlab 灰度图像dct变换,[Week2.4]图像DCT变换相关推荐

  1. Matlab灰度图像反转,对数变换,幂次变换

    Matlab灰度图像反转,对数变换,幂次变换 1 图像反转 **目的: ** 图像反转可以使得图像的灰度值发生反转,实现亮暗反转,暗边亮,亮边暗. 数学原理: 加入一个图像的灰度值范围为[0,255] ...

  2. matlab信息隐藏算法,实验四--基于DCT域的信息隐藏算法

    <实验四--基于DCT域的信息隐藏算法>由会员分享,可在线阅读,更多相关<实验四--基于DCT域的信息隐藏算法(6页珍藏版)>请在人人文库网上搜索. 1.实验四 基于DCT域的 ...

  3. (附Matlab程序)(一)基于DCT编码的图像压缩:显示灰度图像 反余弦变换恢复图 DCT变换图 余弦变换系数图

    问题一:随机选取一整幅图像(命名"x.jpg"),编写Matlab程序显示灰度图像.反余弦变换恢复图.DCT变换图.余弦变换系数图,并与原始图像对比. clcclearclose ...

  4. matlab实现图像DCT变换

    实验三 图像的DCT变化及量化 一.问题描述 利用matlab,将road.tif彩色图像的分辨率转换为256*256,将图片转化为double数据类型,再利用T=dctmtx(8)建立一个8*8的D ...

  5. matlab 图像dct变换矩阵,图像的DCT变换的实现

    用matlab实现图像的DCT变换,在频域压缩后再反变换 I=imread('lenna.jpg'); imshow(I); title('未压缩的原图') A=im2double(I); D = d ...

  6. dct图像压缩c语言实现,DCT变换在图像压缩中的实现

    小白拙见,希望理解不对的地方大家多多指教! 对于各种信号,都可以说它是由多个振幅与频率不同的正弦或者余弦函数组成的.并且一个信号通常由一个直流信号DC(幅值保持不变的信号)和多个交流信号AC(幅值以某 ...

  7. 变换域信息隐藏--DCT

    思想提出背景–空间域隐藏 空间域隐藏是基于位图分解的思想产生的,其主要方法是将秘密信息存储到载体不那么重要的部分中,这样即使改变了载体的部分信息后,载体从肉眼来看也不会有太大区别.这种隐藏方法的优点是 ...

  8. 二维dct变换例题_matlab进行二维DCT变换和二维DCT反变换

    题目: matlab进行二维DCT变换和二维DCT反变换 在Matlab中,函数dct2 和函数idct2分别用于进行二维DCT变换和二维DCT反变换.下面以处理本次训练图像为例说明该余弦正反变换在M ...

  9. java dct变换_Discrete Cosine Transform [DCT] (离散余弦变换)

    Discrete Cosine Transform [DCT] (离散余弦变换) 描述:Binarizer是一个Transformer. 离散余弦变换是与傅里叶变换相关的一种变换,它类似于离散傅立叶变 ...

最新文章

  1. Social regularizations
  2. Spring基础专题——第三章(反转控制与依赖注入)
  3. 【编程题目】求二叉树中节点的最大距离
  4. C语言函数strcmp()(比较两个字符串)
  5. ubuntu修改root密码
  6. Thunder团队第二周 - Scrum会议3
  7. 剑指offer——面试题41-2:和为S的两个数字
  8. 滚动插件 animatescroll(可以设置要滚动到位置)
  9. java debug 宏_#ifdef _DEBUG用法小结
  10. php soapclient 超时,PHP SoapClient超时
  11. Java J2SE 系列视频教程(北京上学堂马士兵老师经典java讲义)
  12. 软件测试方案和计划的区别和联系
  13. 计算机rapter 流程图,Raptor设计程序流程图并运行的具体操作步骤
  14. STM32F103_study57_The punctual atoms(STM32 Port multiplexing and remapping configuration)
  15. matlab连接mysql有什么用_MATLAB连接SQLServer和MySql数据库
  16. 2021-11-06 ompl运动规划库的规划算法
  17. 股票实时行情接口编程难度大吗?
  18. python中的platform模块获取平台信息
  19. 如何打出带圈的11?
  20. 自动化测试与自动化测试生命周期

热门文章

  1. 用STATECAD快速设计有限状态机
  2. 【TWS API 使用教程7】如何使用TWS API 从盈透证券中筛选满足一定条件的contract?
  3. 关于在IDEA上开发springboot及其热部署等等问题
  4. 易观方舟Argo社区生态壮大 “春雨计划”蓄势待发
  5. Python猫荐书系列之五:Python高性能编程
  6. echarts 三种数据双y轴显示 (文末附带完整代码)
  7. Python中时间 时间戳之间的转换
  8. node.js抓取网络图片保存到本地,node.js抓取防盗链网络图片保存到本地
  9. 天鹅肉真被癞蛤蟆吃去了
  10. WMS仓库管理系统解决方案,实现仓库管理一体化