【图像压缩】余弦变换及霍夫曼编码jpeg压缩和解压【含Matlab源码 2086期】

news2024/11/25 14:39:17

⛄一、DCT图像无损压缩简介

1 图像压缩
图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类。无损压缩是指不损失图像质量的压缩,它是对文件的存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容。一般来说,由于无损压缩只是删除了图像数据中的冗余信息,可以准确地恢复原始图像,所以不可能达到很高的压缩比。有损压缩是指损失图像质量的压缩,它将不相干的信息也删除了,因此解压时只能将原始图像进行近似的还原,它的高压缩比是以牺牲图像质量为代价的。

2 JPRG图像压缩
JPEG 提出的 JPEG 标准是为连续色调图像的压缩提供的公共标准。连续色调图像并不局限于单色调( 黑白) 图像,该标准可适用于各种多媒体存储和通信应用所使用的灰度图像、摄影图像及静止视频压缩文件。
JPEG 标准还提出:
①必须将图像质量控制在可视保真度高的范围内,同时编码器可被参数化,允许设置压缩或质量水平
②压缩标准可以应用于任何一类连续色调数字图像,并不应受到维数、颜色、画面尺寸、内容和色调的限制
③压缩标准必须从完全无损到有损范围内可选,以适应不同的存储 CPU 和显示要求

图像压缩编码方法从压缩编码算法原理上可以分为无损压缩编码、有损压缩编码、混合编码方法。而JPEG 标准就是一种混合编码方法,既有无损的压缩编码又有有损的压缩编码。有损压缩方法是以 DCT 变换为基础的压缩方法,其压缩率比较高,是JPEG 标准的基础。无损压缩方法又称预测压缩方法,是以二维 DPCM 为基础的压缩方式,解码后能完全精确地恢复原图像采样值,其压缩比低于有损压缩方法。

观察下图中的编码器负责降低输入图像的编码、像素间和心理视觉冗余。在编码处理的第一阶段,离散余弦变换器将输入图像变换成一种( 通常不可见的) 格式,以便减少像素间的冗余。在第二阶段,量化器根据预定义的保真度准则来减少映射变换器输出的精确性,以便试图去除心理视觉冗余数据。这种操作是不可逆的,当进行无损压缩时,则必须将其忽略。在第三个即最后一个处理阶段,熵编码器根据所用的码字对量化器输出和离散余弦变换输出创建码字( 减少编码冗余)。
在这里插入图片描述
3 二维离散余弦变换
离散余弦变换(Discrete Cosine Transform),简称DCT变换.是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换.余弦变换实际上是傅立叶变换的实数部分,其主要用于图像的压缩,目前国际压缩标准的JPEG格式中就用到了DCT变换。
在编码过程中,首先将输入图像颜色空间转换后分解为8× 8大小的数据块,然后用正向二维DCT把每个块转变成64个DCT系数值,其中1个数值是直流(DC)系数,即8× 8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,形成压缩后的图像格式。在解码过程中,先对已编码的量化的DCT系数进行解码,然后使用二维DCT反变换求逆量化并把DCT系数转化为8× 8样本像块,最后将操作完成后的块组合成一个单一的图像。这样就完成了图像的压缩和解压过程.研究表明,DCT将8× 8图像块变换为频域时数值集中在左上角,即低频分量都集中在左上角,高频分量分布在右下脚。而低频部分包含了图像大部分信息,相比之下,高频部分包含的信息量较少。为了压缩数据,往往采用忽略高频系数的办法。而较低频系数的修改对原始数据的影响较小。基于DCT的压缩编码属于有损压缩,通过去除图像本身的冗余量和人的视觉冗余量来达到压缩数据的目的,主要分为以下几个步骤:
(1)正向离散余弦变换
(2)量化
(3)Z字形编码
(4)使用差分脉冲编码调制对直流系数进行编码
(5)使用行程长度编码对交流系数进行编码
(6)熵编码
(7)组成位数据流

