精华内容
下载资源
问答
  • C语言实现DCT变化

    2014-12-20 18:57:15
    用C语言实现DCT变化,VS2010环境 直接可以运行
  • 图像的DCT变化及量化

    2018-11-01 00:40:40
    图像的DCT变化及量化,利用MATLAB程序能够实现简单的图像分块,DCT变换和量化操作。
  • 基于DCT变换的图片水印加密技术源码文件,下载即可使用。适用软件:matlab
  • java下的dct变化的实现

    2014-06-08 13:27:34
    java下对dct离散余弦变化的实现,曾在信息隐藏中实现过,自己写的 !
  • DCT变化pdf英文资料

    2010-10-25 15:57:51
    DCT变换一书的英文原版,本书对深入理解DCT变换油很大帮助
  • 针对给定的静止图像进行DCT变换,可以按照两种方式选取系数: 1)将DCT系数矩阵中值小于给定阈值的元素置为0; 2)将一个数据块中某些位置的值置为0; 将DCT系数进行(二)中的操作,再进行DCT反变换 自己设定3种不同...
  • 多媒体技术原理应用于MATLAB的DCT变化代码示例
  • 1、DCT变化 2、DCT中频: 中频指DCT变化后从左上到右下的线经过点 3、代码实现 %------------------------------------------------------------------% % 基于DCT变换的信息隐藏(数字水印) %% %%

    1、DCT变化
    在这里插入图片描述
    2、DCT中频:
    中频指DCT变化后从左上到右下的线经过点

    3、代码实现

    %------------------------------------------------------------------%
    %     基于DCT变换的信息隐藏(数字水印)     %%                                                                %%                                                                %
    %-----------------------------------------------------------=------%
    clear ;
    clc;
    
    %-----------------------读入图像-------------------------------------%
    markbefore=imread('lena.bmp');
    markbefore=imresize(markbefore,[100,100],'nearest'); 
    markbefore2=rgb2gray(markbefore);
    mark=im2bw(markbefore2);    %使水印图像变为二值图
    figure(1);      %打开窗口
    subplot(2,3,1);    %该窗口内的图像可以有两行三列
    imshow(mark),title('水印图像');   %显示水印图像
    [rm,cm]=size(mark);   %计算水印图像的长宽
     
    cover_image=imread('embedding_result.png');
    cover_image=rgb2gray(cover_image);
    subplot(2,3,2),imshow(cover_image,[]),title('载体图像'); %[]表示显示时灰度范围为image上的灰度最小值到最大值
     
    before=blkproc(cover_image,[8 8],'dct2');   %将载体图像的灰度层分为8×8的小块,每一块内做二维DCT变换,结果记入矩阵before
     
    I=mark;
    alpha=5;     %尺度因子,控制水印添加的强度,决定了频域系数被修改的幅度
    
    after=before;   %初始化载入水印的结果矩阵
    for i=1:rm          %在中频段嵌入水印
        for j=1:cm
            x=(i-1)*8;
            y=(j-1)*8;
            if mark(i,j)==1
                k=1;
            else
                k=-1;
            end
            after(x+1,y+8)=before(x+1,y+8)*(1+alpha*k);
            after(x+2,y+7)=before(x+2,y+7)*(1+alpha*k);
            after(x+3,y+6)=before(x+3,y+6)*(1+alpha*k);
            after(x+4,y+5)=before(x+4,y+5)*(1+alpha*k);
            after(x+5,y+4)=before(x+5,y+4)*(1+alpha*k);
            after(x+6,y+3)=before(x+6,y+3)*(1+alpha*k);
            after(x+7,y+2)=before(x+7,y+2)*(1+alpha*k);
            after(x+8,y+1)=before(x+8,y+1)*(1+alpha*k);
        end
    end
    result=blkproc(after,[8, 8],'idct2');    %将经处理的图像分为8×8的小块,每一块内做二维DCT逆变换
    result = uint8(result);
    imwrite(result,'markresule.bmp','bmp');      %存储添加水印后的图像
    subplot(2,3,3),imshow(result,[]),title('嵌入水印的图像');    %显示添加水印后的图像
    
    %------------------------水印提取-----------------------------%
    %
    %src=imread('embedding_result.png');
    %src=rgb2gray(src);
    %srcs=blkproc(src,[8,8],'dct2');
    srcs=before;
    after_2=blkproc(result,[8,8],'dct2');   %此步开始提取水印,将灰度层分块进行DCT变换
    p=zeros(1,8);        %初始化提取数值用的矩阵
    mark_2 = zeros(rm,cm);
    for i=1:rm
        for j=1:cm
            x=(i-1)*8;y=(j-1)*8;
            p(1)=(after_2(x+1,y+8)/srcs(x+1,y+8));         %将之前改变过数值的点的数值提取出来
            p(2)=(after_2(x+2,y+7)/srcs(x+2,y+7));
            p(3)=(after_2(x+3,y+6)/srcs(x+3,y+6));
            p(4)=(after_2(x+4,y+5)/srcs(x+4,y+5));
            p(5)=(after_2(x+5,y+4)/srcs(x+5,y+4));
            p(6)=(after_2(x+6,y+3)/srcs(x+6,y+3));
            p(7)=(after_2(x+7,y+2)/srcs(x+7,y+2));
            p(8)=(after_2(x+8,y+1)/srcs(x+8,y+1));
            f=((sum(p))/8-1)/alpha;
            if f>0  %corr2计算两个矩阵的相似度,越接近1相似度越大
                mark_2(i,j)=1;              %比较提取出来的数值与随机频率k1和k2的相似度,还原水印图样
            else
                mark_2(i,j)=0;
            end
        end
    end
    subplot(2,3,5);
    mark_2 = uint8(mark_2);
    imshow(mark_2,[]),title('提取出的水印');
    subplot(2,3,6);
    imshow(mark),title('原嵌入水印');
    NC=correlation(mark_2,mark);  
    disp('原水印图像与提取水印图像互相关系数:')
    disp(NC);
    
    function N=correlation(mark_get,mark_prime) 
    mark_get=double(mark_get); 
    mark_prime=double(mark_prime); 
    if size(mark_get)~=size(mark_prime) 
        error('Input vectors must  be the same size!') 
    else 
        [m,n]=size(mark_get); 
        fenzi=0; 
        fenmu=0; 
        for i=1:m 
            for j=1:n 
                fenzi=fenzi+mark_get(i,j)*mark_prime(i,j); 
                fenmu=fenmu+mark_prime(i,j)*mark_prime(i,j); 
            end 
        end 
    N=min(fenzi/fenmu,fenmu/fenzi); 
    end
    end
    

    实验效果
    1、用图

    嵌入图像
    在这里插入图片描述

    载体图像
    在这里插入图片描述
    实验结果
    在这里插入图片描述
    原水印图像与提取水印图像互相关系数:
    0.9024

    展开全文
  • matlab dct 数字水印

    2008-12-18 22:07:56
    基于matlab以及dct变化方法编写的数字水印算法,比较适合初学者,可以作为大家的参考,欢迎下载
  • 分析得出改变采样序列离散余弦变换(Discrete CosineTransform,DCT)域某个交流系数时,逆DCT后幅值变化服从余弦曲线,改变离散小波变换(Discrete Wavelet Transform,DWT)域某个近似系数时,重构后采样序列幅值变化呈现为...
  • VC实现DCT变换,读入一幅图像并进行DCT变化,MFC实现
  • 自己编写的一个DCT变化的代码,通过对一个矩阵的DCT变换,来详细了解DCT的原理。
  • 视频DCT变换与量化

    2021-03-19 00:29:45
    一、变换域编码——整数DCT \quad将空间域描述的图像,经过某种变换后得到变换域中的数据,达到改变数据分布形式、减少有效数据量的目的。 \quad变换包含DCT(离散余弦变换)、DST(离散...\quadH.264采用整数DCT变化

    一、变换域编码——整数DCT
    \quad将空间域描述的图像,经过某种变换后得到变换域中的数据,达到改变数据分布形式、减少有效数据量的目的。
    \quad变换包含DCT(离散余弦变换)、DST(离散正弦变换)等,这里我们主要讨论DCT。在图像视频压缩中采用的变换都是正交变换,因为正交变换不改变信源熵值,完全可以通过反变换重建原图,且压缩程度高。变换的好处在于使得数据分布发生改变,变换系数向低频方向集中,利于编码。
    \quad采用DCT变换的图像、视频压缩基本框架如下:

    \quadH.264采用整数DCT变化,主要目的有两个:1. 采用整数,提高运算速度 2. 将归一化和量化整合在一起,减少乘运算。变换方程为F c = C ⋅ f ⋅ C T F_c=C \cdot f \cdot C^TF 
    c
    ​    
     =C⋅f⋅C 
    T
     ,,变换矩阵C,第 u 行,第 x 列元素表示为:

    在N=4时,即4x4图像块的DCT变换为:

    其中,


    二、数据扫描
    “之”字扫描(Zig-Zag) — 逐行扫描顺序


    “之”字扫描(Zig-Zag) — 场扫描顺序


    三、量化
    \quad量化是指将信号的连续取值(或大量可能的离散取值)映射为有限多个离散值的过程,实现信号取值多对一的映射。在视频/图像编码中,残差信号经过DCT后,变换系数往往具有较大的动态范围,因此对变换系数进行量化可以有效地减小信号取值空间,获得更好的压缩效果。
    \quad量化分为两类,如下:

    标量量化:无需分析数据统计特性,复杂度低,但平均量化误差大。被主流的图像、视频编码标准所采用;
    矢量量化:基于数据统计属性的量化器,平均量化误差低,但不容易实现。
    \quad对于位于某个区间的值x,都用一个定值代替。即y = Q ( x ) = y k , x ∈ [ x k , x k + 1 ) y=Q(x)=y_k, x \in [x_k, x_{k+1})y=Q(x)=y 
    k
    ​    
     ,x∈[x 
    k
    ​    
     ,x 
    k+1
    ​    
     )。假定量化的级别,即重建值的个数为L,则表示这些量化索引所用的最多平均比特数为l o g 2 L log_2 Llog 
    2
    ​    
     L。
    均匀量化
    均匀量化的特点是在整个量化范围内,各个量化间隔都相等;
    若信号X的取值范围为[a, b],量化级别为L,则每个量化间隔的大小为Δ = b − a L \Delta = \frac{b-a}{L}Δ= 
    L
    b−a
    ​    
     
    均匀量化的量化误差q的取值范围为− Δ / 2 ≤ q ≤ Δ / 2 -\Delta /2 \le q \le \Delta /2−Δ/2≤q≤Δ/2,q在[ − Δ / 2 , Δ / 2 ] [-\Delta /2, \Delta /2][−Δ/2,Δ/2]服从均匀分布,故而量化误差的方差为σ q = 1 Δ ∫ − Δ / 2 Δ / 2 q 2 d q = Δ 2 12 σ_q = \frac{1}{\Delta} \int_{-\Delta /2}^{\Delta /2} q^2 dq=\frac{\Delta ^2}{12}σ 
    q
    ​    
     = 
    Δ
    1
    ​    
     ∫ 
    −Δ/2
    Δ/2
    ​    
     q 
    2
     dq= 
    12
    Δ 
    2
     
    ​    
     。
    最优量化
    ————————————————
    版权声明:本文为CSDN博主「程勇uestc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_40438165/article/details/89635149

    展开全文
  • FFT 傅立叶变换 DCT 离散余弦变化 DWT 离散小波变化 直接用 附带报告
  • DCT变换

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

    DCT变换

    1.DCT变换公式及其性质

    傅里叶变换表明,任何信号都能表示为多个不同振幅和频率的正弦或者余弦信号的叠加。如果采用的是余弦函数,则信号分解过程称为余弦变换;若输入信号是离散的,则称之为离散余弦变换(Discrete Cosine Transform,DCT)。数学上共存在8种类型的DCT。公式如下:

    其中,在图像视频领域中,最常用的是DCT-Ⅱ,平常说的DCT一般指的是DTC-Ⅱ。DTC-Ⅲ是 DTC-Ⅱ的反变换,一般说的反DCT指的就是DCT-Ⅲ。

    以DCT-Ⅱ公式为例,公式为:

    X(k) = \sqrt{\frac{2}{N}}\epsilon (k)\sum x(n)cos(\frac{k(2n+1 )\pi}{2N}),k=0,1,...N-1

    由公式可以看出,X(k)就是在频率k下,求序列上各点对应余弦项的累加和。当k=0时,各点的余弦项均为1,此时得到的结果X(0)正比于x(n)的和,被称为直流分量。当k>0时,得到个频率下的X(k)被称为交流分量。

    DCT变换的C++实现可以参考https://blog.csdn.net/BigDream123/article/details/104395587

    2.DCT性质

    离散余弦变换具有两点性质,第一个为可分离性,第二个为能量集中性。

    可分离性

    以DCT-Ⅱ为例,二维DCT变换表示为:

    DCT的可分离性就是可以将二维DCT拆分为两个方向的一维DCT。

     

    能量集中

    图像编码中,图像以矩阵形式存储,是一个二维数组,对图像进行二维DCT,可以将时域图像转为频域能量分布图,实现能量集中从而去除空间冗余。

    例存在矩阵:

    10 10 10 10
    10 10 10 10
    10 10 10 10
    10 10 10 10

    对其进行DCT变换后,变为:

    40.000000 0.000001 -0.000002 0.000002
    0.000001 0.000000 -0.000000 0.000000
    -0.000002 -0.000000 0.000000 -0.000000
    0.000002 0.000000 -0.000000 0.000000
    

    可见,大多数能量集中在了左上角低频处。

    图像中,低频分量可以看作是基本图像,高频分量为边缘轮廓细节信息(也可能是噪声)。绝大多数能量都包含了大量平坦区域,因此大部分能量集中于低频区域(左上角),从而可以达到去除空间冗余的目的。(其中,DCT变换尺寸越大,DCT去相关性能越好,但是DCT的计算复杂度会随之增大)。

    3.DCT基函数和基图像

    图像信息的基函数表示方法中,一般将图像I(x,y)表示成一些特征或者基函数线性叠加的形式:

                                                                            I(x,y) = \sum a_{i}(x,y)s_{i}

    其中,基函数a_{i}(x,y)可以看作是图像的基本组成成分,s_{i}表示系数,可看成是每个基函数对应的幅度,是原始图像在基函数张成的高维空间的投影系数。

    将上式可以表示为矩阵形式:

                                                                                        x=As

    这可以看作是图像的重构过程,通过一组被适当加权的基函数求和重构原图像,即从变换域到空域变换的映射。

    考虑到基函数ai(x,y)构成一个可逆线性系统,矩阵A是一个方阵,这样可以对系统求逆得到:

                                                                           s_{i} = \sum w_{i}(x,y)I(x,y)

    上式是图像的变换过程:将图像从空域映射到变换域用基函数表示,求原图像在各基函数所占的量si。

    式中Wi即为变换基。上式可以用矩阵表示:

                                                                           s = Wx

    当变换系数s的个数和原图像像素x的个数相同时,这样在变换前后的维度相同,保证变换过程中没有引入新的信息,也未破坏原有的信息,因此通过变换系数s可以无损的恢复原图像x。

    每一种变换都有其对应的基函数,各变换的不同之处,也仅是基函数不同而已。因此在分析不同变换的性能时,经常会对其基函数进行分析。

    以图像变换为例,定义原图像f(x,y),通过g(x,y,u,v)变换可以得到变换域函数F(u,v)。

                                                                          F(u,v) = \sum_{x}^{M-1} \sum_{y}^{M-1} f(x,y)g(x,y,u,v)

                                                                          f(x,y) = \sum_{u}^{M-1} \sum_{v}^{M-1} F(u,v)h(x,y,u,v)

    这里g(x,y,u,v)为正变换核,反变换核h(x,y,u,v)就是基函数。f(x,y)就等于h(x,y,u,v)以F(u,v)为权重加权求和.

    下面以DCT-Ⅱ为例,二维变换如下:

    反变换为:

    基函数如下表示:

                                                         B(m,n,k,l) = C(k)C(l)cos(\frac{(2m+1)k\pi}{2N})cos(\frac{(2n+1)l\pi}{2N})

    从反变换公式看出,x(m,n)是由NxN个频率分量组成的,每个频率分量与一个变换系数相对应。对于每个变换系数,遍历(m,n)所有值时,构成了一幅基图像。将变换系数看作权重,对基函数加权求和,就可以得到时域信号x(m,n)。因此基函数是构成时域信号的基本单元。

    N=4时基函数图像如下:(DCT变换基图像的MATLAB绘制代码https://download.csdn.net/download/BigDream123/12022161

     

     

     当k=0,l=0时,表示水平垂直分量的频率都等于0,即左上角的基图像,此时基函数B(m,n)=1/4,图像平坦,没有变化;右上角表示水平频率k最大而垂直频率为0的基图像,图像在水平方向上发生了连续变化。每个(k,l)对应的基函数图像,就是该(k,l)频率下的构成原始图像的基本单元。

    简而言之,对于离散余弦变换可以解释为:将任一4x4像素块表示为图所示的16个基图像的加权和,其权值即为对应位置的DCT系数。

    4.整数DCT变换

    自H.264中首次采用了整数DCT变换,下面以4x4DCT为例推导H.265中使用的4x4整数DCT变换。二维4x4DCT变换公式如下:

    其中,

    将上式进行变形,可以得到

    将括号中的部分记为Z(m,l),则上式可以分解为一下二式:

    可以看出,二维DCT变换可以分解为两个一维DCT,即可以先对像素块的行(或列)做一维DCT,再对像素块的列(或行)做一维DCT。现将一维DCT写成如下相乘的形式:

    其中,X表示原始像素块,Y表示变换后的DCT系数矩阵,变换矩阵A由如下定义:

    将A写成矩阵形式:

    则有

     

    对上式的a,b,c同时乘以128并整数化(四舍五入),得

    为保持正交性,即满足需对b,c进行微调

    最终的变换矩阵为

    其对应的一维修正矩阵E较为简单,其所有元素为1/128,即

    H.265/HEVC中还使用了更大尺寸的整数DCT:8x8,16x16,32x32这三种整数DCT推导方法与4x4基本相同,唯一的区别在于矩阵元素整数化时放大倍数不同。对于NxN的变换块,放大倍数为64\sqrt{N}

    5.蝶形变换

    蝶形变换的思想就是提取矩阵的相关部分,定义中间变量,减少运算次数。

    以4x4的一维DCT变换为例:

    x

    分析结果矩阵的第一列:

    Y00 = 64*X00 + 64*X10 + 64*X20 + 64*X30

    Y10 = 83*X00 + 36*X10 - 36*X20 - 83*X30

    Y20 = 64*X00 - 64*X10 - 64*X20 + 64*X30

    Y30 = 36*X00 - 83*X10 + 83*X20 - 36*X30

    可以的定义四个中间变量

    T1 = X00 + X30

    T2 = X00 - X30

    T3 = X10 + X20

    T4 = X10 - X20

    从而可以将第一列的结果转换为

    Y00 = 64*X00 + 64*X10 + 64*X20 + 64*X30 = 64 * T1 + 64 * T3

    Y10 = 83*X00 + 36*X10 - 36*X20 - 83*X30 = 83 * T2 + 36 * T4

    Y20 = 64*X00 - 64*X10 - 64*X20 + 64*X30 = 64 * T1 - 64 * T3

    Y30 = 36*X00 - 83*X10 + 83*X20 - 36*X30 = 36 * T2 - 83 * T4

    通过定义临时变量,减少了重复的计算,以此加快计算速度,这就是蝶形变换。

    VTM中的DCT变换就是使用蝶形快速算法,以DCT4x4为例:

    /** 4x4 forward transform implemented using partial butterfly structure (1D)
    *  \param src   input data (residual)
    *  \param dst   output data (transform coefficients)
    *  \param shift specifies right shift after 1D transform
    *  \param line
    */
    void fastForwardDCT2_B4(const TCoeff *src, TCoeff *dst, int shift, int line, int iSkipLine, int iSkipLine2)
    {
      int j;
      TCoeff E[2], O[2];
      TCoeff add = (shift > 0) ? (1 << (shift - 1)) : 0;
    
      const TMatrixCoeff *iT = g_trCoreDCT2P4[TRANSFORM_FORWARD][0];
    
      TCoeff *pCoef = dst;
      const int  reducedLine = line - iSkipLine;
      for (j = 0; j<reducedLine; j++)
      {
        /* E and O */
        E[0] = src[0] + src[3];
        O[0] = src[0] - src[3];
        E[1] = src[1] + src[2];
        O[1] = src[1] - src[2];
    
        dst[0] = (iT[0] * E[0] + iT[1] * E[1] + add) >> shift;
        dst[2 * line] = (iT[8] * E[0] + iT[9] * E[1] + add) >> shift;
        dst[line] = (iT[4] * O[0] + iT[5] * O[1] + add) >> shift;
        dst[3 * line] = (iT[12] * O[0] + iT[13] * O[1] + add) >> shift;
    
        src += 4;
        dst++;
      }
      if (iSkipLine)
      {
        dst = pCoef + reducedLine;
        for (j = 0; j<4; j++)
        {
          memset(dst, 0, sizeof(TCoeff)*iSkipLine);
          dst += line;
        }
      }
    }

    其中,g_trCoreDCT2P4数组定义如下

    const TMatrixCoeff g_trCoreDCT2P4[TRANSFORM_NUMBER_OF_DIRECTIONS][4][4] =
    {
      DEFINE_DCT2_P4_MATRIX(64,    83,    36),
      DEFINE_DCT2_P4_MATRIX(64,    83,    36)
    };
    #define DEFINE_DCT2_P4_MATRIX(a,b,c) \
    { \
      { a,  a,  a,  a}, \
      { b,  c, -c, -b}, \
      { a, -a, -a,  a}, \
      { c, -b,  b, -c}  \
    }

     

    展开全文
  • matlab实现图像DCT变换

    万次阅读 2017-01-12 13:08:06
    实验三 图像的DCT变化及量化 一、问题描述 利用matlab,将road.tif彩色图像的分辨率转换为256*256,将图片转化为double数据类型,再利用T=dctmtx(8)建立一个8*8的DCT变换矩阵。将图像I划分为多个8*8的图像块B,对...

    实验三 图像的DCT变化及量化

    一、问题描述

    利用matlab,将road.tif彩色图像的分辨率转换为256*256,将图片转化为double数据类型,再利用T=dctmtx(8)建立一个8*8的DCT变换矩阵。将图像I划分为多个8*8的图像块B,对每一个图像块B进行DCT变换(D=T*B*T’),接着对结果采用四种量化方案:只保留直流系数;保留直流系数和前9个交流系数;保留直流系数和前35个交流系数;保留直流系数和前53个交流系数。再对这四种方案分别进行逆DCT变化(I2=T’*D*T)。最后显示出原图像I,重构后的图像I2,和差值I-I2。

    二、问题分析

    JPEG压缩标准中,需要对图像作DCT变换,这一步能够对图片进行压缩,同时,根据量化系数的不同,压缩质量也不同。

    DCT变换,即离散余弦变换,是一种广泛应用的变换编码方法,它能够以数据无关的方式解除输入信号之间的相关性,因而应用广泛。在进行变换时,首先将图片分割为8*8的小块,分别对小块进行各自的DCT变换。变换的矩阵可调用函数dctmtx,得到余弦基函数作为变换基T。T*B*T’是变换的操作,接着对矩阵块进行量化。根据人眼对低频信号更为敏感的特性,建立合适的量化矩阵(存在广为接受的版本),接着对矩阵的每个元素进行除以对应的量化值。接着按照实验要求,对DCT系数进行遮罩,建立四个不同的遮罩矩阵,分别对左上角赋值为0,对小块的元素进行四种量化方案。这样就完成了DCT变换。进行逆变换时,直接用T’*B*T得到结果矩阵,转化为图像形式,得到最终的结果。需要注意的是,在对RGB图像进行DCT变换时,需要对三个颜色通道分别进行操作,因为DCT变换不是三维的。此外,在逆DCT变换之后,需要将每个通道的矩阵数值转化为uint8格式,再利用cat函数合并三个通道,得到重构的图像以及差值图像。

    其实,在JPEG编码格式中,将RGB转化为YUV颜色空间,再对通道进行DCT变换,而不是直接对RGB三个通道进行变换,这是因为人眼对色度的敏感度低于对灰度的敏感度。

    三、算法分析与详细设计

    DCT基的第一个系数为恒定的直流系数,其余为AC系数,按照要求构建四种遮罩矩阵:

    mask0=[1 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0

                 0 0 0 0 0 0 0 0];

     mask9=[1 1 1 1 0 0 0 0

                  1 1 1 0 0 0 0 0

                  1 1 0 0 0 0 0 0

                  1 0 0 0 0 0 0 0

                  0 0 0 0 0 0 0 0

                  0 0 0 0 0 0 0 0

                  0 0 0 0 0 0 0 0

                  0 0 0 0 0 0 0 0];

      mask35=[1 1 1 1 1 1 1 1

                     1 1 1 1 1 1 1 0

                     1 1 1 1 1 1 0 0

                     1 1 1 1 1 0 0 0

                     1 1 1 1 0 0 0 0

                     1 1 1 0 0 0 0 0

                     1 1 0 0 0 0 0 0

                     1 0 0 0 0 0 0 0];

       mask53=[1 1 1 1 1 1 1 1

                      1 1 1 1 1 1 1 1

                      1 1 1 1 1 1 1 1

                      1 1 1 1 1 1 1 1

                      1 1 1 1 1 1 1 0

                      1 1 1 1 1 1 0 0

                      1 1 1 1 1 0 0 0

                      1 1 1 1 0 0 0 0];

     

    调用彩色图像DCT变换的函数,参数为RGB图像和遮罩矩阵。

    亮度量化表可以乘以一个系数,用来控制压缩率。系数越大,压缩率越高,得到的图像质量越差。遮罩矩阵保留的AC系数越多,得到的图像质量越高。

    function [ RGB_rec,miss ] = ColorDCTtransform( RGB,mask )

    %进行彩色图像的DCT变换

    返回重构的图像

     

    %亮度量化表

    m=0.5*[ 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];

    %RGB图分层处理  得到3个分量图

    R = RGB(:,:,1);

    G = RGB(:,:,2);

    B = RGB(:,:,3);

    %转换为双精度

    IR = double(R);

    IG = double(G);

    IB = double(B);

    %建立8*8的DCT变换矩阵

    T=dctmtx(8);

    %进行DCT变换

    RR = blkproc(IR,[8,8],'P1*x*P2',T,T');

    GG = blkproc(IG,[8,8],'P1*x*P2',T,T');

    BB = blkproc(IB,[8,8],'P1*x*P2',T,T');

     

    %量化

    LR = blkproc(RR,[8 8], 'round(x./P1)',m);

    LG = blkproc(GG,[8 8], 'round(x./P1)',m);

    LB = blkproc(BB,[8 8], 'round(x./P1)',m);

    %对DCT系数进行遮罩处理

    mR=blkproc(LR,[8 8],'x.*P1.*P2',mask,m);

    mG=blkproc(LG,[8 8],'x.*P1.*P2',mask,m);

    mB=blkproc(LB,[8 8],'x.*P1.*P2',mask,m);

     

    %反DCT变化 IDCT

    YR =blkproc(mR,[8 8],'P1*x*P2',T',T);

    YG =blkproc(mG,[8 8],'P1*x*P2',T',T);

    YB =blkproc(mB,[8 8],'P1*x*P2',T',T);

     

    %转换为uint8

    YR = uint8(YR);

    YG = uint8(YG);

    YB = uint8(YB);

     

    %计算重构图像和差值

    RGB_rec =cat(3,YR,YG,YB);

    miss=RGB-RGB_rec;

     

    end

    灰度图像的处理类似,只是不需要对三个通道进行操作。

    四、实验结果分析

    实验结果如下,分别是灰度图像和彩色RGB图像的DCT变换结果,可以看到,保留的AC系数越多,得到的图像质量越好,与原图的差值越小。这是因为高频信号也进行了一定的保留,量化误差较小,因此逆DCT变换得到的图像质量也较好。图像的质量损失产生于量化过程,量化系数是根据人眼对不同亮度的敏感程度进行设计的,左上角数值小,右下角数值大,这样高频信息损失大一些,人眼很难有所察觉,低频信号损失小,对人眼观察造成的影响较小。

    灰度图像的实验结果。

    彩色图像的实验结果。

    使用第一种遮罩矩阵、也就是只保留直流系数的矩阵,量化损失最大,逆变换后得到的图像能够看到明显的锯齿,保留9个AC系数时,质量变高,但仍能看到一些锯齿。保留35个AC系数和53个AC系数得到的结果非常相似,人眼几乎看不出差别,误差图像也几乎为全黑,证明了人眼确实对高频信号敏感度很低。

    DCT变换本身不会对图片的质量造成影响,大小不会改变,但是量化的过程会给图片质量带来损失,量化矩阵的系数大小也影响着压缩率,值越大,压缩率越高,得到的图片质量也越低,相应地,图片所占的空间也较小。保留35个系数已经能够较好地还原图片,肉眼很难辨识出区别。

    五、实验总结

    通过本次实验,了解了DCT变换的基本原理和过程和量化矩阵对图片质量产生的影响,分别对灰度图和RGB图进行了DCT变换,其中彩色图像需要对三个通道分别进行变换。如果想要得到更好的效果,可以先将RGB颜色转化到YUV或YIQ空间(并进行二次采样,对亮度值全采样,其余的进行半采样),因为人眼对亮度的敏感度远高于对色度的敏感度。这也是JPEG图像压缩的原理。

    同时,除了对原理的了解,还熟悉了matlab的函数使用,能够进行简单的图像分块,调用DCT变换矩阵的函数,和对小块进行量化操作使用的blkproc函数。

    附资源链接:点我

    展开全文
  • DCT变化,系数量化,逆变换重建图像,输出MSE,PSNR以及压缩比。  三层DWT变换,输出低频高频占比 高频子带置零,并重建图像,输出PSNR值,压缩比 图像检索,包含测试用图,下载后更改路径即可使用
  • DCT变换、DCT反变换、分块DCT变换
  • DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在...
  • DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在当前的...
  • DCT变换、DCT反变换、分块DCT变换 欢迎转载,但请注明出处! 一、引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去...

空空如也

空空如也

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

dct变化