JPEG压缩是一种针对静止的连续色调的图像压缩方法.
JPEG压缩编码-解压缩算法框图
离散余弦变换,比较重要的低频信号在左上区域,所以可以去掉右下区域的数据,使用量化表。
量化表的量化与信号的量化不同。信号的量化是指压缩信号的幅度。这里的量化表的量化就是对某个像素进行相应的划分。数据分布不均匀,左上角数据量化步长很小,右下角数据量化步长很大
JPEG压缩标准要点
(1)压缩比可控:编码器的参数中应包括控制压缩比和图像质量的成分。
(2)不受限制:适用于所有的连续色调图像,不应对图像的尺寸、彩色空间和像素纵横比等特性进行限制,也不应对图像的场景内容(如复杂性、彩色范围或统计特性)有任何限制
(3)适中的计算复杂性:压缩算法既可用软件实现,也可用硬件实现,并且具有较好的性能。
(4)有述具有下述4种操作模式:
①顺序编码 ②渐进编码 ③无失真编码 ④分层编码
1.分块采样(帧改组)
(1)JPEG压缩编码对象:为连续色调静止图像各分量信号进行单独采样。
(2)4:2:0格式中各分量信号的采样点数:
PAL制:
亮度信号(Y)有效采样点数为720×576,
色差信号(U,V有采点均)有效采样点数均为360×288。
NTSC制:
亮度信号(Y)有采点点数为720×480,
色差信号(I,Q)有效采样点数均为360×240。
(3)帧改组:采样时,当一帧图像信号输入到编码器时,编码器对其进行的分解处理,称为帧改组。
(4)帧改组方法:(亮度信号)
①分片:将图像分割成许多横向条(或称“片”),每条的宽度为16个采样点。
②分段:以16个采样点为一段, 得到16×16个采样点构成的块,称为宏区块。
③分像块:宏区块再分成4个8×8样点组成的像块。
注:a.DCT变换就是以像块为单位的;
b. 在::4:2:0式,格式中,U和V的采样点数均为Y(行和列)的一半,所以U,V的像块与Y的宏区块重叠(亮度信号有宏区块,色差信号无宏区块)。
④宏块的形成:由4个8×8的亮度(Y)像块组成的宏区块和与之重叠的两个8×8的色差(U,V )像块,这6个像块组成一个宏块。见下图。
2.FDCT变换(Front Discrete Cosine Transform)
经过帧重组和采样,各分量信号变为个一个8×8的样值矩阵。再经过FDCT变换,将每个像块的8×8=64样个样值f(x,y),变为换为8×8=64个FDCT数系数F(u,v)。一个是流直流DC系数,其他的63个是交流AC系数。
3.量化
可以根据应用环境和需求设计出不同的量化表,亮度信号和色差信号的量化表也不同,量化后输出的是二维的DCT系数矩阵F’(u,v)。
4.差值编码与Zig-Zag扫描
(1)DC系数的处理方法:直流分量(DC系数),并不参与Z形描,而是与前一像块的DC系数进行差值预测编码。
(2)AC系数的处理方法:63个AC系数,采用Z字形扫描输出。
(3)Z扫描后的数组排列:DC系数的预测误差排在扫描输出数组序列首位。
在上图中,第n块数据序列中的“”X”是本块的DC系数与前一块DC系数的差值,在这里没有标出。而第n+1块数据序列的第一数个数据是: DCn+1-DCn=10-8=2。
5.熵编码
(1)游程编码:差值编码和Zig-Zag扫描后,生成的一维数组序列还需进行游程
码以减少数组序列中零的个数,1个字节的高4位来表示连续“”0”的个数,而使用它的低4位来表示编码下一个非“”0”系数所需要的位数,跟在它后面的是非0量化AC系数的数值。
JPEG对DPCM码后的直流DC系数和RLE编码的交流AC系数使用熵编码作进一步的压缩
在JPEG有损压缩算法中,使用Huffman编码器来减少熵。使用Huffman编码器的理由是可以使用很简单的查表(lookup table)方法进行编码
压缩数据符号时,Huffman编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种变度可变长度的Huffman码表可以事先进行定义
1.DC编码
JPEG指出连续块的DC之间有很紧密的联系, 因此他们决定对 8×8 的块的DC 值的差别进
行编码(Y, Cb, Cr 分别有自己的 DC)。
Diff = DC(i ) – DC(i-1)
DC(i) = DC(i-1) + Diff
DC码表符号举例
若DC的值(Value)为4,符号SSSS用于表达实际值所需要的位数,实际位数就等于3
JPEG提供的亮度DC系数差的Huffman编码表
亮度差值为5(101的数)的位数为3,则Huffman是0100两连在起,两者连接在一起即
为100101。
Y矩阵中一个8*8块的DC差值=10,二进制值为1010,码长为4,查亮度DC差值的Huffman编码表得霍夫曼识别为长为3,识别码为101,则其霍夫曼编码为1011010,
2.AC编码
AC编码方式与DC略有不同,在AC编码之前,首先得将63个AC值Zig-zag序将排序,将AC系
将数字转换为中间符号。
中间符号表示为RRRR/SSSS,其中RRRR是指第非零的AC之前,其值为0的AC个数,SSSS是指AC值所需的位数,AC系数的范围与SSSS的对应关系与DC差值Bits数与差值内容对照表相似。
31,45,0,0,0,0,23,0,-30,-8,0,0,1,0,0,0, 0 ,0 ,0 , 0,..,0
RLC 压缩:(0,31) ; (0,45) ; (4,23) ; (1,-30); (0,-8) ; (2,1) ; EOB
(0,5), 11111 ; (0,6), 101101 ; (4,5), 10111;(1,5), 00001; (0,4) , 0111 ;(2,1), 1 ; (0,0)
查找色度AC系数的huffman表,则:
0/5 huffman 编码为 11001
0/6 huffman 编码为 111000
4/5 — 1111111110011001
1/5 — 11111110110
0/4 — 1011
2/1 — 11011
0/0 EOB — 00
那么最后对于前面的例子表示的63个系数按位流写入 JPEG文件中就是这样的:
总结:首先要对图像420采样区分亮度信号还是色度信号,采集的数据空间先分成条,取一片16*16的大小,对应4个8*8的亮度信号,2个8*8的色度U\V信号,一共6个块,对每个块进行离散余弦变换,变换后最左上角的原点就是直流DC系数,其他63个是交流AC系数,AC系数除以相应的量化表(色度和亮度量化表),对不同的块,第n+1块和n块作DC系数偏差编码,Z形扫描后游程编码,再进行霍夫曼熵编码,最后进行压缩数据的传输。
版权声明:本文为博主冬天里的棉袄原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/yh13572438258/article/details/123046981