matlab 图像编码+答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四图像编码
一、实验目的
了解图像压缩编码的分类与评价指标;
掌握常用的熵编码方法以及matlab编程;
掌握基于FFT的图像压缩技术以及matlab编程;
掌握基于DCT的图像压缩技术以及matlab编程;
熟悉JPEG图像压缩编码过程;
掌握imwrite函数实现可变quality的JPEG压缩;
二、实验内容
(1)对给定的图像tu.bmp,进行哈夫曼编码,并解码输出,观察workspace下各个矩阵数据。
h=imread('tu.bmp');
[m,n]=size(h);
subplot(1,2,1);
imshow(h);
title('yuantu');
h=h(:);
s=0:255;
for i=0:255
p(i+1)=length(find(h==i))/(m*n);
end
dict=huffmandict(s,p);
enco=huffmanenco(h,dict);
deco=huffmandeco(enco,dict);
deco=col2im(deco,[m,n],[m,n],'distinct');
subplot(1,2,2);
imshow(uint8(deco));
title('huffman');
(2)阅读jpeg压缩编码的有关资料,使用imwrite函数对lena图像进行jpeg压缩,对比显示原图与不同质量参数下解码后的图像,并显示均方根误差、压缩比、图像大小
x=imread('lena.bmp');
imwrite(x,'c:/lena1.jpg','quality',20);
imwrite(x,'c:/lena2.jpg','quality',60);
imwrite(x,'c:/lena3.jpg','quality',80);
x1=imread('c:/lena1.jpg');
k1=imfinfo('c:/lena1.jpg');
s1=k1.FileSize/1024;
e1=x(:)-x1(:);
[m1,n1]=size(e1);
erms1=sqrt(sum(e1(:)).^2/(m1*n1));
i_size1=k1.Width*k1.Height*k1.BitDepth/8;
i_compress1=k1.FileSize;
ratio1=i_size1/i_compress1;
subplot(221);
imshow(x1);
title('质量因子:20 均方根误差:722.793 压缩比:14.448 图像大小:4536');
x2=imread('c:/lena2.jpg');
k2=imfinfo('c:/lena2.jpg');
s2=k2.FileSize/1024;
e2=x(:)-x2(:);
[m2,n2]=size(e2);
erms2=sqrt(sum(e2(:)).^2/(m2*n2));
i_size2=k2.Width*k2.Height*k2.BitDepth/8;
i_compress2=k2.FileSize;
ratio2=i_size2/i_compress2;
subplot(222);
imshow(x2);
title('质量因子:60 均方根误差:454.8008 压缩比:7.416 图像大小:8837');
x3=imread('c:/lena3.jpg');
k3=imfinfo('c:/lena3.jpg');
s3=k3.FileSize/1024;
e3=x(:)-x3(:);
[m3,n3]=size(e3);
erms3=sqrt(sum(e3(:)).^2/(m3*n3));
i_size3=k3.Width*k3.Height*k3.BitDepth/8;
i_compress3=k3.FileSize;
ratio3=i_size3/i_compress3;
subplot(223);
imshow(x2);
title('质量因子:80 均方根误差:343.2344 压缩比:5.0451 图像大小:12990');
(3)读取lena图像,编写一个程序,实现下列算法:首先将图像分成许多8X8的子图像,对每个子图像进行DCT,对每个子图像的64个系数,按照每个系数的大小来排序后,舍去小的变换系数,只保留16个系数,实现图像4:1的压缩
%读取lena图像,编写一个程序,实现下列算法:首先将图像分成许多8X8的子图像,对每个子图像进行DCT,
%对每个子图像的64个系数,按照每个系数的大小来排序后,舍去小的变换系数,只保留16个系数,实现图像4:1的压缩
cr=0.25;
i=imread('lena.bmp');
i1=double(i)/255;
subplot(121);
imshow(i1);
t=dctmtx(8);
dctcoe=blkproc(i1,[8 8],'P1*x*P2',t,t');
coevar=im2col(dctcoe,[8 8],'distinct');
coe=coevar;
[y,ind]=sort(coevar);
[m,n]=size(coevar);
snum=64-64*cr;
for i=1:n
coe(ind(1:snum),i)=0;
end
b2=col2im(coe,[8 8],[256 256],'distinct');
i2=blkproc(b2,[8 8],'P1*x*P2',t',t);
subplot(122);
imshow(i2);
%e=double(i1)-double(i2);
%[m,n]=size(e);
三、涉及知识点
(1)哈夫曼具体的编码方法为:
把输入元素按其出现概率的大小顺序排列起来,然后把最末两个具有最小概率的元素之概率加起来;
②把该概率之和同其余概率由大到小排队,然后再把两个最小概率加起来,
再重新排队;③重复②,直到最后只剩下两个概率为止
matlab函数:
huffumandict函数:生成哈夫曼编码字典
使用格式dict=huffmandict(s,p) s为灰度级,p为各灰度级出现的概率
huffmanenco函数:对图像进行哈夫曼编码
使用格式: enco=huffmanenco(I,dict);I为图像数据转成的列向量,dict为哈夫曼编码字典
Huffmandeco函数:对编码进行解码
使用格式:deco=huffmandeco(enco,dict);enco为压缩编码,dict为哈夫曼编码字典
(2)JPEG图像编码过程
(3)fft2函数:图像的二维快速傅立叶变换,语法格式:
F=fft2(I),能够将图像从空间域变换到频率域
ifft2函数:图像的二维快速傅立叶变换逆变换函数,语法格式:
I=fft2(F),能够将图像从频率域变换到空间域
(4)blkproc函数:能够将每个显示块从图像中提取出来,然后将其作为参数传递给任何用户函数。
语法格式:
b=blkproc(a,[m n],fun,p1,p1,...);
功能是对图像a的每个不同mXn块应用函数fun进行处理,p1,p2为fun函数中除了x之外的其他参数。
(5)im2col函数:将图像块排列成向量,语法格式为:
b=im2col(a,[m n],block_type)
其功能是将图像a的每一个mXn块转换成一列,重新组合成矩阵b。
block_type 指定排列的方式,当block_type为distinct时,图像块不重叠;当block_type为sliding是,图像块滑动
(6)col2im函数:将向量排列成图像块,语法格式为:
b=col2im(a,[m n],[mm nn],block_type)
其功能是将图像a的每一列排列成mXn的图像块,并用这些图像块组合成mmXnn的图像。
block_type指定排列的方式,当block_type为distinct时,图像块不重叠;当block_type为sliding是,图像块滑动
(6)sort(A):如果A是向量,sort(A) 对A中元素按照升序排列;如果A是矩阵,sort(A) 对A按每一列元素按照升序排列。
[B,IX] = sort(A,...)返回索引数组IX,其大小为size(IX) == size(A)。
若A是一个向量,B = A(IX);若A是一个m*n的矩阵,则IX的每一列是与A中列向量的元素相对应的置换向量。
for j = 1:n
B(:,j) = A(IX(:,j),j);
end
(7)imwrite函数:
功能:把图像写入图形文件中。
使用方法:
imwrite(f, 'filename')
文件名必须包括指明格式的扩展名。
也可以增加第三个参数,显式指明文件的格式。
比如
>> imwrite(f, ‘lena1.bmp', 'bmp')
也可以写成:>> imwrite(f, ‘lena1.bmp')
还可以有其他参数,比如jepg图像还有质量参数:
>> imwrite(f, ‘lena1.jpg’, ‘quality’, q)
q是0到100之间的一个整数,q值越大,图像由于压缩所造成的质量下降越小,但图像的存储需要的空间越大,q的默认值是75。
四、源程序以及结果
五、心得体会。