DCT变换.docx
- 文档编号:10506310
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:14
- 大小:328.03KB
DCT变换.docx
《DCT变换.docx》由会员分享,可在线阅读,更多相关《DCT变换.docx(14页珍藏版)》请在冰豆网上搜索。
DCT变换
图像DCT变换
1.绪论
生活在信息化时代的今天,每天都有大量的信息用数字进行存储、处理和传送。
这些每日往来的信息给我们带来了便利和安逸,但也给我们带来了难题,那就是信息就代表数据,大量数据应该怎样存储以及传输呢?
因为网上的许多信息是以图像形式存储的,所以对于存储和通信的需求是无限的。
而数据压缩方法比起数据的存储或传输具有更为突出的实用价值和商业意义。
上课时教员讲到:
一张分辨率为500*700的彩色图像约占1MB的内存,一张分辨率为5000*2800的彩色图像约占40MB,长度为1秒,分辨率为500*700,约为1MB*24=24MB,长度为90分钟,分辨率为500*700的彩色电影:
24MB*60秒*90分钟=129600MB=126GB,而我们知道每张图片存在多种数据冗余,如结构冗余,统计冗余,而相邻帧之间也存在很大的相似性,往往十几秒的视频里背景都一样,这种情况就可以通过压缩来获得很大的内存释放,而不会对视觉造成太大影响,学习完本门课程之后,我对图像压缩方面产生了兴趣,又由于本人在matlab编程上也有兴趣,所以通过上网查阅资料的方法,深入的学习了DCT变换方面的内容。
2.DCT变换的原理
因为上课时对DCT变换编码介绍不多,所以我通过课后上网查阅了一些资自学了DCT变换,现对我所查到的资料简单介绍。
2.1图像压缩的基本模型
图像编码包括两个阶段,前一个阶段就是利用预测模型或正交模型对图像信号进行变换;后一个阶段是利用已变换信号的统计特性,对其分配适当的代码来进行编码传输。
编码器与解码器的结构分别如图(a)、(b)。
在发送端,输入的原始图像首先经过DCT变换后,其低频分量都集中在左上角,高频分量分布在右下角(DCT变换实际上是空间域的低通滤波器)。
由于该低频分量包含了图像的主要信息,而高频分量与之相比就不那么重要了,所以可以忽略高频分量,从而达到压缩的目的。
将高频分量去掉就要用到量化,这是产生信息损失的根源。
“量化”的主要任务是用有限个离散电平来近似表达已抽取出的信息。
在此采用均匀量化,通过改变程序中的量化因子Q的值以得到不同压缩比的图像。
Huffman编码时,首先对经DCT变换及量化后的图像收据扫描一遍,计算出各种像素出现的概率;然后按概率的大小指定不同长度的唯一码字,由此得到一张Huffman表。
编码后的图像记录的是每个像素的码字,而码字与量化后像素值的对应关系记录在码表中。
生成的一维字符矩阵即为实际中要传输的序列,压缩后的图像数据在信道中进行传输。
在接收端,接收到的压缩图像数据首先经过Huffman译码,通过搜索已生成的Huffman表,根据码字与量化后像素值的对应关系,搜索出与码字对应的像素值,并转换为二维矩阵。
反量化时将以上二维矩阵中的每一个像素值乘以量化因子Q。
最后通过DCT反变换得到重建图像。
◆离散余弦变换(DCT)
当前处于信息高速流通时代,要求在保证质量的前提下,以较小的空间存储图像和较小的比特率传输图像,这就需要采用各种图像压缩编码技术来实现。
DCT变换是最小均方误差条件得出的次最佳正交变换,且已经获得广泛的应用,并已经成为许多图像编码国际标准的核心。
离散余弦变换的变换核是余弦函数,计算速度较快,有利于图像压缩和其他处理。
在大多数情况下,DCT用于图像的压缩操作中。
JPEG图像格式的压缩算法采用的是DCT。
2.2DCT的定义
DCT变换利用傅立叶变换的性质,采用图像边界褶翻将图像变换为偶函数形式,然后对图像进行二维傅立叶变换,变换后仅包含余弦项,所以称之为离散余弦变换。
2.2.1离散余弦变换的概念
(1)一维离散余弦正反变换的公式
(2)二维离散余弦正反变换的公式
(3)正变换公式:
3.二维离散余弦变换的简化
在二维离散余弦变换中,x,y为空间域采样值。
通常,数字图像用像素方阵表示,即M=N,在这种情况下,二维离散余弦的正反变换可简化为:
2.2.2DCT和图像压缩
DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余。
变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。
在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。
我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。
图像经DCT变换以后,DCT系数之间的相关性已经很小,而且大部分能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。
从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。
为此,发送者首先将输入图像分解为8×8或16×16的块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换,最后将操作完成后所有的块拼接起来构成一幅单一的图像。
对于一般的图像而言,大多数DCT系数值都接近于0,可以去掉这些系数而不会对重建图像的质量产生重大影响。
因此,利用DCT进行图像压缩确实可以节约大量的存储空间。
DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。
而图像的能量通常集中在低频部分。
3.DCT变换的两种matlab实现方法
查阅资料后得知matlab有关于DCT变换的打包函数,所以我用两种方法来用两种方法来实现DCT变换,一用matlab的打包函数,二是根据DCT变换的原理自己编程实现DCT变换。
3.1用集成函数实现DCT变换。
3.1.1有关DCT变换的函数介绍
1.dct2
dct2实现图像的二维离散余弦变换,其语法格式为:
(1)B=dct2(A)
返回图像A的二维离散余弦变换值,其大小与A相同,且各元素为离散余弦变换的系数B(k1,k2)。
(2)B=dct2(A,m,n)或B=dct2(A,[m,n])
如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至m×n。
如果m和n比图像A小,则进行变换之前,将图像A剪切。
2.idct2
idct2可以实现图像的二维离散余弦反变换,其语法格式为:
B=idct2(A);B=idct2(A,m,n)或B=idct2(A,[m,n])。
3.可将二维DCT转化为一维DCT来计算。
D=dctmtx(N)
3.1.2用打包好的函数实现matlab中的DCT变换
程序如下:
loadLV;%%图片在附件中
I=rgb2gray(LV);
%%%%%%
K1=dct2(I);
D1=idct2(K1);
figure
(1),imshow(uint8(D1)),title('不作任何处理');
%%%%%%
K2=dct2(I);
K2(abs(K2)<20)=0;
D2=idct2(K2);
figure
(2),imshow(uint8(D2)),title('去除系数小于20的部分');
%%%%%%
K3=dct2(I);
K3(abs(K3)<30)=0;
D3=idct2(K3);
figure(3),imshow(uint8(D3)),title('去除系数小于30的部分');
%%%%%%
K4=dct2(I);
K4(abs(K4)<40)=0;
D4=idct2(K4);
figure(4),imshow(uint8(D4)),title('去除系数小于40的部分');
得到图像如下:
不作处理的图像
去掉系数小于20的图像
去掉系数小于30的图像
去掉系数小于40的图像
由图可知:
如果对于比例系数不做处理则与原图像一致,去掉的比例系数越多,则图像越来越模糊。
3.2根据DCT原理编程实现DCT变换
程序如下:
Tic
LV=imread(‘原图’);
I=LV;%该图片在附件中
I=im2double(I);%图像存储类型转换
%T=dctmtx(8);%离散余弦变换矩阵
[p,q]=size(I);
T=zeros(8,8);
fori=0:
7
forj=0:
7
if(i==0)
T(i+1,j+1)=1/sqrt(8);
else
T(i+1,j+1)=sqrt(2/8)*cos(pi*(2*j+1)*i/(2*8));
end
end
end
B=blkproc(I,[88],'P1*x*P2',T,T');%对原图像进行DCT变换
mask=[11100000
11000000
10000000
00000000
00000000
00000000
00000000
00000000];
B2=blkproc(B,[88],'P1.*x',mask);%用mask进行数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[88],'P1*x*P2',T',T);%进行DCT反变换未经量化,得到压缩后的图像
tables=[1611101624405161
1212141926586055
1413162440576956
1417222951878062
182237566810910377
243555648110411392
49647887103121120101
7292959811210010399];
B3=blkproc(B,[88],'x./P1',tables);%系数进行亮度量化
I3=blkproc(B3,[88],'P1*x*P2',T',T);%进行DCT反变换且经量化,得到压缩后的图像
mask1=[11111000
11110000
11100000
11000000
10000000
00000000
00000000
00000000];
B4=blkproc(B,[88],'P1.*x',mask1);%用mask1进行数据压缩,丢弃右下角高频数据
I4=blkproc(B4,[88],'P1*x*P2',T',T);%进行DCT反变换未经量化,得到压缩后的图像
imshow(I)
title('原始图像')
figure;
imshow(B)
title('DCT变换后的图像')
figure;
imshow(B3)
title('DCT变换后量化的图像')
figure;
imshow(I2)
title('经mask压缩后的图像')
imwrite(I2,'C:
\Users\无敌韬\Pictures\SavedPictures\经mask压缩后的图像.jpg');
figure;
imshow(I3)
title('经量化压缩后的图像')
figure;
imshow(I4)
title('经mask1压缩后的图像')
imwrite(I4,'C:
\Users\无敌韬\Pictures\SavedPictures\经mask1压缩后的图像.jpg');
%信噪比的计算
mse=0;%mseb原图与处理图像的均方误差
fori=1:
p
forj=1:
q
a=(I(i,j)-I2(i,j))^2;
mse=mse+a;
end
end
mse=mse/(256*256);
psnr=(20*log2(255)-10*log2(mse))/log2(10)
mse=0;%mseb原图与处理图像的均方误差
fori=1:
p
forj=1:
q
a=(I(i,j)-I3(i,j))^2;
mse=mse+a;
end
end
mse=mse/(256*256);
psnr1=(20*log2(255)-10*log2(mse))/log2(10)
mse=0;%mseb原图与处理图像的均方误差
fori=1:
p
forj=1:
q
a=(I(i,j)-I4(i,j))^2;
mse=mse+a;
end
end
mse=mse/(256*256);
psnr2=(20*log2(255)-10*log2(mse))/log2(10)
toc
所得部分结果如下图:
经mask压缩后的图像
经mask1压缩的图像
其中mask=[11100000
11000000
10000000
00000000
00000000
00000000
00000000
00000000];
mask1=[11111000
11110000
11100000
11000000
10000000
00000000
00000000
00000000];
显然mask1消除的系数比mask要少,所以可见两幅图中用mask1压缩的图像更加清晰。
4.总结
通过网上查找资料,自己动手实践,我掌握了图像离散余弦变换(DCT)的基本原理、变换编码的基本思想与目的、DCT的MATLAB实现以及DCT系数的分析方法。
总的来说DCT变换的难度适中,用matlab打包好的函数比较简单能完成,而应用DCT变换原理就比较难,因为对编程稍有基础,所以两种方法都做了。
由于本人在原理上的理解尚为粗浅,应用在编程上也一定存在许多问题,敬请批评指正。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DCT 变换