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

JPEG图像的压缩标准(1)

分3个博客详细介绍JPEG图像的压缩标准,包含压缩和解压缩流程,熵编码过程和文件存储格式。

一、JPEG压缩标准概述

JPEG压缩标准由国际标准化组织 (International Organization for Standardization, ISO) 制订,用于静态图像压缩。JPEG标准包含有损量化压缩和无损编码压缩两种压缩方式,利用了不同视觉信息在人眼中的敏感程度差异,在取得更高的压缩性能的同时,也有着良好的图像视觉质量。JPEG有基于预测编码技术的无损压缩和基于DCT变换的有损压缩两种压缩格式,有霍夫曼编码和算术编码两种编码算法,包含渐进编码、分层编码、无损压缩编码和基于DCT的顺序编码四种编码模式。实际应用中使用最为广泛的是基于霍夫曼编码算法,DCT顺序编码模式的有损压缩格式,也是JPEG标准的基线模式,后续介绍的内容所使用的JPEG图像都是由基线模式生成的。

下图展示了空域图像经JPEG标准的压缩和解压缩流程与JPEG图像相互转化的过程。彩色空域图像经颜色空间转换和像素采样,由RGB格式转化成YCbCr格式存储,经离散余弦变换 (DCT) ,量化表量化,得到频域的量化DCT系数矩阵,使用ZiaZag扫描,顺序熵编码成为JPEG图像文件。

1.1、颜色空间转换与采样

在计算机系统中,空域图像通常以像素值矩阵存储,使用的是RGB颜色空间,其中,R代表红色,G代表绿色,B代表蓝色。直接存储完整的矩阵信息需要占用较大的存储空间,研究者发现人眼视觉系统对图像的亮度和色度信息敏感程度存在差异,对亮度信息比色度信息更为敏感。基于图像视觉质量考虑,可以通过损失部分色度信息换取更好的压缩性能,这也是JPEG图像采用YCbCr格式的初衷。YCbCr颜色空间中,Y代表亮度,Cb,Cr分别代表色度和饱和度(也可将Cb, Cr两者统称为色度),三者通常以Y,U,V来表示,即用 U 代表Cb,用 V 代表Cr,后续本文将以YUV指代YCbCr。在空域图像向JPEG格式转换的第一步,会将RGB颜色通道根据式1转换成YCbCr格式,同理,在JPEG图像转换为空域图像的最后一步,会将YCbCr颜色空间转变为RGB格式,如式2所示。

Y=0.299R+0.587G+0.114B \\ Cb=-0.169R-0.331G+0.5B\\ Cr=0.5R-0.419G-0.081B            (1)

R=Y+1.402Cr\\ G=Y-0.344Cb-0.714Cr\\ B=Y+1.722Cb\\                    (2)

在转换为YUV格式后,为压缩存储的矩阵信息,会根据相应的采样因子对U,V通道下采样,这是彩色图像压缩的第一步。目前支持JPEG格式的软件通常提供YUV411 和 YUV422两种采样方式。以YUV411的采样为例,水平和垂直采样因子=2:2,在每个2*2的像素矩阵上,3个颜色通道都有4个像素值,采样前共需要12字节存储。使用4:1:1采样后,Y分量全采样,U,V分量上只采样1个像素,只需要6个字节存储,具体采样方式如下图所示。在JPEG转换回空域图像过程中,对U,V分量上采样,Y分量的四个像素Y1,Y2,Y3,Y4共用U,V分量的采样像素U1,V1。由此可见,向下采样会丢失部分色度分量数据,使得空域图像和JPEG图像的转换过程不是可逆的,但其能够在人眼不易察觉的视觉失真范围内取得良好的压缩性能,节省存储空间,因此广泛应用于压缩格式图像和视频中。

1.2、DCT变换