4 二维DCT变换
二维离散余弦变换的正变换公式为:
在这里插入图片描述
在图像的压缩编码中,N一般取8。
二维DCT的反变换公式为:
在这里插入图片描述
以上各式中的系数:
在这里插入图片描述
5 Matlab调试
根据JPEG 压缩编码算法,要将一幅灰度图像进行压缩编码,首先把图像分成 8* 8 的像素块,分块进行 DCT 变换后,根据 JPEG 标准量化表对变换系数进行量化,再对直流系数( DC) 进行预测编码,对交流系数( AC) 行 zigzag 扫描和可变长编码,然后根据标准的 Huffman 码表进行熵编码,输出压缩图像的比特序列,实现了图像的压缩。
DCT 变换的特点是变换后图像大部分能量集中在左上角,因为左上角反应原图像低频部分数据,右下角反应原图像高频部分数据,而图像的能量通常集中在低频部分。因此 DCT 变换后,只保留 DCT 系数矩阵最左上角的 10 个系数,然后对每个图像块利用这 10个系数进行 DCT 反变换来重构图像。
其基于 DCT 变换矩阵算法的处理过程如下图:
在这里插入图片描述

⛄二、部分源代码

close all;
clear all;

% Read the original images to the matrix orig_image;
clear orig_image;
clear temp_image;
temp_image = imread(‘image1.bmp’);
orig_image(:,:,:,1) = double(temp_image(:,:,:,1));
clear temp_image;
temp_image = imread(‘image2.bmp’);
orig_image(:,:,:,2) = double(temp_image(:,:,:,1));
clear temp_image;
temp_image = imread(‘image3.bmp’);
orig_image(:,:,:,3) = double(temp_image(:,:,:,1));
clear temp_image;
temp_image = imread(‘image4.bmp’);
orig_image(:,:,:,4) = double(temp_image(:,:,:,1));

% Image compression
% You are required to implement this part
% Note: The components of comp_image should be integers
starttime = cputime;
clear comp_image;
[comp_image_Y1,comp_image_U1,comp_image_V1] = Compress(orig_image(:,:,:,1));
[comp_image_Y2,comp_image_U2,comp_image_V2] = Compress(orig_image(:,:,:,2));
[comp_image_Y3,comp_image_U3,comp_image_V3] = Compress(orig_image(:,:,:,3));
[comp_image_Y4,comp_image_U4,comp_image_V4] = Compress(orig_image(:,:,:,4));
comp_size = comp_image_Y1.realsize+comp_image_U1.realsize+comp_image_V1.realsize;
%comp_image = zeros(comp_image_Y1.realsize,comp_image_U1.realsize,comp_image_V1.realsize);
% Image decompression
% You are required to implement this part
% Note: The components of reco_image shoud be integers
% The size of the reco_image should be same with the orig_image
clear reco_image;
s_image1 = Decompress(comp_image_Y1,comp_image_U1,comp_image_V1);
s_image2 = Decompress(comp_image_Y2,comp_image_U2,comp_image_V2);
s_image3 = Decompress(comp_image_Y3,comp_image_U3,comp_image_V3);
s_image4 = Decompress(comp_image_Y4,comp_image_U4,comp_image_V4);
%figure,imshow(s_image),title(‘jjiayatuxl’);
reco_image(:,:,:,1) = double(s_image1(:,:,:,1));
reco_image(:,:,:,2) = double(s_image2(:,:,:,1));
reco_image(:,:,:,3) = double(s_image3(:,:,:,1));
reco_image(:,:,:,4) = double(s_image4(:,:,:,1));
runtime = cputime - starttime;

% Check the size of the recovered image
clear sizevector1;
clear sizevector2;
[m1,m2,m3] = size(orig_image);
sizevector1 = size(orig_image);
sizevector2 = size(reco_image);
if sizevector1==sizevector2

