【图像压缩】JEPG图像压缩【含Matlab源码 1167期】

news2024/11/25 11:00:13

⛄一、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 变换矩阵算法的处理过程如下图:
在这里插入图片描述

⛄二、部分源代码

function JPEGEncodeDecode
%UNTITLED7 Summary of this function goes here
% Detailed explanation goes here

img=imread(‘1.jpg’);
subplot(121);imshow(img);title(‘原图’); %显示原图

img_ycbcr = rgb2ycbcr(img); % rgb->yuv
[row,col,~]=size(img_ycbcr); % 取出行列数,~表示3个通道算1列

%对图像进行扩展
row_expand=ceil(row/16)*16; %行数上取整再乘16,及扩展成16的倍数
if mod(row,16)~=0 %行数不是16的倍数,用最后一行进行扩展
for i=row:row_expand
img_ycbcr(i,:,:)=img_ycbcr(row,:😅;
end
end
col_expand=ceil(col/16)*16; %列数上取整
if mod(col,16)~=0 %列数不是16的倍数,用最后一列进行扩展
for j=col:col_expand
img_ycbcr(:,j,:)=img_ycbcr(:,col,:);
end
end

%对Y,Cb,Cr分量进行4:2:0采样
Y=img_ycbcr(:,:,1); %Y分量
Cb=zeros(row_expand/2,col_expand/2);
Cr=zeros(row_expand/2,col_expand/2); %Cr分量
for i=1:row_expand/2
for j=1:2:col_expand/2-1 %奇数列
Cb(i,j)=double(img_ycbcr(i2-1,j2-1,2));
Cr(i,j)=double(img_ycbcr(i2-1,j2+1,3));
end
end
for i=1:row_expand/2
for j=2:2:col_expand/2 %偶数列
Cb(i,j)=double(img_ycbcr(i2-1,j2-2,2));
Cr(i,j)=double(img_ycbcr(i2-1,j2,3));
end
end

%分别对三种颜色分量进行编码
Y_Table=[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];%亮度量化表
CbCr_Table=[17, 18, 24, 47, 99, 99, 99, 99;
18, 21, 26, 66, 99, 99, 99, 99;
24, 26, 56, 99, 99, 99, 99, 99;
47, 66, 99 ,99, 99, 99, 99, 99;
99, 99, 99, 99, 99, 99, 99, 99;
99, 99, 99, 99, 99, 99, 99, 99;
99, 99, 99, 99, 99, 99, 99, 99;
99, 99, 99, 99, 99, 99, 99, 99];%色差量化表

Qua_Factor=0.5;%量化因子,最小为0.01,最大为255,建议在0.5和3之间,越小质量越好文件越大

%对三个通道分别DCT和量化
Y_dct_q=Dct_Quantize(Y,Qua_Factor,Y_Table);
Cb_dct_q=Dct_Quantize(Cb,Qua_Factor,CbCr_Table);
Cr_dct_q=Dct_Quantize(Cr,Qua_Factor,CbCr_Table);

%对三个通道分别反量化和反DCT
Y_in_q_dct=Inverse_Quantize_Dct(Y_dct_q,Qua_Factor,Y_Table);
Cb_in_q_dct=Inverse_Quantize_Dct(Cb_dct_q,Qua_Factor,CbCr_Table);
Cr_in_q_dct=Inverse_Quantize_Dct(Cr_dct_q,Qua_Factor,CbCr_Table);

%恢复出YCBCR图像
YCbCr_in(:,:,1)=Y_in_q_dct;
for i=1:row_expand/2
for j=1:col_expand/2
YCbCr_in(2i-1,2j-1,2)=Cb_in_q_dct(i,j);
YCbCr_in(2i-1,2j,2)=Cb_in_q_dct(i,j);
YCbCr_in(2i,2j-1,2)=Cb_in_q_dct(i,j);
YCbCr_in(2i,2j,2)=Cb_in_q_dct(i,j);

    YCbCr_in(2*i-1,2*j-1,3)=Cr_in_q_dct(i,j);
    YCbCr_in(2*i-1,2*j,3)=Cr_in_q_dct(i,j);
    YCbCr_in(2*i,2*j-1,3)=Cr_in_q_dct(i,j);
    YCbCr_in(2*i,2*j,3)=Cr_in_q_dct(i,j);
end

end
function [ Matrix ] = Inverse_Quantize_Dct( I,Qua_Factor,Qua_Table )
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here

Qua_Matrix=Qua_Factor.*Qua_Table; %反量化矩阵
I=blkproc(I,[8 8],‘x.*P1’,Qua_Matrix);%反量化,四舍五入

[row,column]=size(I);

I=blkproc(I,[8 8],‘idct2(x)’);

I=uint8(I+128);
for i=1:row
for j=1:column
if I(i,j)>255
I(i,j)=255;
elseif I(i,j)<0
I(i,j)=0;
end
end
end

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]程芳.基于DCT变换的JPEG图像压缩方式的应用研究[J].电脑知识与技术. 2021,17(10)

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

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

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

