精华内容
下载资源
问答
  • Matlab DCT详解

    万次阅读 2017-12-01 08:47:47
    DCT变换 ...DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变换紧密相关。常用于图像数据的压缩,通过将图像分成大小相等...因为图像像素间存在较大的空间相关性,DCT可以大大减小

    转自:http://blog.csdn.net/ahafg/article/details/48808443


    DCT变换

    DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变换紧密相关。常用于图像数据的压缩,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。因为图像像素间存在较大的空间相关性,DCT可以大大减小这些相关性,使图像能量集中在左上角区域,从而利于数据压缩。变换后得到的数据称为DCT系数。这一过程是无损的。

    二维DCT变换

    这里来看看二维DCT变换的公式:

    这里写图片描述

    c(u)和c(v)为添加的系数,主要作用为使DCT变换矩阵为正交矩阵。F(u,v)即为DCT变换系数,可以通过矩阵形式来表示:

    这里写图片描述

    A即为正交矩阵,通过F和A逆变换即可恢复图像数据。

    下面通过一个例子来说明:

    clear;
    clc;
    I = [12,23,53,16;42,16,68,45;34,62,73,26;72,15,34,28];  %数据块
    A = zeros(4);   %变换矩阵A,也可以通过函数dctmtx(n)求得
    for i = 0:3
        for j = 0:3
            if i == 0
                a = sqrt(1/4);
            else
                a = sqrt(2/4);
            end
            A(i+1,j+1) = a*cos((j+0.5)*pi*i/4)
        end
    end
    D = A*I*A';     %DCT变换
    D1 = dct2(I);   %matlab DCT函数进行DCT变换
    D2 = A'*D*A;    %DCT逆变换
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里写图片描述

    由结果可以看出,D,D1方式得到的DCT系数相同,说明矩阵形式的DCT变换公式是正确的,D2的数据与原数据I相同,实现了数据恢复。

    另外通过运行函数dctmtx(4)可以发现得到的变换矩阵与A完全相同。

    Matlab 函数实现

    matlab实现离散余弦变换有两种方法:

    1. 一种为函数dct2( ), 使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。
    2. 另一种为函数dctmtx( ), 使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16)。

    1. 函数:dct2( )

    实现图像的二维离散余弦变换。调用格式为: 
    B = dct2(A) 
    B = dct2(A,[M N]) 
    B = dct2(A,M,N) 
    式中A表示要变换的图像,M和N是可选参数,表示填充后的图像矩阵大小,B表示变换后得到的图像矩阵。其逆变换函数为idct2( ); 
    代码如下:

    I = imread('1_1.jpg');%输入灰度图像
    D = dct2(I);          %DCT变换
    D1 = idct2(D);        %逆变换
    subplot(1,2,1);imshow(I);
    subplot(1,2,2);imshow(uint8(D1));
     
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里可以通过函数colormap查看变换系数D。利用不同灰度值,可以发现D中主要数据都分布在左上角。

    imshow(log(abs(D)),[]);
    colormap(gray(8));colorbar;
    
     
    • 1
    • 2
    • 3

    2. 函数:dctmtx( )

    D = dctmtx(N) 
    式中D是返回N×N的DCT变换矩阵,如果矩阵A是N×N方阵,则A的DCT变换可用D×A×D’来计算。这在有时比dct2计算快,特别是对于A很大的情况。上面有提到过。

    对于图像的DCT变换,这里还需用到一个函数blkproc( ),其功能为对图像分块进行DCT变换。 
    blkproc( )定义如下: 
    B = blkproc(A,[M N],Fun) ,A为输入图像,M*N为块大小,Fun为处理函数 
    常用的方式为: 
    B = blkproc(A,[8,8],’P1*x*P2’,T,T’); T为变换矩阵,P1和P2为参数,代表T*x*T’ 。

    下面为应用例子:

    I = imread('1_1.jpg'); %输入灰度图像
    I = im2double(I);
    D = dctmtx(8);
    C = blkproc(I,[8,8],'P1*x*P2',D,D');  %D'为D的转置
    mask1=[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
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0];
    mask2=[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];
    mask3=[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
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0];
    
    X = blkproc(C,[8,8],'P1.*x',mask1);  %保留15个系数
    I1  = blkproc(X,[8,8],'P1*x*P2',D',D);    %重构图像
    X2 = blkproc(C,[8,8],'P1.*x',mask2);  %保留10个系数
    I2  = blkproc(X2,[8,8],'P1*x*P2',D',D);    %重构图像
    X3 = blkproc(C,[8,8],'P1.*x',mask3);   %保留3个系数
    I3  = blkproc(X3,[8,8],'P1*x*P2',D',D);    %重构图像
    subplot(2,4,1);imshow(I);
    subplot(2,4,2);imshow(I1);
    subplot(2,4,3);imshow(I2);
    subplot(2,4,4);imshow(I3);
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    上面代码中,通过求得图像DCT系数,利用mask等矩阵对其进行量化,保留左上角主要的系数值,对于右下角的值由于其为非常小的高频系数,量化去除后对于图像的质量影响不大,可以利用这一性质对图像进行压缩处理。

    保留系数越多则图像压缩质量越好,下面比较几幅图像质量,从左到右分别为原图,mask1,mask2,mask3;

    这里写图片描述

    可以看到系数保留越少,则图像质量越差。


    DCT变换这次就讲到这了。


    展开全文
  • 1 DCT算法: DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实...

    一、DCT图像无损压缩简介

    1 图像压缩
    图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类。无损压缩是指不损失图像质量的压缩,它是对文件的存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容。一般来说,由于无损压缩只是删除了图像数据中的冗余信息,可以准确地恢复原始图像,所以不可能达到很高的压缩比。有损压缩是指损失图像质量的压缩,它将不相干的信息也删除了,因此解压时只能将原始图像进行近似的还原,它的高压缩比是以牺牲图像质量为代价的。

    2 JPRG图像压缩
    JPEG 提出的 JPEG 标准是为连续色调图像的压缩提供的公共标准。连续色调图像并不局限于单色调( 黑白) 图像,该标准可适用于各种多媒体存储和通信应用所使用的灰度图像、摄影图像及静止视频压缩文件。
    JPEG 标准还提出:
    ①必须将图像质量控制在可视保真度高的范围内,同时编码器可被参数化,允许设置压缩或质量水平
    ②压缩标准可以应用于任何一类连续色调数字图像,并不应受到维数、颜色、画面尺寸、内容和色调的限制
    ③压缩标准必须从完全无损到有损范围内可选,以适应不同的存储 CPU 和显示要求

    图像压缩编码方法从压缩编码算法原理上可以分为无损压缩编码、有损压缩编码、混合编码方法。而JPEG 标准就是一种混合编码方法,既有无损的压缩编码又有有损的压缩编码。有损压缩方法是以 DCT 变换为基础的压缩方法,其压缩率比较高,是JPEG 标准的基础。无损压缩方法又称预测压缩方法,是以二维 DPCM 为基础的压缩方式,解码后能完全精确地恢复原图像采样值,其压缩比低于有损压缩方法。

    观察下图中的编码器负责降低输入图像的编码、像素间和心理视觉冗余。在编码处理的第一阶段,离散余弦变换器将输入图像变换成一种( 通常不可见的) 格式,以便减少像素间的冗余。在第二阶段,量化器根据预定义的保真度准则来减少映射变换器输出的精确性,以便试图去除心理视觉冗余数据。这种操作是不可逆的,当进行无损压缩时,则必须将其忽略。在第三个即最后一个处理阶段,熵编码器根据所用的码字对量化器输出和离散余弦变换输出创建码字( 减少编码冗余)。
    在这里插入图片描述

    3 二维离散余弦变换
    离散余弦变换(Discrete Cosine Transform),简称DCT变换.是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换.余弦变换实际上是傅立叶变换的实数部分,其主要用于图像的压缩,目前国际压缩标准的JPEG格式中就用到了DCT变换。
    在编码过程中,首先将输入图像颜色空间转换后分解为8× 8大小的数据块,然后用正向二维DCT把每个块转变成64个DCT系数值,其中1个数值是直流(DC)系数,即8× 8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,形成压缩后的图像格式。在解码过程中,先对已编码的量化的DCT系数进行解码,然后使用二维DCT反变换求逆量化并把DCT系数转化为8× 8样本像块,最后将操作完成后的块组合成一个单一的图像。这样就完成了图像的压缩和解压过程.研究表明,DCT将8× 8图像块变换为频域时数值集中在左上角,即低频分量都集中在左上角,高频分量分布在右下脚。而低频部分包含了图像大部分信息,相比之下,高频部分包含的信息量较少。为了压缩数据,往往采用忽略高频系数的办法。而较低频系数的修改对原始数据的影响较小。基于DCT的压缩编码属于有损压缩,通过去除图像本身的冗余量和人的视觉冗余量来达到压缩数据的目的,主要分为以下几个步骤:
    (1)正向离散余弦变换
    (2)量化
    (3)Z字形编码
    (4)使用差分脉冲编码调制对直流系数进行编码
    (5)使用行程长度编码对交流系数进行编码
    (6)熵编码
    (7)组成位数据流

    4 二维DCT变换
    二维离散余弦变换的正变换公式为:
    在这里插入图片描述
    在图像的压缩编码中,N一般取8。
    二维DCT的反变换公式为:
    在这里插入图片描述
    以上各式中的系数:
    在这里插入图片描述
    5 Matlab调试
    根据JPEG 压缩编码算法,要将一幅灰度图像进行压缩编码,首先把图像分成 8* 8 的像素块,分块进行 DCT 变换后,根据 JPEG 标准量化表对变换系数进行量化,再对直流系数( DC) 进行预测编码,对交流系数( AC) 行 zigzag 扫描和可变长编码,然后根据标准的 Huffman 码表进行熵编码,输出压缩图像的比特序列,实现了图像的压缩。
    DCT 变换的特点是变换后图像大部分能量集中在左上角,因为左上角反应原图像低频部分数据,右下角反应原图像高频部分数据,而图像的能量通常集中在低频部分。因此 DCT 变换后,只保留 DCT 系数矩阵最左上角的 10 个系数,然后对每个图像块利用这 10个系数进行 DCT 反变换来重构图像。
    其基于 DCT 变换矩阵算法的处理过程如下图:
    在这里插入图片描述

    二、部分源代码

    % Main function of the final project
    close all;
    clear all;
    
    % Read the original images to the matrix orig_image;
    clear orig_image;
    clear temp_image;
    temp_image = imread('image1.bmp');
    orig_image(:,:,:,1) = double(temp_image(:,:,:,1));
    clear temp_image;
    temp_image = imread('image2.bmp');
    orig_image(:,:,:,2) = double(temp_image(:,:,:,1));
    clear temp_image;
    temp_image = imread('image3.bmp');
    orig_image(:,:,:,3) = double(temp_image(:,:,:,1));
    clear temp_image;
    temp_image = imread('image4.bmp');
    orig_image(:,:,:,4) = double(temp_image(:,:,:,1));
    
    % Image compression
    % You are required to implement this part
    % Note: The components of comp_image should be integers
    starttime = cputime;
    clear comp_image;
    comp_image = Compress(orig_image);
    size(comp_image)
    
    % Image decompression
    % You are required to implement this part
    % Note: The components of reco_image shoud be integers
    %       The size of the reco_image should be same with the orig_image
    clear reco_image;
    reco_image = Decompress(comp_image);
    runtime = cputime - starttime;
    
    
    % Check the size of the recovered image
    clear sizevector1;
    clear sizevector2;
    sizevector1 = size(orig_image);
    sizevector2 = size(reco_image);
    if sizevector1==sizevector2
        
        % Calculate the compression ratio
        comp_image = double(comp_image);
        comp_ratio = Compratio(orig_image, round(comp_image));
        % Calculate the distortion of the recovered images using Mean Square Error
        reco_image = double(reco_image);
        MSE = CalMSE(orig_image, round(reco_image));
        % Display the original image and recovered image
        figure(1);
        subplot(2,2,1);
        clear disp_image;
        disp_image = orig_image(:,:,:,1);
        imdisplay(disp_image);
        title('Original Image 1');
        subplot(2,2,2);
        clear disp_image;
        disp_image = reco_image(:,:,:,1);
        imdisplay(disp_image);
        title('Recovered Image 1');
        subplot(2,2,3);
        clear disp_image;
        disp_image = orig_image(:,:,:,2);
        imdisplay(disp_image);
        title('Original Image 2');
        subplot(2,2,4);
        clear disp_image;
        disp_image = reco_image(:,:,:,2);
        imdisplay(disp_image);
        title('Recovered Image 2');
        
        figure(2);
        subplot(2,2,1);
        clear disp_image;
        disp_image = orig_image(:,:,:,3);
        imdisplay(disp_image);
        title('Original Image 3');
        subplot(2,2,2);
        clear disp_image;
        disp_image = reco_image(:,:,:,3);
        imdisplay(disp_image);
        title('Recovered Image 3');
        subplot(2,2,3);
        clear disp_image;
        disp_image = orig_image(:,:,:,4);
        imdisplay(disp_image);
        title('Original Image 4');
        subplot(2,2,4);
        clear disp_image;
        disp_image = reco_image(:,:,:,4);
        imdisplay(disp_image);
        title('Recovered Image 4');
        % Calculate the compression ratio 
    % between the original images and the compressed images;
    function comp_ratio = Compratio(orig_image, comp_image)
    
    % Calculate how many bits should be used to represented the original images
    % and store it in the variable B0
    clear tempmatr1;
    tempmatr1 = ceil(log2(orig_image+1));
    clear sizevector1;
    sizevector1 = size(orig_image);
    [rownum, colnum] = size(sizevector1);
    while colnum >1
        clear tempmatr2;
        tempmatr2 = sum(tempmatr1);
        clear tempmatr1;
        tempmatr1 = tempmatr2;
        colnum = colnum -1;
    end
    B0 = sum(tempmatr1);
    
    % Calculate how many bits should be used to represented the compressed images
    % and store it in the variable B1
    clear tempvec1;
    tempvec1 = find(comp_image<0);
    clear tempmatr1;
    if sum(tempvec1) == 0
        tempmatr1 = ceil(log2(comp_image+1));
    else
        tempmatr1 = ceil(log2(abs(comp_image)+1))+1;
    end
    clear sizevector1;
    sizevector1 = size(comp_image);
    [rownum, colnum] = size(sizevector1);
    while colnum >1
        clear tempmatr2;
        tempmatr2 = sum(tempmatr1);
        clear tempmatr1;
        tempmatr1 = tempmatr2;
        colnum = colnum -1;
    end
    B1 = sum(tempmatr1);
    comp_ratio = B0/B1;
    
    

    三、运行结果

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

    四、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
    [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
    [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
    [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

    展开全文
  • 摘要 摘要 随着科学技术的发展,图像压缩技术越来越引起人们的关注为此从众 多的图像压缩编码标准中选取了基于 DCT 变换的 JPEG 图像压缩编码算法 进行研究并通过对比分析各种软件特性选取了 MATLAB 进行实验仿真 ...
  • 交互式原理与应用的实际操作。本文件采用Matlab的代码进行操作。实现了DCT变换。 中间的Huffman编码略有精简
  • MATLAB中的DCT实现

    千次阅读 2019-01-09 14:12:55
    下面来介绍一下DCT的基本原理和其在MATLAB中的实现方法,具体如下: 离散余弦变换(DCT )是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。离散余弦变换...

    下面来介绍一下DCT的基本原理和其在MATLAB中的实现方法,具体如下:

    离散余弦变换(DCT )是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的(因为一个实偶函数的傅里叶变换仍然是一个实偶函数),在有些变形里面需要将输入或者输出的位置移动半个单位(DCT有8种标准类型,其中4种是常见的)。离散余弦变换的第二种类型,经常被信号处理和图像处理使用,用于对信号和图像(包括静止图像和运动图像)进行有损数据压缩。这是由于离散余弦变换具有很强的"能量集中"特性:大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分,而且当信号具有接近马尔科夫过程(Markov processes)的统计特性时,离散余弦变换的去相关性接近于K-L变换(Karhunen-Loève 变换--它具有最优的去相关性)的性能。

    1、打开MATLAB,在其主界面的编辑器中写入下列代码:

    clear                             %清除工作区间
    RGB=imread('G:\MATLAB\bm.bmp');   %加载图片
    GRAY=rgb2gray(RGB);               %彩色转灰度图
    figure,imshow(GRAY);               %显示灰度图
    D=dct2(GRAY);                     %进行dct变换
    figure,imshow(log(abs(D)),[ ]);   %显示变换过程
    colormap(gray(4));colorbar;
    D(abs(D)<0.1)=0;
    I=idct2(D)/255;                   %设置限值
    figure,imshow(I)                %显示变换后的图

    2、保存代码至自定义路径下,点击运行,结果如下:

     

     

    可以看出,经过离散余弦变换后,相比于原图来说,有了一定程度上的滤波效果,也说明了DCT有一定的能量压缩特性,对于图片来说就是像素值的压缩,至此基本介绍完毕,请大家继续关注!!

    展开全文
  • 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变化及量化

    一、问题描述

    利用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函数。

    附资源链接:点我

    展开全文
  • MatlabDCT变换在信号压缩中的应用.pdf
  • DCT变换、DCT反变换、分块DCT变换 欢迎转载,但请注明出处!转:http://www.tuicool.com/articles/nUfmAf2 一、引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够...
  • **DCT离散余弦变换实现数字水印算法 在进行水印嵌入时,先对水印用了Arnold变换 包含了几种不同的水印攻击: 白噪声 部分剪切 小波压缩 几何旋转 计算图像的峰值信噪比 计算归一化相关系数的函数** ...
  • 2D 离散余弦变换 (2D-DCT) 是众所周知且广泛使用的图像压缩算法。 jpeg 压缩背后的所有逻辑都基于 DCT。 我们还可以在视频等 3D 矩阵上实现 DCT。 在那个项目中,我们重新实现了论文的某些部分,该部分是关于 3D DCT...
  • 基于MATLABDCT变换及其在图像压缩中的应用.pdf
  • 二维DCT变换在JPEG图像压缩中的应用及其MATLAB实现.pdf
  • Matlab函数——dct2

    万次阅读 2013-10-18 22:58:38
    dct2 二维离散余弦变换 语法 B=dct2(A) B=dct2(A,m,n) B=dct2(A,[m,n]) 描述 B=dct2(A)返回A的二维离散余弦变换。矩阵B和A的大小一样,并包含离散余弦变换系数 B=dct2(A,m,n)是在变换以前用0对矩阵A...
  • 基于matlabdct_jpeg压缩算法程序,权威函数包,质量不错
  • DCT变换 DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变换紧密相关。常用于图像数据的压缩,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。...
  • CANoe-Matlab联合仿真在DCT总线控制中的应用.pdf
  • 随着数字水印技术的发展,数字水印的应用领域也得到了扩展,数字水印的基本应用领域是版权保护、隐藏标识、认证和安全不可见通信。 当数字水印应用于版权保护时,潜在的应用市场在于电子商务、在线或离线地分发...
  • dct变换matlab程序

    2013-06-27 14:06:55
    信息压缩课程设计里的dct和idct在图像压缩里的应用matlab程序
  • 代码来源:《数字图像处理高级应用》- 清华大学出版社 资源内容:1. Matlab代码,并带有中文注释 2. 测试图片
  • 介绍了JPEG图像压缩算法,并在MATLAB数学分析工具环境下从实验角度出发,较为直观地探讨了DCT在JPEG图像压缩中的应用。仿真实验表明,用MATLAB来实现离散余弦变换的图像压缩,具有方法简单、速度快、误差小的优点,...
  • DCT反变换: 在图像的接收端,根据DCT变化的可逆性,我们可以通过DCT反变换恢复出原始的图像信息,其公式如下: 同样的道理, 利用之前的矩阵运算公司可以推导出DCT反变换相应的矩阵形式: 继续用matlab来仿真这个...
  • DCT JPEG图像压缩
  • 一、DCT图像无损压缩简介 1 图像压缩 图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类。无损压缩是指不损失图像质量的压缩,它是对文件的存储方式进行优化...
  • 1 简介 随着计算机网络的迅猛发展,信息安全越来越受关注.信息隐藏技术是一种重要...在水印加密的基础上,本文又提出一种基于DCT的水印嵌入算法,该算法以二值图像为水印,水印嵌入前对水印进行信息扩大映射,增加了嵌...
  • 一、离散小波变换的音频信号数字水印技术简介 0 引言 近年来, 数字水印技术的作用越来越重要。数字水印技术是将一些标识信息直接嵌入数字载体当中, 或间接表示在信号载体中, 且不影响原...若利用数字水印的特性, 应用
  • 整车驾驶性开发中,整车...本文针对某DCT车型抱怨的M1挡抖动问题,首先通过整车测试采集相关数据,其次借助MATLAB软件,应用时频分析的阶次跟踪技术进行问题分析,并通过MATLAB滤波设计工具进行优化,最后抖动问题显著改善。
  • 介绍JPEG图像压缩算法,并在MATLAB数学分析工具环境下从实验角度出发,较为直观地探讨了DCT在JPEG图像压缩中的应用。仿真实验表明,用MATLAB来实现离散余弦变换的图像压缩,具有方法简单、速度快、误差小的优点,...
  • 随着数字技术和互联网的发展,很多艺术...DCT变换全称为离散余弦变换,可将空间域上的图像变换到频率域上,在图像的DCT系数上嵌入水印信息具有诸多优势,它不仅兼容有损JEPG压缩,而且编码效率也很高,鲁棒性也较强。

空空如也

空空如也

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

matlabdct的应用

matlab 订阅