数据压缩 JPEG解码

2024-01-30 22:08
文章标签 解码 jpeg 数据压缩

本文主要是介绍数据压缩 JPEG解码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JPEG解码


实验原理

JPEG压缩编码基本原理

JPEG(Joint Photographic Experts Group)是在国际标准化组织(ISO)领导之下制定静态图像压缩标准的委员会,第一套国际静态图像压缩标准ISO 10918-1(JPEG)就是该委员会制定的。由于JPEG优良的品质,使他在短短几年内获得了成功,被广泛应用于互联网和数码相机领域,网站上80%的图像都采用了JPEG压缩标准。
JPEG编码算法主要有以下一个重要步骤:
(1)对DCT去除图像数据的空间冗余;
(2)用人眼视觉最佳效果的量化表来量化DCT系数F(u,v),去除视觉冗余;
(3)对量化后的DCT系数F(u,v)数据进行熵编码,去除熵冗余。
JPEG编码原理图
这里写图片描述

  1. 预处理
    • 像块分割
      把源图像分割成互相不重叠矩形块,每一个像块作为一个独立的单元进行变化和编解码。JPEG的像块大小为8×8,各像素数据值分布比较均匀,像素件的相关性较强。
      这里写图片描述
    • 零偏置(Level Offset)
      对于灰度级是2n的像素,通过减去2n-1,将无符号 的整数值变成有符号数。 对于n=8,即将0~255的值域,通过减去128,转换为值 域在-128~127之间的值  目的:使像素的绝对值出现3位10进制的概率大大 减少
  2. DCT
    性质:
    (1)能量守恒
    (2)能量集中
    (3)去相关
    经过DCT变换后,图像中的低频分量会集中在左上角,由于图像低频能量高,故而左上角数值大,右下角有较多的0值。
    这里写图片描述
  3. 量化
    (1)根据人眼的视觉特性(对低频敏感,对高频不太敏感)对 低频分量采取较细的量化,对高频分量采取较粗的量化。
    -> 如果原始图象中细节丰富,则去掉的数据较多,量化后的系数与 量化前差别
    ->反之,细节少的原始图象在压缩时去掉的数据少些
    (2)因为人眼对亮度信号比对色差信号更敏感,因此使用了两 种量化表:亮度量化值和色差量化值 。
  4. 之字形扫描
    由于量化之后右下角高频系数大部分为0,在编码是为了制造更长的0游程提高编码效率,采用之字形扫描读取法。经过之字形扫描读出后把二维系数矩阵转换为一维数据序列。在最后, 如果都是零,给出 EOB (End of Block) 即可。
    zig-zag序
    这里写图片描述
  5. DC系数的差分编码
    由于直流系数F(0,0)代表了该像块中包含的直流成分,数值较大,又由于两个相邻像块的直流系数通常具有较大的相关性,所以对DC系数采用差分编码(DPCM),传送当前快与前一个块之间的DC系数差值。
    这里写图片描述
    码字=类别ID+类内索引
    这里写图片描述
    类别ID同时也是解码类内索引时,还需读几位的码流,存在DC系数Huffman码表的权值中。
    例:DC=8,上一DC=5,则DIFF=8-5=3 类别ID=2,类内索引=3,则码流=10011
  6. AC系数的游程编码
    编码规则:(run,level)
    表示连续run个0,后面跟着值为level的AC系数。
    • run:最多15个,故用4位表示。
    • level:类似DC系数,分为类别ID与类内索引。用4位表示类别ID。
      (run,level的类别ID)合成1字节存在AC系数码表的权值中。

JPEG文件格式

英文缩写英文全称说明标志代码
SOIStart of Image图像开始0xFFD8
APPnApplication应用程序保留标记n0xFFEn
DQTDefine Quantization Table定义量化表0XFFDB
SOF0Start of Frame帧图像开始0xFFC0
DHTDefine Huffman Table定义哈夫曼表0xFFC4
SOSStart of Scan扫描开始,12字节0xFFDA
EOIEnd of Image图像结束,2字节0xFFD9

1.DQT量化表
(1)标记代码:0xFFDB
(2)数据长度:2字节 包括字段(2)和多个字段(3)总长度。
(3)量化表:
① 精度及量化表ID 1字节
高4位:精度,只有两个可选值 0:8位;1:16位
②表项 (64×(精度+1))字节

2.DHT哈夫曼表
(1)标记代码:0xFFC4
(2)数据长度:2字节
(3)huffman表
- 表ID和表类型:1字节
高4位:类型,只有两个值可选( 0:DC直流;1:AC交流 )
低4位:哈夫曼表ID(注意,DC表和AC表分开编码)
- 不同位数的码字数量:16字节
- 编码内容
16个不同位数的码字数量之和(字节)本标记段中,字段(3)可以重复出现(一般4次),也可以只出现1次。
在DC系数码表中,此项为权值,其权值就是解码时再需要 读入的bit位数。这个再次读入的位数通过查表得到真正的 码值。
在AC系数码表,权值的高4位表示当前数值前面有多少个连续的零,低4 位表示该交流分量数值的二进制位数,也就是接下来需要 读入的位数。
JPEG解码是编码的逆过程。