相关文章

免费l2接口有什么特点?

作为增值行情&#xff0c;免费l2接口行情特点如下&#xff1a; 1、更丰富的信息 更多的盘口订单数据、逐笔成交数据、成交与订单关联数据及增值数据&#xff0c;揭示交易细节&#xff0c;全方位反映市场状态。 2、更丰富的委托盘口 提供买卖方10个价位的价格、股数和委托笔…

DCN神州数码——设备基本指令 (超详细)

神州数码——设备基本操作 Telnet telnet-server enable username DCN privilege 15 password DCN authentication securityip ip authorization line vty command <1-15> {local | radius | tacacs} SSH ssh-server enable username DCN privilege 15 password DCN …

2022沙丘大会 · 信创专场 GBASE告诉您金融行业数据库如何选型

12月10日&#xff0c;2022沙丘大会信创专场如期召开&#xff0c;本期专场由沙丘社区与中国信通院数据库应用创新实验室联合主办&#xff0c;GBASE南大通用技术总监冯文忠受邀出席并分享《国产数据库金融行业应用情况》主题演讲。 数据库作为金融信息系统的关键环节&#xff0…

产品更新-镭速Raysync v6.5.8.0版本发布

镭速版本在近期发布了v6.5.8.0版本&#xff0c;下面我们一起来看下做了哪些更新。 功能一、支持敏感词检测 互联网时代的发展&#xff0c;用户不断产生海量信息&#xff0c;从而也导致了垃圾信息增加&#xff0c;如政治敏感词、违禁词、垃圾广告、色情、血腥暴力等不良信息&am…

AI的进化方向,正在被改写

文|智能相对论 作者|沈浪 人工智能产业的创新焦点已经发生了转移&#xff0c;过去大多谈的是应用创新&#xff0c;如今一场面向底层的技术普惠创新正在持续推进&#xff0c;成为新华三等头部AI厂商相互角力的关键。 日前&#xff0c;新华三刚刚召开一场主题为“进化智能算赋…

【DELM回归预测】基于matlab海鸥算法改进深度学习极限学习机SOA-DELM数据回归预测【含Matlab源码 1977期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年&#xff0c;极限学习机&#xff08;extreme learning machine,ELM&#xff09;理论被南洋理工大学的黄广斌教授提出&#xff0c;ELM是一种单隐含层前馈神经网络&#xff08;single-hidden layer feedforward neural network,SLFN&am…

精华推荐 |【开发百宝箱之猿如意使用指南】「工欲成其事,必先利其器」一文教你如何通过“猿如意” 优化工作、生活和学习!

开发百宝箱之猿如意使用指南【欢迎您】使用“猿如意”百宝箱大家科普一下什么是猿如意&#xff1f;赶快趁热下载个【猿如意】吧【猿如意】使用体验打分和评估【猿如意】整体功能评分【猿如意】UI效果评分【猿如意】易用性效果【猿如意】各组件评分每个程序猿值得拥有的学习开发…

python清空字典的两种方法

python清空字典的两种方法比较 这里说的clear是指清空python中的字典内容&#xff0c;与删除该字典不一样。 例如&#xff1a; d{‘name’:1,‘age’:2} 想要清空该字典有两个方法 方法1&#xff1a; d.clear() 打印出d 的值为&#xff5b;&#xff5d; 方法2&#xff…

java 10--- static

