图像编码
- 图像RGB到YUV的转换
- 图像分块
- DCT变换
- 量化
- 反量化
- 反DCT变换
- 重建YUV图像
- YUV到RGB的转换
- ##在量化与反量化之间加入zigzag扫描和Run-length编码。
实验原理
-
Yuv图像
YUV,是一种颜色编码方法。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度与浓度(Chrominance、Chroma)
对计算机而言,计算机用的数字域的色彩空间变换与电视模拟域的色彩空间变换不同,它们的分量使用 Y、Cr 和 Cb 来表示,所以需要将RGB转化为YCrCb,其转换关系如下:
这里的Y表示亮度(Luminance),Cb和Cr分别表示绿色和红色的“色差值”。通过这种方式计算出来的 Y、Cr 和 Cb 分量,会出现大量的小数,即浮点数,从而导致了在JPEG 编码过程中会出现大量的浮点数的运算,经过一定的优化,这些浮点数运算可以用移位与加法这些计算机能更快速处理的方式来对其进行编码。
-
DCT(离散余弦变换)
DCT指Discrete Cosine Transform,意思是离散余弦变换,其常见用途是对音视频进行数据压缩。
在数字通信原理中接触到过快速傅立叶变换,离散余弦变换就是傅立叶变换的另外一种形式,傅立叶变换可以将时域信号转化成频域信号,其源于傅立叶曾经提出的一个著名想法,他认为任何周期性的函数,都可以分解为一系列的三角函数的组合,这个想法当时被拉格朗日所质疑,他提出三角函数无论如何组合,都无法表达带有“尖角”的函数,虽然最后拉格朗日是正确的,但是只要三角函数足够多,我们就可以无限逼近最终结果,举个例子,来看一下如何用三角函数描述一个矩形方波:
当我们要处理的不再是函数,而是一堆离散的数据时,那么傅里叶变化出来的函数只含有余弦项,这种变换称为离散余弦变换。
在JPEG压缩算法中,先会把整个图像分割成8*8的图像块,再对每一个图像块进行DCT变换,而二维DCT变换公式为:
DCT变化后,矩阵被分成了直流分量和交流分量两个部分,而一直到这里,整个过程都是可逆的,图像仍然是无损的,而这一步为后面的图像压缩起了铺垫作用,所以DCT变换是JPEG压缩算法的核心。 -
数据量化
图像数据转换为频率系数后,还得接受一项量化程序,才能进入编码阶段。量化阶段需要两个8*8矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值,取得与商数最近的整数,即完成量化。 当频率系数经过量化后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不过,经过量化阶段后,所有数据只保留整数近似值,也就再度损失了一些数据内容。JPEG提供的两张标准量化系数矩阵如下:
quant_tblY = [
[16, 11, 10, 16, 24, 40, 51, 61],
[12, 12, 14, 19, 26, 58, 60, 55],
[14, 13, 16,