% Calculate the compression ratio
%comp_image = double(comp_image);
%comp_ratio = Compratio(orig_image, round(comp_image));
comp_ratio = m1*m2*m3/comp_size;
% Calculate the distortion of the recovered images using Mean Square Error
reco_image = double(reco_image);
MSE = CalMSE(orig_image, round(reco_image));
% Display the original image and recovered image
figure(1);
subplot(2,2,1);
clear disp_image;
disp_image = orig_image(:,:,:,1);
imdisplay(disp_image);
title('Original Image 1');
subplot(2,2,2);
clear disp_image;
disp_image = reco_image(:,:,:,1);
imdisplay(disp_image);
title('Recovered Image 1');
subplot(2,2,3);
clear disp_image;
disp_image = orig_image(:,:,:,2);
imdisplay(disp_image);
title('Original Image 2');
subplot(2,2,4);
clear disp_image;
disp_image = reco_image(:,:,:,2);
imdisplay(disp_image);
title('Recovered Image 2');

figure(2);
subplot(2,2,1);
clear disp_image;
disp_image = orig_image(:,:,:,3);
imdisplay(disp_image);
title('Original Image 3');
subplot(2,2,2);
clear disp_image;
disp_image = reco_image(:,:,:,3);
imdisplay(disp_image);
title('Recovered Image 3');
subplot(2,2,3);
clear disp_image;
disp_image = orig_image(:,:,:,4);
imdisplay(disp_image);
title('Original Image 4');
subplot(2,2,4);
clear disp_image;
disp_image = reco_image(:,:,:,4);
imdisplay(disp_image);
title('Recovered Image 4');
  
% Output the performance
ratiomesg = sprintf('The compression ratio is = %6.2f\n', comp_ratio);
disp(ratiomesg );
distortionmesg = sprintf('The MSE is = %6.2f\n', MSE);
disp(distortionmesg );
timemesg = sprintf('The running time is = %6.2f\n', runtime);
disp(timemesg );     

else
disp(‘The size of the recovered image is not correct’);
end

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]冯飞,刘培学,李晓燕,严楠彬.离散余弦变换在图像压缩算法中的研究[J].计算机科学. 2016,43(S2)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全——【收藏】网络设备安全加固规范

一、Cisco网络设备安全基线规范 本建议用于Cisco路由器和基于Cisco IOS的交换机及其三层处理模块,其软件版本为CISCO IOS 12.0及以上版本。加固前应该先备份系统配置文件。 01 账号管理、认证授权 1.1.本机认证和授权 初始模式下,设备内一般建有没有…

Linux——用户、组的管理以及文件的权限设置

一、用户和组 Linux系统中的用户唯一的标识码为用户ID,即UID,每个用户至少属于一个组,即为用户分组。用户分组存在唯一的标识码,为GID。不同的用户拥有不同的权限。 1.认识用户账号文件/etc/passwd和用户影子文件/et…

Java项目:SSM汽车租车管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员、普通用户两种角色; 管理员主要功能包括: 后台首页、停车位信息管理、车辆求租信息审核、车辆出租信息…

热门技术中的应用:容器技术中的网络-第31讲-容器网络之Calico:为高效说出善意的谎言

上一节我们讲了Flannel如何解决容器跨主机互通的问题,这个解决方式其实和虚拟机的网络互通模式是差不多的,都是通过隧道。但是Flannel有一个非常好的模式,就是给不同的物理机设置不同网段,这一点和虚拟机的Overlay的模式完全不一样。 在虚拟机的场景下,整个网段在所有的物…

操作系统(3)银行家算法模拟实现

参考博客&#xff1a;银行家算法详解&#xff08;C语言&#xff09;_Sparky*的博客-CSDN博客_银行家问题c语言 1. 效果展示 2. 程序流程图 3. 数据结构设计 /**定义数据结构*/ vector<vector<int>> Max;// 最大需求矩阵 vector<vector<int>> Allocat…

小白如何入门Python爬虫?这是我见过最详细的入门教学

本文针对初学者&#xff0c;我会用最简单的案例告诉你如何入门python爬虫&#xff01; 想要入门Python 爬虫首先需要解决四个问题 熟悉python编程 了解HTML 了解网络爬虫的基本原理 学习使用python爬虫库 01了解什么是爬虫&#xff0c;它的基本流程是什么&#xff1f; 网络…

IDEA 2022 之 Lombok 使用 教程

文章目录**1.Lombok是什么****1.1 Lombok 是什么&#xff1f;****Lombok 引入**2、POM 中引入依赖3、IDE 中安装插件**4. Lombok 使用****4.1 Lombok 使用注意**5.代码案例&#xff1a;**Lombok 原理**6. 常用注解结语1.Lombok是什么 ​ Lombok是使用java编写的一款开源类库。…