static 修饰成员变量: 实例成员变量必须要new一个对象&#xff0c;静态成员变量可以不new对象 静态成员变量例子&#xff1a; static修饰成员变量内存图&#xff1a; static修饰成员方法&#xff1a; ​​​​​​​ 修饰成员方法内存图&#xff1a; 注意事项&#xff1a…

裁员后,那些被“优化”的程序员都去哪儿了?

程序员在35岁真的会被裁吗&#xff1f; 被裁之后去哪儿工作 &#xff0c;怎么办啊&#xff1f; 在很多社交平台&#xff0c;经常能看到不少小伙伴问出这样的问题&#xff0c;既迷茫&#xff0c;又慌张。有人说自己25岁就已经被裁了&#xff0c;也有人说做程序员&#xff0c;3…

mysql详情之MVCC由浅入深

概念 MVCC&#xff08;Multiversion Concurrency Control&#xff09;&#xff1a;多版本并发控制。是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。 MVCC的实现思路 修改数据时&#xff0c;都对应一个修改者所属的事务【前提条…

统计学习方法 | 朴素贝叶斯

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入 / 输出的联合概率分布&#xff1b;然后基于此模型&#xff0c;对给定的输入x&#xff0c;利用贝叶斯定理求出后验概率最大的输出y 朴素贝叶斯法…

数据结构---无序数组排序后的最大相邻差

无序数组排序后的最大相邻差先排序&#xff0c;在一个一个求差&#xff0c;找出最大的差解法2(计数排序变体)第一步第二步第三步第四步例子JAVA实现解法3(桶排序变体)第一步第二步第三步例子JAVA实现有一个无序整型数组&#xff0c;如何求出该数组排序后的任意两个相邻元素的最…

洛谷千题详解 | P1022 [NOIP2000 普及组] 计算器的改良【C++、Python、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目背景 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Python源码&#xff1a; Java源码&#xff1a; ---------------------------------------------------------------…

前端基础_绘制带边框矩形

绘制带边框矩形 今天给小伙伴分享&#xff0c;如何在canvas画布中绘制一个矩形。在本例中调用了脚本文件中的draw函数进行图形描绘。该函数放置在body属性中&#xff0c;使用“οnlοad"draw(canvas);"”语句&#xff0c;调用脚本文件中的draw函数进行图像描画。在本…

大数据组件之Flink

文章目录大数据组件之Flink一.Flink简介Flink是什么&#xff1f;Flink的特点Flink框架处理流程Flink发展时间线Flink在企业中的应用Flink的应用场景为什么选择Flink&#xff1f;传统数据处理架构有状态的流式处理&#xff08;第一代流式处理架构&#xff09;流处理的演变&#…

实锤了,尤大妥妥的二次元迷弟 —— 聊聊 Vue 的进化历程

文章目录实锤了&#xff0c;尤大妥妥的二次元迷弟 —— 聊聊 Vue 的进化历程1. 前言2. 库阶段2.1 阶段发展2.2 设计重点和特征3. 框架阶段3.1 阶段发展3.2 设计重点4. 通用框架阶段4.1 阶段发展4.2 设计重点4.3 典型案例5. 编译/运行时混合阶段5.1 阶段发展5.2 设计重点5.3 框架…

五十二——六十二

五十二、JavaScript——函数简介 一、函数 函数&#xff08;Function)- 函数也是一个对象 - 它具有其他对象所有的功能 - 函数中可以储存代码&#xff0c;且可以在需要时调用这些代码 语法&#xff1a; function 函数名&#xff08;&#xff09;{ 语句。。。 } 调用函数- 调用…

drm框架介绍

Drm框架介绍 DRM是Linux目前主流的图形显示框架&#xff0c;相比FB架构&#xff0c;DRM更能适应当前日益更新的显示硬件。比如FB原生不支持多层合成&#xff0c;不支持VSYNC&#xff0c;不支持DMA-BUF&#xff0c;不支持异步更新&#xff0c;不支持fence机制等&#xff0c;而这…

嗅探网站视频

前置知识 MP4是我们常见的视频格式&#xff0c;往往我们在播放服务器视频时直接就是请求的MP4视频源。但其实这样并不好&#xff0c;MP4头文件[ftypmoov]较大&#xff0c;初始化的播放需要下载完整的头文件并进行解析&#xff0c;之后再下载一定长度的可播视频片段才能进行播放…