DCT变换实现了空域像素与频域系数的相互转换,包含二维正向离散余弦变换 (Forward Discrete Cosine Transform, FDCT) 和二维反向离散余弦变换 (Inverse Discrete Cosine Transform, IDCT) 。对采样后的空域图像,首先将像素矩阵分成8×8的图像块,根据式3进行FDCT变换,得到对应的8×8频域系数矩阵。DCT变换不会压缩图像,但能将图像重要和不重要的信息分离,即将图像块的大部分能量集中在频域矩阵的左上方。8×8矩阵的第一个系数是DC系数,包含了图像块的大部分能量,其余63个系数表示为AC系数,包含图像的纹理信息。FDCT和IDCT变换分别如式3和4所示。

F(u,v)=\frac{1}{4}c(u)c(v)\sum\limits_{i=0}^{7}{\sum\limits_{j=0}^{7}{f(i,j)\cos \frac{(2i+1)u\pi }{16}}}\cos \frac{(2j+1)v\pi }{16}  (3)

f(i,j)=\frac{1}{4}\sum\limits_{u=0}^{7}{\sum\limits_{v=0}^{7}{c(u)c(v)F(u,v)\cos \frac{(2i+1)u\pi }{16}}}\cos \frac{(2j+1)v\pi }{16}  (4)

其中,

第一个部分就介绍这些,下次再介绍其余部分,包括量化、熵编码等部分。

相关文章:

JPEG图像的压缩标准(1)

分3个博客详细介绍JPEG图像的压缩标准,包含压缩和解压缩流程,熵编码过程和文件存储格式。 一、JPEG压缩标准概述 JPEG压缩标准由国际标准化组织 (International Organization for Standardization, ISO) 制订,用于静态图像压缩。JPEG标准包…...

数解 transformer 之 self attention transformer 公式整理

句子长度为n;比如2048,或1024,即,一句话最多可以是1024个单词。 1, 位置编码 可知,E是由n个列向量组成的矩阵,每个列向量表示该列号的位置编码向量。 2, 输入向量 加入本句话第一个单词的词嵌入向量是, 第…...

ubuntu22.04@laptop OpenCV Get Started

ubuntu22.04laptop OpenCV Get Started 1. 源由2. 步骤3. 预期&展望4. 参考资料 1. 源由 OpenCV在学校的时候接触过,不过当时专注在物理、研究方面,没有好好的学习下。 这次借后续视频分析刚性需求,对OpenCV做个入门的学习和研读&#…...

【Java】苍穹外卖 Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示: 管理端-外卖商家使用用户端-点餐用户使用当我们完成该项目的学习,可以培养以下能力: 1. 软件开发整体介绍 作为一名软件开…...

Ivanti Pulse Connect Secure VPN SSRF(CVE-2023-46805)漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…...

GPT-4:比ChatGPT3.5好得多,但它有多好你知道么?

GPT-4简介 GPT-4是一款由OpenAI开发的人工智能语言模型,它是ChatGPT3.5的升级版。GPT-4拥有更强大的学习能力、更高的生成质量和更广泛的知识覆盖范围,被誉为人工智能技术的重要突破。 GPT-4与ChatGPT3.5的对比 1. 学习能力 GPT-4采用了更多的神经网…...

测试:JMeter如何获取非json格式的响应参数

JMeter如何获取非json格式的响应参数 在 JMeter 中获取非 JSON 格式的响应参数通常涉及使用后置处理器来提取这些参数。以下是一些常见的方法来获取不同类型的响应数据: 正则表达式提取器: 适用于提取文本、HTML、XML 等格式中的特定文本。使用正则表达…...

2024年刘谦魔术大揭秘,其中竟用到了约瑟夫环?

目录 前言 魔术过程 揭秘过程 结尾 前言 不知道昨天春晚时刘谦的魔术大家看了没有,相信大家跟我一样也很疑惑,所以爆肝一天我得出了结论。如果你觉得还不错的话,记得点赞收藏,分享给更多的朋友看。 魔术过程 整个魔术可以分…...