【Redis】Redis缓存穿透、缓存雪崩、缓存击穿详解与解决办法(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Java项目:springboot大学生实习管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本系统的用户可以分为三种&#xff1a;管理员、教师、学生。三种角色登录后会有不同菜单界面&#xff1b; 管理员主要功能&#xff1a; 信息管…

graalvm 拯救生命,速速入手

graalvm 拯救生命&#xff0c;速速入手 标题很夸张&#xff0c;graalvm怎么就拯救生命了&#xff1f;把一个启动5-6秒的项目加速到3秒启动&#xff0c;不就是在拯救生命&#xff0c;拯救发际线吗&#xff1f; 我在上一篇博客"SpringBoot3.0工程建立"末尾启动了工程…

高级网络应用复习——三层热备生成树速端口OSPF实验(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.知识点总结 路由器热备份技术HSRP &#xff08;思科私有 HS…

学web前端开发和学习其他编程语言一样吗?

前言&#xff1a; web前端是编程中门槛较低&#xff0c;较易入门的&#xff0c;对年龄和学历要求也不是特别高&#xff0c;但如果学历过低&#xff0c;年龄比较大&#xff0c;又完全没有基础&#xff0c;会在学习时感到吃力&#xff0c;另外也会因为用人公司对学历和年龄的限制…

电巢:半导体投资锐减库存调整消费者需求疲软,半导体下行周期何时结束?

前言 投行PitchBook的资料显示截止到本月5日&#xff0c;2022 年全球半导体初创企业的风险投资达到 78 亿美元。与去年创纪录的 145 亿美元投资者注入硅公司的资金相比下降了 46%&#xff0c;与 2020年的103 亿美元相比下降了 24%。 高盛&#xff08;Goldman sachs&#xff09;…

【LSTM回归预测】基于灰狼算法优化长短时记忆GWO-LSTM时序时间序列数据预测(含前后对比)附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

Mycat(8):分片详解之取模

1 找到conf/schema.xml修改 2 取模的路由规则 和轮询一样&#xff0c;取模有什么好处&#xff0c;有什么坏处&#xff1f; 优点&#xff1a;利用的写的负载均衡效果&#xff0c;写入速度很快 缺点&#xff1a;批量写入&#xff0c;失败后事务的回滚有难度&#xff01;代表写…

Svelte 带来哪些新思想?赶紧学起来!

本文介绍 点赞 关注 收藏 学会了 Svelte 是我用过最爽的框架&#xff0c;就算 Vue 和 React 再强大&#xff0c;生态再好&#xff0c;我还是更喜欢 Svelte&#xff0c;因为它开发起来真的很爽。 其实在很久之前我就注意到 Svelte &#xff0c;但一直没把这个框架放在心上。…

【Python百日进阶-数据分析】Day133 - plotly饼图:px.pie()实例

文章目录四、实例4.1 带有 plotly express 的饼图4.1.1 欧洲大陆的人口4.1.2 带有重复标签的饼图4.1.3 使用 px.pie 设置饼图扇区的颜色4.1.4 对离散颜色使用显式映射4.1.5 自定义使用 px.pie 创建的饼图4.1.13 Dash 中的饼图四、实例 饼图是一种圆形统计图表&#xff0c;它被…

微服务框架 SpringCloud微服务架构 服务异步通讯 50 消息可靠性 50.2 消息持久化

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯50 消息可靠性50.2 消息持久化50.2.1 消息持久化50 消息可靠性 50.2 消息持久化 50.2.1 消息…

深入解析CSS (3)Flexbox

Flexbox&#xff0c;全称弹性盒子布局 给元素添加display: flex&#xff0c;该元素变成了一个弹性容器&#xff08;flex container&#xff09;&#xff0c;它的直接子元素变成了弹性子元素&#xff08;flex item&#xff09;。 弹性子元素默认是在同一行按照从左到右的顺序并…

[附源码]计算机毕业设计Python的黄河文化科普网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…