美文网首页图像压缩
DCT离散余弦变换

DCT离散余弦变换

作者: 吸霾少年 | 来源:发表于2018-03-29 11:07 被阅读159次

    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597

    2.1 以8x8的图象块为基本单位进行编码

    如下图所示。比如一个160x160大小的原始图像,就可以分成20x20个8x8图像块。


    这里写图片描述

    每个图像块共64个像素。像素可以用RGB或YUV表示,需要3个byte。所以严格来说,上图3个箭头代表的数据,指的是RGB/YUV的某一个值,比如Y。

    2.2 将RGB转换为亮度-色调-饱和度系统(YUV),并重新采样

    YUV是什么?它也是一种很不错的图像数据表示方法,特别是在视频领域。
    Y:指颜色的明视度、亮度、灰度值;
    U:指色调;
    V:指饱和度。

    YUV是一个统称,其实有很多具体格式,比如YUV420, YUV444, YUV422。
    YUV的某些格式,和RGB比起来,其数据量要少很多。
    比如YUV420,每个像素需要一个Y,每4个像素需要一个U/V,因此一个8*8图像块,数据量只要8x8x3/2 = 96byte。而RGB需要8x8x3 = 192byte。少了一半的数据量。现在很多视频都是YUV420作为色域。
    当然啦,在本次转换,用的是YUV444, 也就是每个像素都有YUV的值。

    YUV与RGB可以互相转换。
    Y=0.299R+0.587G+0.114B
    U=0.148R-0.289G+0.473B
    V=0.615R-0.515G-0.1B

    2.3 FDCT与IDCT

    一个是正变换,一个是逆变换。反正都可以称为离散余弦变换。
    根据8*8的二维DCT定义


    这里写图片描述

    其中:0<= u, v < 8


    这里写图片描述

    a(v) = a(u)


    这里写图片描述

    是输入8x8像素的坐标。


    这里写图片描述

    是输出的8x8变换结果的坐标。

    不要把上式看的有多难,也不要被“离散余弦变换”这个词给吓到,其实他没什么(如果你非要去追究,那就打开“信号与系统”的书复习一下吧,我拦不住你哈),上式其实就是一个运算公式而已。
    输入就是8x8的数据矩阵,经过计算,输出还是一个8x8的数据矩阵。
    其实上式可以简化为:


    这里写图片描述

    并且A和A转置矩阵都是已知的。所以,说白了,就是个矩阵运算。对程序来说,很简单。

    称G(0,0),也就是输出8x8矩阵的(0,0)坐标的值,为直流系数,其他为交流系数。
    之所以称它为直流系数,是因为当u, v = 0时,cos()结果都为0,所以最后结果就是输入矩阵的8x8的每个数值的和,再乘于a(u) x a(v) x 1/4 = 1/8。

    当然了,输入数据其实是有3个的,也就是YUV,因此对每个8x8的原始图像数据,需要做3次DCT。

    2.4 量化与反量化

    定义:将DCT变换后的临时结果,除以各自量化步长并四舍五入后取整,得到量化系数。
    为什么可以量化?!
    因为经过DCT后,数据就不同了,左上方都是大数值,右下方都是小数值。比如左上方都是几十几百的,右下方附近,都是个位数,那么,大数值和小数值就可以分别量化。

    在术语里,左上方称为低频数据,右下方称为高频数据
    你要是不理解,可以这么想,既然G(0,0)都是直流分量了,那频率不就是0?不就是所谓的低频?^^

    还是不理解?好吧,那你也可以这么想:
    比如cos(ax),a是常数,x是变量。那么,根据频率f = a/2π,a越大,函数的频率越高。
    看看DCT公式:


    这里写图片描述

    u,v 越大,则越在右下方对吧。当计算某个G(u, v)时,x, y是变量,u, v相当于常数,当u/v越大,则频率越高!
    这就是为啥右下方称为高频数据了!

    好了,别走偏了,还继续说量化。
    JPEG系统分别规定了亮度分量和色度分量的量化表,色度分量相应的量化步长比亮度分量大。

    对量化系数的处理和组织
    思想:JPEG采用定长和变长相结合的编码方法。
    直流系数:通常相邻8*8图象块的DC分量很接近,因此JPEG对量化后的直流分量采用无失真DPCM编码。通常JPEG要保存所需比特数和实际差值。

    交流系数:经过量化后,AC分量出现较多的0。JPEG采用对0系数的行程长度编码。而对非0值,则要保存所需数和实际值。
    ZIG-ZAG排序:为使连续的0个数增多,采用Z形编码。

    这里写图片描述

    你要是不理解,看看下面的例子,就知道为啥ZIG-ZAG可以俘获更多的0了!

    3 应用举例

    3.1 编码

    某个图象的一个8*8方块,的亮度值。


    这里写图片描述

    由于一个字节是0255,为了减小绝对值波动,先把数值移位一下,变成-128127。

    这里写图片描述

    接着,根据DCT变换公式,各种计算,获得临时结果。


    这里写图片描述

    根据亮度量化表量化后得到的量化系数矩阵


    这里写图片描述

    获得量化结果:


    这里写图片描述

    可见,新的数据,很小,很多是0。正如上文所说,这么多0,完全可以用游程编码,大大缩小数据量。

    3.2 解码

    先游程编码恢复为


    这里写图片描述

    然后,根据量化表,恢复


    这里写图片描述

    再根据反离散余弦变换的公式:


    这里写图片描述

    结果为:


    这里写图片描述

    再右移127,恢复原始。


    这里写图片描述

    和原始图像的数据相比,基本是一样的,或者近似的!

    相关文章

      网友评论

        本文标题:DCT离散余弦变换

        本文链接:https://www.haomeiwen.com/subject/sthmcftx.html