当前位置: 首页 > news >正文

【图像压缩】基于余弦变换及霍夫曼编码实现jpeg压缩和解压附matlab代码

1 内容介绍

随着互联网技术及通讯技术的快速发展,数字图像被广泛使用.对数字图像的压缩技术是数字图像处理技术中的关键技术之一.本文介绍了一种基于离散余弦变换(DCT)频域变换方法,使用该方法对数字图像进行图像数据的压缩.该方法用MATLAB仿真软件对实验测试的数字图像进行压缩,对比不同压缩比下的压缩图像进行分析,通过实验仿真结果得出离散余弦变换应用在数字图像压缩中有良好的效果.该方法具有操作简单,处理速度快,易于操作,压缩图像质量高等优点.

基于离散余弦变换DCT图像压缩方法的流程如图1所示,其算法步骤主要分为以下几步:第一步要将被压缩的图像进行分块处理,通常将图像分为8×8的图像子块。接下来第二步将对分好的每个子块进行离散余弦变换,变换后的图像低频部分都大部分集中在图像频谱图中的左上角处,而高频部分基本集中在频谱图的右下角区域中。由于数字图像中的主要数据信息都是低频的信息,主要存在低频部分,所以对应的离散余弦变换后的低频系数较大。高频部分包含的信息量小,对应的DCT系数比较小可以忽略。在数字图像压缩中,对图像的频谱图像的低频部分进行保留处理,及保存CDT变换后系数较大的部分,将高频系数较小的那部分舍弃,通常情况下人的眼睛对高频的信息不敏感,从而当高频部分被舍弃,人眼也很难察觉到有失真。在数字图像传输过程中,就是利用这个压缩特点,将图像变换后的高频信号系数舍去进行压缩数据的传输,当接收到图像压缩数据后需要还原图像,将压缩的图像数据进行离散余弦反变换恢复到原有的图像数据值。在这过程中图像会有一定的数据丢失,但是人眼还是无法直接看出。这就实现了数字图像压缩传输的目的。其次是进行DCT系数的量化,对图像进行量化将会导致图像的质量下降,图像经过DCT变换后,DCT系数的幅度可能较大,因此需要量化系数不为零的系数项减小其系数的幅度,有些高频系数可以量化为零,增加系数为零项的数目。在量化过程中,通常将低频部分的量化阈值系数设为较小的数值,最大限度地保留数字图像原有的主要数据信息。在高频部分设置系数阈值时,一般都将高频系数值设为零。一般情况下量化的阈值选定直接导致压缩的效果,即在图像的压缩比与图像质量之间的取舍,量化的阈值越大,图像的压缩比越高。通常情况下想要获得更好的图像压缩质量,则需要综合考虑设置合理的量化阈值对图像进行压缩处理。在量化编码过程中,其中DC为图像的直流分量,DC分量包含了图像频谱的主要部分,也包含了图像的主要信息,对其系数进行编码的系数一般取值较大。

2 仿真代码

% Calculate the compression ratio 

% between the original images and the compressed images;

function comp_ratio = Compratio(orig_image, comp_image)

% Calculate how many bits should be used to represented the original images

% and store it in the variable B0

clear tempmatr1;

tempmatr1 = ceil(log2(orig_image+1));

clear sizevector1;

sizevector1 = size(orig_image);

[rownum, colnum] = size(sizevector1);

while colnum >1

    clear tempmatr2;

    tempmatr2 = sum(tempmatr1);

    clear tempmatr1;

    tempmatr1 = tempmatr2;

    colnum = colnum -1;

end

B0 = sum(tempmatr1);

% Calculate how many bits should be used to represented the compressed images

% and store it in the variable B1

clear tempvec1;

tempvec1 = find(comp_image<0);

clear tempmatr1;

if sum(tempvec1) == 0

    tempmatr1 = ceil(log2(comp_image+1));

else

    tempmatr1 = ceil(log2(abs(comp_image)+1))+1;

end

clear sizevector1;

sizevector1 = size(comp_image);

[rownum, colnum] = size(sizevector1);

while colnum >1

    clear tempmatr2;

    tempmatr2 = sum(tempmatr1);

    clear tempmatr1;

    tempmatr1 = tempmatr2;

    colnum = colnum -1;

end

B1 = sum(tempmatr1);

comp_ratio = B0/B1;

3 运行结果

4 参考文献

[1]赵文俊, 董慧敏, 朱智民. 基于Matlab的JPEG图像压缩编码仿真实现[J]. 机电工程, 2007, 24(10):3.

[2]刘羽飞. "基于离散余弦变换的数字图像压缩算法实现." 无锡职业技术学院学报 16.1(2017):4.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

相关文章:

  • MySQL开发技巧——行列转换
  • leetcode-剑指 Offer II 001. 整数除法
  • gitpod,不用clone代码就可以让项目在线上跑起来
  • 用Python制作我的核酸检测日历
  • Windows超级管理器
  • Flask 学习-34.restful-full 请求参数自定义参数校验类型 (reqparse.RequestParser() )
  • Flask 学习-36.Flask-RESTful 序列化输出对象
  • Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置
  • 跨领域个性化迁移用户兴趣偏好
  • 【目标跟踪-卡尔曼滤波】基于扩展卡尔曼滤波实现目标跟踪定位附Matlab源码
  • P1510 精卫填海-01背包
  • 视频剪辑制作教学:分享十种剪辑技巧,打好基础很重要
  • C#:实现有向加权图上的Floyd Warshall算法(附完整源码)
  • 对DataFrame各列采用不同方法统计 df.agg()
  • MVCC解决的问题是什么
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 《Java编程思想》读书笔记-对象导论
  • 【个人向】《HTTP图解》阅后小结
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • miaov-React 最佳入门
  • Mocha测试初探
  • PaddlePaddle-GitHub的正确打开姿势
  • React系列之 Redux 架构模式
  • 闭包,sync使用细节
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 简单实现一个textarea自适应高度
  • 排序算法学习笔记
  • 让你的分享飞起来——极光推出社会化分享组件
  • 应用生命周期终极 DevOps 工具包
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #NOIP 2014# day.2 T2 寻找道路
  • #微信小程序(布局、渲染层基础知识)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (function(){})()的分步解析
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (转)jdk与jre的区别
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • @RequestBody与@ResponseBody的使用
  • [ C++ ] 继承
  • [20150629]简单的加密连接.txt
  • [20171106]配置客户端连接注意.txt
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [C++核心编程](四):类和对象——封装
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [Geek Challenge 2023] web题解
  • [HackMyVM]靶场 Quick3
  • [IE编程] 如何获得IE版本号
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [java进阶]——方法引用改写Lambda表达式
  • [Linux] Linux入门必备的基本指令(不全你打我)
  • [p4] Uncheckout other user‘s file?