zoukankan      html  css  js  c++  java
  • JPEG解码:反DCT变换(一)

    DCT(Discrete Cosine Transform)离散余弦变换是一种经典谱分析方法,属于离散傅立叶变换的一种特殊情况,即在变换后的傅立叶级数中只包括余弦项,变化后的数据比较集中。经过DCT变换可以将图片从色彩域转换到频率域,将原始图像的信息块转化为代表不同频率分量的系数集。它是一种广泛使用的压缩方法,首先把每个单独的彩色图像分量分成8×8图像块,然后经过二维DCT变换,其低频分量都集中在左上角,高频分量分布在右下角。变换之后还是8×8的数据块,也就是说DCT变换本身并没有起到压缩数据的作用,但是它为以后的数据压缩奠定了必不可少的基础。

    经过DCT变换的数据有2个优点:1,信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量只需要很少的比特数;2,频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。对于变换之后的8×8的数据矩阵块,矩阵最左上角的直流 (DC)系数幅度最大,以DC 系数为出发点向下、向右的其它DCT 系数,离DC 分量越远,频率越高,幅度值越小,即图像信息的大部分集中于直流系数及其附近的低频频谱上,离DC 系数越来越远的高频频谱几乎不含图像信息,甚至于只含杂波。

    压缩图像是经过DCT变换之后的图像,我们要对压缩图像进行解压就要对压缩数据进行“反DCT变换(DCT逆变换)”。DCT逆变换的方法有好几种,我们这里采用行列分解的方法。

    DCT逆变换的公式为:

         

    可改写为:

    f=AτFA                                                                                    

     其中A为矩阵:

     对上面的公式进行变形的

    Y =FA

    f  =AT Y

    fT =(AT Y)T =YT A

    其中F的数据块。

    经分析可知,完成一次DCT逆变换需要4步:

    1:压缩数据块(8×8)矩阵与矩阵A(8×8)相乘,得到矩阵Y(8×8)。

    2:对矩阵Y进行转秩得到(8×8)。

    3:Y的转秩再与矩阵A相乘得到8×8的矩阵ft

    4:对ft  进行转秩得到f。  

    所以整个设计中需要两个模块,一个用于矩阵的相乘,两个用于矩阵的转秩。

    总体设计如下:

    A矩阵乘法器的作用是实现输入矩阵和A矩阵的相乘。注意A矩阵在乘法的右边。

    iDCT变换的对象是8 ×8的数据单元,既输入数据共64个,按行输入,每8个数据为一行。每输入一行数据就分别和A矩阵的每一列进行乘加运算,每完成一次这样的乘加运算就输出一次结果。由于输入在左边,所以输出的按矩阵的行的序列输出的。比如,输入第一行数据,分别和A矩阵的各列相乘,按顺序输出8个结果,这8个结果就是输出矩阵的第一行;当输入第二行数据时,同样输出8个结果,这8个结果是输出矩阵的第二行。所以经过第一次矩阵乘法之后得到的是Y矩阵。

     

    转秩就是对64个数据进行重新排列的结果。

    如下图:

    左边为未转秩的数据顺序,右边为转秩之后的数据顺序。

  • 相关阅读:
    pku 1061 青蛙的约会 扩展欧几里得
    莫比乌斯反演
    51Nod 1240 莫比乌斯函数
    51Nod 1284 2 3 5 7的倍数 容斥原理
    51Nod 1110 距离之和最小 V3 中位数 思维
    51Nod 1108 距离之和最小 V2 1096 距离之和最小 中位数性质
    HDU 2686 Matrix 多线程dp
    51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化
    HDU 1317XYZZY spfa+判断正环+链式前向星(感觉不对,但能A)
    设计模式(4)---单例模式
  • 原文地址:https://www.cnblogs.com/tony1224/p/2410918.html
Copyright © 2011-2022 走看看