openssl3.2 - update debian12‘s default openssl to openssl3.2

文章目录 openssl3.2 - update debian12s default openssl to openssl3.2概述笔记回到debian12自带的openssl版本从源码编译安装最新版的openssl配置ssl访问END openssl3.2 - update debian12’s default openssl to openssl3.2 概述 在debian12虚拟机中编译了openssl3.2(ope…...

VUE2和VUE3区别对比一览

## Vue3总结 ### 官方文档 * [Vue3](https://v3.cn.vuejs.org/api/options*data.html) * [Vue2](https://vuejs.bootcss.com/api/) ### Vue3相对于Vue2的语法特性#### 1.获取数据 * vue2 javascript export default {data() {return {name: myName,}},mounted() {console.log(t…...

Linux - updatedb 命令

1. 功能 updatedb 命令用来创建或更新slocate命令所必需的数据库文件。updatedb 命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文件信息写入 slocate 数据库文件中。 补充说明:slocate 本身具有一个数据库&#xff…...

云计算市场分析

目录 一、云计算市场概述 1.1 概述 二、国外云计算厂商 2.1 亚马逊AWS 2.2 微软AzureAzure 2.3 Apple iCloud 三、国内云计算厂商 3.1 阿里云 3.2 腾讯云 3.3 华为云 3.4 百度智能云 一、云计算市场概述 1.1 概述 云计算从出现以来,其发展就非常迅速。以…...

前端JavaScript篇之call() 和 apply() 的区别?

目录 call() 和 apply() 的区别? call() 和 apply() 的区别? 在JavaScript中,call()和apply()都是用来改变函数中this指向的方法,它们的作用是一样的,只是传参的方式不同。 call()方法和apply()方法的第一个参数都是…...

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介: 设计模式是在软件开发过程中,经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合,可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在设计和编码过程中的指导,它用于…...

汇编语言程序设计(二)十六位汇编框架、子程序与堆栈

寄存器 如下是16位通用寄存器,存储在cpu硬件中 AX 返回值 AX寄存器分为两部分 AH和AL AH 高8位 存储功能号 AL 低8位 存储返回码 以下是一个AX寄存器应用: mov ax,4c00h 4c给高位AL,00低位AL,16进制要以h结尾 BX CX 计数…...

K8S之标签的介绍和使用

标签 标签定义标签实操1、对Node节点打标签2、对Pod资源打标签查看资源标签删除资源标签 标签定义 标签就是一对 key/value ,被关联到对象上。 标签的使用让我们能够表示出对象的特点,比如使用在Pod上,能一眼看出这个Pod是干什么的。也可以用…...

网络请求库axios

一、认识Axios库 为什么选择axios? 功能特点: 在浏览器中发送 XMLHttpRequests 请求在 node.js 中发送 http请求支持 Promise API拦截请求和响应转换请求和响应数据 补充: axios名称的由来? 个人理解没有具体的翻译. axios: ajax i/o system 二、axios发送请求 1.axios请求…...

程序设计语言的组成

程序设计语言的组成 程序设计语言基本上由数据、运算、控制、传输组成 数据成分 数据是程序操作的对象,具有存储类别、类型、名称、作用域和生存期等属性 从不同角度可将数据进行不同的划分。 数据类型的分类如下: 按程序运行过程中数据的值能否改…...

论文精读的markdown模板——以及用obsidian阅读网页资料做笔记

# The Investigation of S-P Chart Analysis on the Test Evaluations of Equality Axiom Concepts for Sixth Graders Tags: #/unread 本体论: 背景起源和发展 包含要素 # # # 可关联要素 # # # 逻辑 意义: 方法论: 方法论是一…...

LCP 30. 魔塔游戏

LCP 30. 魔塔游戏 难度: 中等 题目: 小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Cursor实现用excel数据填充word模版的方法

cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...