something about...JPEG

something about…JPEG

一些色彩空间(色彩模型):

  • RGB:红绿蓝,通过三原色不同的配比表示不同的颜色,通常用于显示屏
  • CMYK:用青色、品红、黄色、黑色四组颜色数值表示色彩,经过四种颜色不同配比显示不同色彩,常用于印刷
  • YUV(YCbCr):JPEG编码使用的色彩模型,拥有三个分量,Y(亮度)、Cb(彩度蓝)、Cr(彩度红),

人眼工作机制:

人眼内含有视锥细胞和视杆细胞,前者具有感知颜色的能力,后者具有感知亮度的能力,通常眼中视杆细胞数量相对较多,因此对亮度的敏感程度高于色彩的的敏感程度。JPEG利用该特性,在压缩图像时将亮度和颜色分开处理。

JPEG压缩过程

  1. RGB -> YUV(BT.601标准):对每个像素点的RGB三个数值执行如下变换(该步骤结束后图像大小不变):
    • Y = 0.299*R + 0.587*G + 0.114*B
    • Cb = -0.1687*R - 0.3313*G + 0.5*B + 128
    • Cr = 0.5*R - 0.4187*G - 0.0813*B + 128
  2. 色度抽样:对每个像素点的Y、Cb、Cr三个分量采取Y:Cb:Cr=4:2:0的分量,即Y分量全采样,对CbCr分量进行1/4取样(2:0并不是Cb分量取一半而Cr不取,而是二者间隔取样,奇数行取Cb分量,偶数取Cr)。原本像素数为N的图片大小(字节数)为3N,经过该步骤后为1.5N,此为第一次压缩,称为缩减采样。
  3. 离散余弦变换(DCT)+量化:在JPEG算法中图像被分成了8*8的像素组,每个像素组的Y、Cb、Cr分量的数据都要单独进行处理。先进行电平偏移(-128),这样像素值的范围就从0~255变为-128~127,再用离散余弦变换进行频域编码,得到DCT系数。将DCT变换后的临时结果,除以各自量化步长(量化表)并四舍五入后取整,得到量化系数。注:JPEG存在两张量化表,色度量化表的值普遍更大,这意味着色度通道的高频信息会被更激进地丢弃。
    亮度量化表(Luminance)
    1
    2
    3
    4
    5
    6
    7
    8
    16  11  10  16  24  40  51  61
    12 12 14 19 26 58 60 55
    14 13 16 24 40 57 69 56
    14 17 22 29 51 87 80 62
    18 22 37 56 68 109 103 77
    24 35 55 64 81 104 113 92
    49 64 78 87 103 121 120 101
    72 92 95 98 112 100 103 99
    色度量化表(Chrominance)
    1
    2
    3
    4
    5
    6
    7
    8
    17  18  24  47  99  99  99  99
    18 21 26 66 99 99 99 99
    24 26 56 99 99 99 99 99
    47 66 99 99 99 99 99 99
    99 99 99 99 99 99 99 99
    99 99 99 99 99 99 99 99
    99 99 99 99 99 99 99 99
    99 99 99 99 99 99 99 99
  4. zigzag排列。观察得到的最终矩阵,左上角至右下角连续的0数量上升,从左上角开始,以Z字形来回穿梭,直至经历矩阵中所有数字到达右下角,该排列称为zigzag排列。zigzag
  5. 用熵编码技术对数据进行编码。排列后得到的数据尾段出现大量连续的0(哈夫曼编码中在JPEG有一个EOB字段,表示从字段开始后续全为0),然后再根据哈夫曼编码进行压缩。
  6. 以上从DCT到哈夫曼编码的过程是对一个8*8像素组压缩编码的过程,将全图像每个8*8像素组依次进行编码即可压缩整个图像。