wordpress建好本地站怎么上传,广州建设专修学院,wordpress蒸汽波主题,正规网站建设推荐转自#xff1a;http://blog.csdn.net/ahafg/article/details/48808443DCT变换DCT又称离散余弦变换#xff0c;是一种块变换方式#xff0c;只使用余弦函数来表达信号#xff0c;与傅里叶变换紧密相关。常用于图像数据的压缩#xff0c;通过将图像分成大小相等(一般为8*8)…转自http://blog.csdn.net/ahafg/article/details/48808443DCT变换DCT又称离散余弦变换是一种块变换方式只使用余弦函数来表达信号与傅里叶变换紧密相关。常用于图像数据的压缩通过将图像分成大小相等(一般为8*8)的块利用DCT对其进行变换得到更加简洁的数据。因为图像像素间存在较大的空间相关性DCT可以大大减小这些相关性使图像能量集中在左上角区域从而利于数据压缩。变换后得到的数据称为DCT系数。这一过程是无损的。二维DCT变换这里来看看二维DCT变换的公式c(u)和c(v)为添加的系数主要作用为使DCT变换矩阵为正交矩阵。F(u,v)即为DCT变换系数可以通过矩阵形式来表示A即为正交矩阵通过F和A逆变换即可恢复图像数据。下面通过一个例子来说明1234567891011121314151617clear;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:3for j 0:3if i 0a sqrt(1/4);elsea sqrt(2/4);endA(i1,j1) a*cos((j0.5)*pi*i/4)endendD A*I*A; %DCT变换D1 dct2(I); %matlab DCT函数进行DCT变换D2 A*D*A; %DCT逆变换由结果可以看出DD1方式得到的DCT系数相同说明矩阵形式的DCT变换公式是正确的D2的数据与原数据I相同实现了数据恢复。另外通过运行函数dctmtx(4)可以发现得到的变换矩阵与A完全相同。Matlab 函数实现matlab实现离散余弦变换有两种方法一种为函数dct2( ), 使用函数dct2该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。另一种为函数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( ); 代码如下12345I imread(1_1.jpg);%输入灰度图像D dct2(I); %DCT变换D1 idct2(D); %逆变换subplot(1,2,1);imshow(I);subplot(1,2,2);imshow(uint8(D1));在这里可以通过函数colormap查看变换系数D。利用不同灰度值可以发现D中主要数据都分布在左上角。123imshow(log(abs(D)),[]);colormap(gray(8));colorbar;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’ 。下面为应用例子12345678910111213141516171819202122232425262728293031323334353637383940I 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 01 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0];mask2[1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0];mask3[1 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 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);上面代码中通过求得图像DCT系数利用mask等矩阵对其进行量化保留左上角主要的系数值对于右下角的值由于其为非常小的高频系数量化去除后对于图像的质量影响不大可以利用这一性质对图像进行压缩处理。保留系数越多则图像压缩质量越好下面比较几幅图像质量从左到右分别为原图mask1mask2mask3可以看到系数保留越少则图像质量越差。DCT变换这次就讲到这了。