采用DCT进行图像压缩

摘要:
一、实验目的:熟悉变换编码的图像压缩方法二、实验内容:以所给图像为例,采用dct进行图像压缩编码,通过改变模板矩阵中非零元素的个数,得到不同缩编码图像,根据公式,编写程序计算原图像和dct变换后得到的图像之间的均方误差。

一、实验目的:熟悉变换编码的图像压缩方法

二、实验内容:以所给图像为例,采用dct进行图像压缩编码,通过改变模板矩阵中非零元素的个数,得到不同缩编码图像, 根据公式采用DCT进行图像压缩第1张

,编写程序计算原图像和dct变换后得到的图像之间的均方误差。用到的matlab函数为im2double,dctmtx,blkproc

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

先上实验要用到的图片

采用DCT进行图像压缩第2张

下面的程序的模板矩阵是8*8的

1 I=imread('C:/woman_blonde.tif');
2 I=im2double(I);
3 T=dctmtx(8);%得到一个8*8的离散余弦变化矩阵
4 B=blkproc(I,[8 8],'P1*x*P2',T,T');% x就是每一个分成的8*8大小的块,P1*x*P2相当于像素块的处理函数,p1=T p2=T’,也就是fun=p1*x*p2'=T*x*T'的功能是进行离散余弦变换
5 m=[1 1 1 0 0 0 0 0
6    1 1 0 0 0 0 0 0
7    1 0 0 0 0 0 0 0
8    0 0 0 0 0 0 0 0
9    0 0 0 0 0 0 0 0
10    0 0 0 0 0 0 0 0
11    0 0 0 0 0 0 0 0
12    0 0 0 0 0 0 0 0];
13 B2=blkproc(B,[8 8],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
14 I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
15 cha=abs(I-I2);
16 junfang=mse(cha);
17 figure,imshow(I),title('原始图像','Fontsize',18);
18 figure,imshow(I2),title('压缩(解压缩)图像','Fontsize',18),
19 xlabel({'均方误差: ';junfang},'Fontsize',18);

下面的程序的模板矩阵是16*16的

1 I3=imread('C:/woman_blonde.tif');
2 I3=im2double(I3);
3 T2=dctmtx(16);
4 B3=blkproc(I3,[16 16],'P1*x*P2',T2,T2');
5 m2=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
6    1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
7    1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8    1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
10    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
11    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
12    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
13    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
14    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
15    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
16    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
17    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
18    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
19    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
21 B4=blkproc(B3,[16 16],'P1.*x',m2);
22 I4=blkproc(B4,[16 16],'P1*x*P2',T2',T2);
23 cha1=abs(I3-I4);
24 junfang2=mse(cha1);
25 figure,imshow(I3),title('原始图像','Fontsize',20);
26 figure,imshow(I4),title('压缩(解压缩)图像','Fontsize',20),
27 xlabel({'均方误差: ';junfang2},'Fontsize',20);

对比运行结果:

8*8

采用DCT进行图像压缩第3张

16*16

采用DCT进行图像压缩第4张

对比还是容易发现,第二个代码的运行结果图片损失程度还是比较大的,因程序二模板的0个数占比更多,使更多的高频像素被压缩,而该压缩是不可逆的,所以图二损失程度更大。

下面是程序中几个函数的说明

dctmtx

MATLAB图像处理工具箱实现离散余弦变换有两种方法:dct2和dctmtx(1)使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。
(2)使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16)。
①函数:dct2 
实现图像的二维离散余弦变换。调用格式为: 
B =dct2(A) 
B =dct2(A,[M N]) 
B =dct2(A,M,N)
式中A表示要变换的图像,M和N是可选参数,表示填充后的图像矩阵大小,B表示变换后得到的图像矩阵。
②函数:dctmtx 
D =dctmtx(N) 
式中D是返回N×N的DCT变换矩阵,如果矩阵A是N×N方阵,则A的DCT变换可用D×A×D’来计算。这在有时比dct2计算快,特别是对于A很大的情况。 

blkproc

功能:对图像进行分块处理
函数调用形式:B =blkproc(A,[m n],fun, parameter1, parameter2, ...)
B =blkproc(A,[m n],[mborder nborder],fun,...)
B = blkproc(A,'indexed',...)
参数解释:[m n] :图像以m*n为分块单位,对图像进行处理(如8像素*8像素)
          Fun:   应用此函数对分别对每个m*n分块的像素进行处理
          parameter1, parameter2: 要传给fun函数的参数
          mborder nborder:对每个m*n块上下进行mborder个单位的扩充,左右进行nborder个单位的扩充,扩充的像素值为0,fun函数对整个扩充后的分块进行处理。

mse

等价于sum(a.^2)/lenght(a);
MSE和RMSE都是网络的性能函数。MSE是(神经)网络的均方误差,叫"Mean Square Error"。比如有n对输入输出数据,每对为[Pi,Ti],i=1,2,...,n.网络通过训练后有网络输出,记为Yi。那MSE=(求和(Ti-Yi)^2(i=1,2,..n))/n,即每一组数的误差平方和再除以数据的对数。RMSE叫“Root Mean Square Error”,即在MSE基础上要开根号,中文译为“均方根误差”,MSE=MSE开根号。亦即RMSE是MSE的平方根。

免责声明:文章转载自《采用DCT进行图像压缩》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tomcat环境搭建ViewPager留出边 显示左右两边的视图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Minimum Snap轨迹规划详解(3)闭式求解

如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的。闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver。 这里介绍Nicholas Roy文章中闭式求解的方法。 1. QP等式约束构建 闭式法中的Q 矩阵计算和之前一样(参照文章一),但约束的形式与之前略为不同,在之前的方法中,等式约束只要构造成[......

C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?

如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array.Rank;//获取维数,这里指行数int col = array.GetLength(1);//获取指定维度中的元素个数,这里也就是列数了。(0是第一维,1表...

21、二维数组行列转换

#include <stdio.h> intmain() { int a[2][3] ={1,2,3,4,5,6}; int b[3][2]; printf("原来的数组 "); for(int i=0;i<2;i++){ for(int j=0;j<3;j++){...

2.SJ-SLAM-14

第三讲 三维空间刚体运动 本讲目标 理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。 掌握Eigen库的矩阵、几何模块使用方法。 3.1 点、向量和坐标系,旋转矩阵 二维空间与三维空间主要区别在于,其旋转性,二维空间有1个自由度,三维空间有三个自由度。 光说向量不一定跟几何数有关系,比如说三维空间中的向量会跟着三个数,这三个数是向量的...

数据的相似性和相异性我们可以怎么分析

在数据挖掘中,在确定适用的算法模型之后,应该让我们的数据也能适用我们的算法。例如聚类,最近邻分类等算法,在这些算法中我们往往需要给我们的数据分类,相似的分为一类,不相似的分为不同类。 比如为了精准营销,商店需要建立顾客画像,得出具有类似特征(例如类似的收入,居住区域和年龄,职业等)的顾客组。也就是我们需要一个评判标准,评估对象之间比较的相似或不相似程度的标...

使用numpy教你复习线性代数基础

楔子 下面我们来一起复习一下线性代数的基础知识,并同时使用numpy进行演示,所以需要你有一些关于numpy的知识(但不需要太多)。另外在线性代数中,存在行列式和矩阵,它们长得都差不多,都类似于二维表的格式。但是行列式要求其行数和列数必须相等,但是矩阵则没有此要求,而我们在创建在numpy中创建行列式和矩阵的时候均使用numpy.array这个函数,这个函...