实验流程

1.逐步调试JPEG解码器程序。将输入的JPG文件进行解码,将输出文件保存为可供
YUVViewer观看的YUV文件。
2. 程序调试过程中,应做到:
- 理解程序设计的整体框架
- 理解三个结构体的设计目的
struct huffman_table
struct component
struct jdec_private
- 理解在视音频编解码调试中TRACE的目的和含义
- 会打开和关闭TRACE
- 会根据自己的要求修改TRACE
3. 以txt文件输出所有的量化矩阵和所有的HUFFMAN码表。
4. 输出DC图像并经过huffman统计其概率分布(使用第三个实验中的Huffman编码器)。
5. 输出某一个AC值图像并统计其概率分布(使用第三个实验中的Huffman编码器)。


代码分析

1.理解三个结构体
struct jdec_private处在最上层,支配整个图像,其中包含了struct huffman_table和 struct component。其中struct huffman_table用来存放DC系数、AC系数的哈夫曼码表;struct component 用来存放8*8数据块组成的MCU(Minimum Data Unit,最小数据单元)数据值,相当于移动的像块,每次访问下一个像块就给该结构体更新值。

struct huffman_table
{/* Fast look up table, using HUFFMAN_HASH_NBITS bits we can have directly the symbol,* if the symbol is <0, then we need to look into the tree table */short int lookup[HUFFMAN_HASH_SIZE];/* code size: give the number of bits of a symbol is encoded */unsigned char code_size[HUFFMAN_HASH_SIZE];/* some place to store value that is not encoded in the lookup table * FIXME: Calculate if 256 value is enough to store all values*/uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256];
};struct component 
{unsigned int Hfactor;//水平采样因子unsigned int Vfactor;//垂直采样因子float *Q_table;       /* Pointer to the quantisation table to use */struct huffman_table *AC_table;struct huffman_table *DC_table;short int previous_DC;    /* Previous DC coefficient */short int DCT[64];        /* DCT coef */
#if SANITY_CHECKunsigned int cid;
#endif
};//Frage stellen von susu

这篇关于数据压缩 JPEG解码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/661693

相关文章

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现+四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接:394. 字符串解码 1- 思路 栈实现+四种情况处理 ① 遇到数字,进行倍数相加 、②遇到左括号,压栈之前的元素、③遇到右括号弹出,栈进行拼接、④否则遇到字母,直接拼接在 res通过栈,实现先进后出的思想 对于输入 3[a2[c]] 的输入,在读到 3[得

基于FPGA的开源项目:FOC/SHA/USB/JPEG等

文章目录 [1. USB 1.1控制器](https://github.com/WangXuan95/FPGA-USB-Device)[2. FOC控制算法](https://github.com/WangXuan95/FPGA-FOC)[3. BSV高级硬件描述语言入门指南](https://github.com/WangXuan95/BSV_Tutorial_cn)[4. 基于XDMA的

libmad音频解码库-Linux交叉编译移植

下载并解压libmad-0.15.1b.tar.gz 下载链接:https://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz $tar -xvf libmad-0.15.1b.tar.gz$cd libmad-0.15.1b 1、先执行下面的命令:这条命令是为了适配高版本的gcc,因为高版本的gcc已经将-fforce-mem去除了:

Linux tar命令详解使用:掌握高效数据压缩与备份

tar 是 Linux 中用于创建、提取和管理归档文件的命令。 一、tar 的基本用法 tar [选项] [归档文件] [文件或目录...] 选项:用于指定 tar 的操作(如创建、解压缩等)。归档文件:要创建或解压缩的目标文件。文件或目录:要打包或提取的文件或目录。 二、tar 的常用选项 tar 命令有多个选项,以下是一些常用的选项: -c:创建新的归档文件(create)。-x

通过 Flash 让所有浏览器支持 WebP 格式图像解码

http://www.guao.hk/tag/webp#userconsent# http://www.etherdream.com/WebP/

优化采样参数提升大语言模型响应质量:深入分析温度、top_p、top_k和min_p的随机解码策略

当向大语言模型(LLM)提出查询时,模型会为其词汇表中的每个可能标记输出概率值。从这个概率分布中采样一个标记后,我们可以将该标记附加到输入提示中,使LLM能够继续输出下一个标记的概率。这个采样过程可以通过诸如 temperature 和 top_p 等参数进行精确控制。但是你是否曾深入思考过temperature和top_p参数的具体作用? 本文将详细解析并可视化定义LLM输出行为的