一、色彩空间转换(RGB→YCrCb)
这一步没有数据删除,是可逆的步骤
YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分,其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV家族中, YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。
Y = 0,299R + 0.587G + 0.114B
Cb = -0.1687R - 0.3313G + 0.5·B+128
Cr = 0.5R - 0.4187G - 0.0813B+128
注:有的地方写的Cb和Cr的转换不需要+128,亲测需要加,不然会出现色彩混乱
转换代码
二、色度缩减取样
YUV(YCbCr)采样格式:
(1)YUV444:没有缩减色度取样每四个像素中Y分量 U分量 V分量都是4,平均每个像素3字节(24位),相比RGB几乎没有压缩
(2)YUV422:每四个像素4个Y分量,2个U分量,2个V分量;采样时相邻两个像素一个丢弃U分量,一个丢弃V分量;平均每个像素2字节
(3)YUV420:每四个像素4个Y分量,1个U分量,1个V分量;采样时保留全部Y数据,一行丢弃全部V数据,保留一半U数据;下一行丢弃全部U数据,保留一半V数据
三、离散余弦变换(DCT)
DCT详解:后续编写
把整个图像分成若干个8*8的像素区域,称为区块,每个区块64个像素
在JPEG压缩过程中,经过颜色空间的转换,每一个8X8的图像块,在数据上表现为3个8X8的矩阵,紧接着我们对这三个矩阵(分别对应Y Cb Cr)做一个二维的DCT转换,二维的DCT转换公式为:
经过DCT变换这个8*8区域的能量(相对连续的像素)全部集中在了左上角,右下角是我们可以舍弃的部分(像素变化边缘部分)
注:这一步仍然是可逆的,我们虽然经过了DCT变换,但是并没有造成数据损失
四、量化
上一步DCT我们可以得到三个表,分别对应Y Cb 和Cr,接下来我们对这三个表进行量化,也就是舍去右下角的一部分数据
量化的过程我们需要用到标准量化表,亮度和色度的量化表不同,所以我们需要用到两张表
我们分别用第三步得到的表,去除以量化表对应位置的数据(取整)比如:一张亮度表可以量化成这样:
可以看到,一大部分数据变成了0,这非常有利于后面的压缩存储。
注:对量化表乘上不同的系数可以实现不同程度的量化
五、进行编码
把上一步得到的量化后的数据,进行Z字型编码:
这么做的好处是可以使我们编码的后半部分出现大量的连续的0,这样就可以使用游程编码简化
然后把我们得到的序列进行哈夫曼编码,编码后就可以进行传输了
六、重构图片
霍夫曼解码,解析获得常数表,把之前之字形得到的数据放到表内
将得到的数值乘以量化表,然后用得到的数据乘以对应的基础图象,基础图象的叠加的
把色度和亮度转换为RGB色彩空间