精华内容
下载资源
问答
  • 压缩感知中DCT变换矩阵的构造

    千次阅读 2016-04-07 20:34:02
    在视频压缩感知领域,信号的稀疏表示始终都是一个很核心的问题,在OMP算法和BCS-SPL算法等算法中,都会涉及到DCT变换矩阵的构造,但是其往往和我们所了解的DCT变换的定义(DCT变换的定义可以参考之前的博文离散傅立...

    在视频压缩感知领域,信号的稀疏表示始终都是一个很核心的问题,在OMP算法和BCS-SPL算法等算法中,都会涉及到DCT变换矩阵的构造,但是其往往和我们所了解的DCT变换的定义(DCT变换的定义可以参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT)有所不同。

    考虑到这些算法代码中DCT矩阵的构造都显得晦涩难懂而且基于定义构造的DCT变换矩阵和它们的功能又完全一样(且更容易理解),因此我们从DCT的定义出发给出DCT变换矩阵的构造代码。

    一维DCT变换矩阵

    参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中一维DCT的定义可以得到如下实现代码(直接拷贝保存为.m文件即可在MATLAB环境中使用):

    function [Phi] = DCT_1D_Matrix(m)
    
    %
    %
    % 该函数产生1维DCT-II变换矩阵,左乘对信号进行DCT-II变换,转置后左乘对信号进行IDCT-II逆变换
    % 输入参数:
    %           m:信号的长度
    % this function return 2D DCT-II transform matrix,
    %       
    %       left multiply: transform the signal into dct domain
    %
    %       transpose and left multiply: transform the coefficient into
    %       pixel domian
    %
    % Input parameters:
    %           m: the number of signal
    % 
    % Programmer: Li Wenhao
    % School: Electronic and information school
    % University: South China University of Technology
    % Date: 4/7/2016
    %
    
    Phi = zeros(m,m);
    
     for k = 1:m
         for n = 1:m
             Phi(k,n) = cos((2*n-1)*(k-1)*pi/(2*m));
         end
         if k==1
             Phi(k,:) = sqrt(1/m).*Phi(k,:);
         else
            Phi(k,:) = sqrt(2./m).*Phi(k,:);
         end
     end

    注意:该矩阵左乘信号进行DCT变换,转置后左乘进行反变换!

    说明:输入处理向量的长度即可得到一维DCT变换矩阵。

    二维DCT变换矩阵

    参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中二维DCT的定义可以得到如下实现代码(直接拷贝保存为.m文件即可在MATLAB环境中使用):

    function [Phi] = DCT_2D_Matrix(m,n)
    
    %
    %
    % 该函数产生2维DCT-II变换矩阵,左乘对信号进行DCT-II变换,转置后左乘对信号进行IDCT-II逆变换
    % 输入参数:
    %           m:信号的行数
    %           n:信号的列数
    % this function return 2D DCT-II transform matrix,
    %       
    %       left multiply: transform the signal into dct domain
    %
    %       transpose and left multiply: transform the coefficient into
    %       pixel domian
    % 
    % Input parameters:
    %           m: the number of row
    %           n: the number of col
    %
    % Programmer: Li Wenhao
    % School: Electronic and information school
    % University: South China University of Technology
    % Date: 4/7/2016
    %
    
    
    Phi = zeros(m*n,m*n);
    
    temp = zeros(m,n);
    
    for i = 1:m
        for j = 1:n
    
            for p = 1:m
                for q = 1:n
                    temp(p,q) = cos((2*p-1)*(i-1)*pi/(2*m))*cos((2*q-1)*(j-1)*pi/(2*n));
                end
            end
    
            if i==1
                temp = sqrt(1/m).*temp;
            else
                temp = sqrt(2/m).*temp;
            end
            if j==1
                temp = sqrt(1/n).*temp;
            else
                temp = sqrt(2/n).*temp;
            end
            Phi((j-1)*m+i,:) = temp(:)';
        end
    end
    

    注意:该矩阵左乘信号进行DCT变换,转置后左乘进行反变换!

    说明:一般我们输入二维信号的长和宽,然后通过上述代码得到其二维DCT变换矩阵,然后通过该矩阵对信号的列化向量进行正反变换处理,二维变换系数矩阵可以通过reshape对一维的列化的系数进行处理得到。

    为什么反变换是其转置

    基于公式的理论分析

    参考之前的博文离散傅立叶变换DFT和离散余弦变换DCT中一维和二维DCT的定义可以知道:

    1. 在一维DCT正变换中,我们构造的矩阵的每一行的u都是一个定值,但是在反变换中,对参数u进行累加因此是个变量,所以将其转置即是其反变换;

    2. 在二维 DCT正变换中,我们构造的矩阵的每Nv都是一个定值,然而C(u,v)列化之后每N个元素的v都是一个定值,因此根据矩阵相乘的关系可以知道其转置即是其反变换;

    基于代码的验证

    通过上述代码分别产生一维的矩阵P和二维的矩阵Q,然后在MATLAB中分别计算P'*PQ'*Q然后观察其结果是否为单位矩阵。为单位矩阵则说明反变换是其转置。

    总结

    OMP算法和BCS-SPL算法中分别使用了一维和二维的DCT变换矩阵,通过使用我们的矩阵进行替换然后仿真,其结果完全一致,这正好说明不同的DCT变换矩阵的功能是完全一样的,所以以后就可以使用我们自己构造的DCT变换矩阵。

    展开全文
  • 上一篇博文提到了离散傅里叶变换,地址如下:http://blog.sina.com.cn/s/blog_7445c2940102wcdj.html其实,离散余弦变换(DCT)就是离散傅里叶变换(DFT)的一部分,那么既然已经有了DFT,为什么还需要DCT呢?因为,DCT...

    上一篇博文提到了离散傅里叶变换,地址如下:

    http://blog.sina.com.cn/s/blog_7445c2940102wcdj.html

    其实,离散余弦变换(DCT)就是离散傅里叶变换(DFT)的一部分,那么既然已经有了DFT,为什么还需要DCT呢?因为,DCT只取了DFT中的实部,对于很多应用来说,既方便又简洁,没有复数域捣乱。不像DFT,画个图还要考虑实部虚部,幅值相位神马的。但是,也就意味着DCT相比DFT包含的信息要少。同之前一样,我们先给出DCT的变换公式:

    a4c26d1e5885305701be709a3d33442f.png公式1

    ​​同DFT变换一样,我们也要考虑到离散与连续的区别,具体我就不在赘述,可以查看前一篇博客。

    我们将上式向量化,得到如下公式:​

    a4c26d1e5885305701be709a3d33442f.png离散余弦变换矩阵

    ​​同理,可以得到IDCT变换矩阵:

    a4c26d1e5885305701be709a3d33442f.png离散余旋反变换矩阵

    ​matlab程序如下:

    1.正变换:

    N=width;

    dctmtx=zeros(N);

    dctmtx(1,:)=ones(1,N)/sqrt(N);

    �T第一行为常数

    for k=1:N-1

    dctmtx(k+1,:)=sqrt(2)*cos((2*(0:N-1)+1)*k*pi/(2*N))/sqrt(N);

    %生成X(1)到X(N-1)一共N个

    end

    2.反变换:

    N=width;

    idctmtx=zeros(N);

    idctmtx(:,1)=ones(N,1)/sqrt(N);

    %idct矩阵第一列为常数与C(0)相乘

    for n=0:width-1

    idctmtx(n+1,2:N)=cos((2*n+1)*(1:N-1)*pi/(2*N))*sqrt(2)/sqrt(N);

    end

    ​总结一下,DCT是取DFT的实部,也就可以通过DFT得到DCT,只不过先要将信号延展到2N-1。那么DFT的虚部是否也可以组成一个变换基底呢?答案是可以得,也就是离散正弦变换(DST)。但是在应用中很少见到DST,这是为什么呢?

    展开全文
  • DCT变换、DCT反变换、分块DCT变换欢迎转载,但请注明出处!转:http://www.tuicool.com/articles/nUfmAf2一、引言DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域...

    DCT变换、DCT反变换、分块DCT变换

    欢迎转载,但请注明出处!转:http://www.tuicool.com/articles/nUfmAf2

    一、引言

    DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在当前的图像分析已经压缩领域有着极为广大的用途,我们常见的JPEG静态图像编码以及MJPEG、MPEG动态编码等标准中都使用了DCT变换。

    二、一维DCT变换

    一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换。一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单、适用范围广。我们在这里只讨论这种形式,其表达式如下:

    5d8d58cf48316095d6eba673d5f994ab.png

    其中,f(i)为原始的信号,F(u)是DCT变换后的系数,N为原始信号的点数,c(u)可以认为是一个补偿系数,可以使DCT变换矩阵为正交矩阵。

    三、二维DCT变换

    二维DCT变换其实是在一维DCT变换的基础上在做了一次DCT变换,其公式如下:

    3f69bd2d17b94fb1f409f3fb839c6e65.png

    由公式我们可以看出,上面只讨论了二维图像数据为方阵的情况,在实际应用中,如果不是方阵的数据一般都是补齐之后再做变换的,重构之后可以去掉补齐的部分,得到原始的图像信息,这个尝试一下,应该比较容易理解。

    另外,由于DCT变换高度的对称性,在使用Matlab进行相关的运算时,我们可以使

    展开全文
  • DCT变换、DCT反变换、分块DCT变换

    千次阅读 2015-11-30 16:38:51
    DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在当前的...


    一、引言

    DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在当前的图像分析已经压缩领域有着极为广大的用途,我们常见的JPEG静态图像编码以及MJPEG、MPEG动态编码等标准中都使用了DCT变换。

    二、一维DCT变换

    一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换。一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单、适用范围广。我们在这里只讨论这种形式,其表达式如下:

    其中,f(i)为原始的信号,F(u)是DCT变换后的系数,N为原始信号的点数,c(u)可以认为是一个补偿系数,可以使DCT变换矩阵为正交矩阵。

    三、二维DCT变换

    二维DCT变换其实是在一维DCT变换的基础上在做了一次DCT变换,其公式如下:

    由公式我们可以看出,上面只讨论了二维图像数据为方阵的情况,在实际应用中,如果不是方阵的数据一般都是补齐之后再做变换的,重构之后可以去掉补齐的部分,得到原始的图像信息,这个尝试一下,应该比较容易理解。

    另外,由于DCT变换高度的对称性,在使用Matlab进行相关的运算时,我们可以使用更简单的矩阵处理方式:

    接下来利用Matlab对这个过程进行仿真处理:

     1 clear;
     2 clc;
     3 X=round(rand(4)*100)   %产生随机矩阵
     4 A=zeros(4);
     5 for i=0:3
     6     for j=0:3
     7         if i==0
     8             a=sqrt(1/4);
     9         else
    10             a=sqrt(2/4);
    11         end            
    12         A(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);
    13     end
    14 end
    15 Y=A*X*A'        %DCT变换
    16 YY=dct2(X)      %Matlab自带的dct变换

    运行结果为:

     1 X =
     2 
     3     42    66    68    66
     4     92     4    76    17
     5     79    85    74    71
     6     96    93    39     3
     7 
     8 
     9 Y =
    10 
    11   242.7500   48.4317   -9.7500   23.5052
    12   -12.6428  -54.0659    7.4278   22.7950
    13    -6.2500   10.7158  -19.7500  -38.8046
    14    40.6852  -38.7050  -11.4653  -45.9341
    15 
    16 
    17 YY =
    18 
    19   242.7500   48.4317   -9.7500   23.5052
    20   -12.6428  -54.0659    7.4278   22.7950
    21    -6.2500   10.7158  -19.7500  -38.8046
    22    40.6852  -38.7050  -11.4653  -45.9341

    由上面的结果我们可以看出,我们采用的公式的方法和Matlab自带的dct变化方法结果是一致的,所以验证了我们方法的正确性。

    如果原始信号是图像等相关性较大的数据的时候,我们可以发现在变换之后,系数较大的集中在左上角,而右下角的几乎都是0,其中左上角的是低频分量,右下角的是高频分量,低频系数体现的是图像中目标的轮廓和灰度分布特性,高频系数体现的是目标形状的细节信息。DCT变换之后,能量主要集中在低频分量处,这也是DCT变换去相关性的一个体现。

    之后在量化和编码阶段,我们可以采用“Z”字形编码,这样就可以得到大量的连续的0,这大大简化了编码的过程。

    四、二维DCT反变换

    在图像的接收端,根据DCT变化的可逆性,我们可以通过DCT反变换恢复出原始的图像信息,其公式如下:

    同样的道理,我们利用之前的矩阵运算公司可以推导出DCT反变换相应的矩阵形式:

    下面我们用Matlab对这个过程进行仿真:

     1 clear;
     2 clc;
     3 X=[
     4     61    19    50    20
     5     82    26    61    45
     6     89    90    82    43
     7     93    59    53    97] %原始的数据
     8 A=zeros(4);
     9 for i=0:3
    10     for j=0:3
    11         if i==0
    12             a=sqrt(1/4);
    13         else
    14             a=sqrt(2/4);
    15         end            
    16         A(i+1,j+1)=a*cos(pi*(j+0.5)*i/4); %生成变换矩阵
    17     end
    18 end
    19 Y=A*X*A'   %DCT变换后的矩阵
    20 X1=A'*Y*A  %DCT反变换恢复的矩阵

    运行结果为:

     1 X =
     2 
     3     61    19    50    20
     4     82    26    61    45
     5     89    90    82    43
     6     93    59    53    97
     7 
     8 
     9 Y =
    10 
    11   242.5000   32.1613   22.5000   33.2212
    12   -61.8263    7.9246  -10.7344   30.6881
    13   -16.5000  -14.7549   22.5000   -6.8770
    14     8.8322   16.6881  -35.0610   -6.9246
    15 
    16 
    17 X1 =
    18 
    19    61.0000   19.0000   50.0000   20.0000
    20    82.0000   26.0000   61.0000   45.0000
    21    89.0000   90.0000   82.0000   43.0000
    22    93.0000   59.0000   53.0000   97.0000

    我们可以看到反变换后无损的恢复了原始信息,所以证明了方法的正确性。但是在实际过程中,需要量化编码或者直接舍弃高频分量等处理,所以会出现一定程度的误差,这个是不可避免的。在对已变换的数据做反变换的时候,它是怎么还原成原来的图片的?对于DTC的反变换,因为在DCT变换的时候,滤掉了高频的本分,一般图形高频部分的系数是比较小的,在量化的时候可以忽略掉,因而还原的时候就是一个反傅里叶变化,就可以得到一个图形。对于那些颜色比较绚丽的图形,在压缩的时候,高频的系数已经不能忽略了,如果量化的时候压缩比过高,就可能导致明显的失真。也是8*8的系数 到 8*8的像素数据,具体怎么还原建议看一下图形压缩的基本算法。

    五、分块DCT变换

    在实际的图像处理中,DCT变换的复杂度其实是比较高的,所以通常的做法是,将图像进行分块,然后在每一块中对图像进行DCT变换和反变换,在合并分块,从而提升变换的效率。具体的分块过程中,随着子块的变大,算法复杂度急速上升,但是采用较大的分块会明显减少图像分块效应,所以,这里面需要做一个折中,在通常使用时,大都采用的是8*8的分块。

    Matlab的 blkproc 函数可以帮我们很方便的进行分块处理,下面给出我们的处理过程:

     1 clear;
     2 clc;
     3  
     4 X=imread('pepper.bmp');
     5 X=double(X);
     6 [a,b]=size(X);
     7 Y=blkproc(X,[8 8],'dct2');
     8 X1=blkproc(Y,[8 8],'idct2');
     9  
    10 figure
    11 subplot(1,3,1);
    12 imshow(uint8(X));
    13 title('原始图');
    14  
    15 subplot(1,3,2);
    16 imshow(uint8(Y));
    17 title('分块DCT变换图');
    18  
    19 subplot(1,3,3);
    20 imshow(uint8(X1));
    21 title('分块DCT恢复图');
    22  
    23 Y1=dct2(X);
    24 X10=idct2(Y1);
    25  
    26 figure
    27 subplot(1,3,1);
    28 imshow(uint8(X));
    29 title('原始图');
    30  
    31 subplot(1,3,2);
    32 imshow(uint8(Y1));
    33 title('DCT变换图');
    34  
    35 subplot(1,3,3);
    36 imshow(uint8(X10));
    37 title('DCT反变换恢复图');

    运行结果为:

    从图中,我们可以明显看出DCT变换与分块DCT变换在使用时的区别。

    六、小结

    DCT、DWT等是图像处理的基础知识,之前一直有用到,但是没怎么好好整理下,今天在做稀疏编码的时候正好有用到,就顺便整了下,希望能够给后来者一些提示。

    展开全文
  • DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在...
  • DCT变换、DCT反变换、分块DCT变换
  • DCT变换、DCT反变换、分块DCT变换 欢迎转载,但请注明出处!转:http://www.tuicool.com/articles/nUfmAf2 一、引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够...
  • DCT变换、DCT反变换、分块DCT变换 欢迎转载,但请注明出处! 一、引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去...
  • 数字图像处理DCT矩阵分块变换matlab程序 数字图像处理DCT矩阵分块变换matlab程序 数字图像处理DCT矩阵分块变换matlab程序 数字图像处理DCT矩阵分块变换matlab程序
  • DCT变换

    千次阅读 2019-09-26 10:41:01
    DCT变换 1.DCT变换公式及其性质 傅里叶变换表明,任何信号都能表示为多个不同振幅和频率的正弦或者余弦信号的叠加。如果采用的是余弦函数,则信号分解过程称为余弦变换;若输入信号是离散的,则称之为离散余弦变换...
  • DCT变换(离散余弦变换)的矩阵乘法实现(64×64维)
  • DCT 变换变换

    2014-10-11 10:41:13
    对4*4矩阵进行DCT变换 反变换 其中对变换后的数据进行取整 对比了取整后反变换回来的矩阵与原始矩阵的MSE和PSNR
  • DCT变换及matlab实现

    万次阅读 2014-02-20 20:33:14
    其中c(u)是加上去一个系数,为了能使DCT变换矩阵成为正交矩阵,在后面二维变换将看到他的作用。N是f(x)的总数。相比其他几种形式,他的运算还是比较简单的,因此也用的比较广。 clc clear in=1:8; N=8; for i=0:N-1...
  • matlab实现图像DCT变换

    万次阅读 2017-01-12 13:08:06
    利用matlab,将road.tif彩色图像的分辨率转换为256*256,将图片转化为double数据类型,再利用T=dctmtx(8)建立一个8*8的DCT变换矩阵。将图像I划分为多个8*8的图像块B,对每一个图像块B进行DCT变换(D=T*B*T’),接着...
  • DCT变换,量化。
  • dct变换matlab

    2018-04-21 21:16:28
    matlab中DCT变换 使用矩阵进行算法的研究。弄这个是为了赚积分,我觉得VIP太贵了
  • dct变换

    千次阅读 2015-12-22 21:49:59
    写这篇文章的目的主要是为了给x264打好基础,x264用的是整数DCT变换,所以就先来说说DCT变换吧。 DCT(Discrete Cosine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩。经过DCT变换...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,851
精华内容 1,940
关键字:

dct变换矩阵