您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 用matlab仿真huffman编码在jpg图像压缩中的应用--崔微微
用matlab仿真huffman编码在jpg图像压缩中的应用1.jpg图像的定义:JPEG是JointPhotographicExpertsGroup(联合图像专家组)的缩写,文件后辍名为.jpg或.jpeg,是最常用的图像文件格式,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。而且JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。比如可以把1.37Mb的BMP位图文件压缩至20.3KB。当然也可以在图像质量和文件尺寸之间找到平衡点。JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。2.huffman编码huffman编码是一种高效的无失真信源编码方法,所得到的码字具有最短的平均码长。3.用matlab仿真用huffman编码对一图像进行压缩的例子(1)编码思路:先将一个模拟图形进行抽样量化,像素量化成九个灰度级。然后进行huffman编码,最后进行压缩率的计算。(2)编码程序如下:%图像的huffman编码过程%将模拟图形进行抽样量化clearall;closeall;clc;Dimens=256;%矩阵维数,假设矩阵为方阵即256*256src_size=Dimens^2;%矩阵元素的个数gray_level=9;%灰度级src=randn(Dimens);%产生模拟图像矩阵,满足正态分布,零均值,方差为1src_one=reshape(src,1,src_size);src_max=max(src_one);src_min=min(src_one);quan=linspace(src_min,src_max,gray_level);%产生均匀量化区间src_d=[];%数字矩阵forrow=1:Dimens%逐点量化forvol=1:Dimensdiff=abs(src(row,vol)-quan);[min_diff,min_index]=min(diff);quan_gray=min_index-1;src_d(row,vol)=quan_gray;endend%prob数组保存图像中各灰度出现的概率prob=[];forsrc_value=0:(gray_level-1)index=find(src_d==src_value);i=src_value+1;prob(i)=length(index)/src_size;end%huffman编码p=prob;n=length(p);q=p;m=zeros(n-1,n);fori=1:n-1[q,l]=sort(q);m(i,:)=[l(1:n-i+1),zeros(1,i-1)];q=[q(1)+q(2),q(3:n),1];endbre=zeros(n-1,n);bre(n-1,1)=0+j;%虚部表示当前的二进制数的位数,以下类似bre(n-1,2)=1+j;fortime=1:n-2loc_1=find(real(m(n-time,:))==1);prebit=bre(n-time,loc_1);bre(n-time-1,1)=(real(prebit)*2+0)+j*(imag(prebit)+1);bre(n-time-1,2)=(real(prebit)*2+1)+j*(imag(prebit)+1);loc_not1=find(real(m(n-time,:))1);bre(n-time-1,3:3+time-1)=bre(n-time,loc_not1);end[m1,index]=sort(m(1,:));code=bre(1,index);code_data=real(code);code_bits=imag(code);disp(['graylevel','','huffmancode']);fori=1:length(code)disp([num2str(i-1),'',num2str(dec2bin(code_data(i)))]);endcode_binary=dec2bin(code_data);%逐点编码out=[];forrow=1:Dimensforvol=1:Dimensnow_gray=src_d(row,vol);now_code=code_binary(now_gray+1,:);now_bits=code_bits(now_gray+1);now_code=now_code(end-now_bits+1:end);out=[out,now_code];endend%计算压缩比real_bitnum=length(out);bitnum_no_huffman=src_size*nextpow2(gray_level);comp_ratio=bitnum_no_huffman/real_bitnum;Hshannon=(-1)*prob*(log2(prob))';disp(['comp_ratio=',num2str(comp_ratio)]);disp(['Hshannon=',num2str(Hshannon)]);(3)matlab运行结果如下:graylevelhuffmancode01100000011100001211001311140510611017110001811000001comp_ratio=1.9087Hshannon=2.0186
本文标题:用matlab仿真huffman编码在jpg图像压缩中的应用--崔微微
链接地址:https://www.777doc.com/doc-1882914 .html