数据压缩代码(有注释)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

霍夫曼二元编码%function[h,l]=huffman(p)clear;clc;p=[0.10.30.050.090.210.25];%p=[0.20.190.180.170.150.100.01];%测试用数据%检测概率有无数值小于0,小于0时报错if(length(find(p0))~=0)error('Notaprob,negativecomponent');end%若相加之和减去1不在误差之内,说明超过概率有问题,提示报错,误差为±10e-10;if(abs(sum(p)-1)10e-10)error('Notaprobvector,componentdonotaddto1')endn=length(p);%检测有几个概率事件q=p;m=zeros(n-1,n);%生成0矩阵fori=1:n-1;[q,l]=sort(q);%对q进行升序排序,排序结果存放在q中,元素位置存放在l中。m(i,:)=[l(1:n-i+1),zeros(1,i-1)];%相加后少的那一位位号置0q=[q(1)+q(2),q(3:n),1];%把最小两个概率相加,由于相加后少一位,将该位置1end%生成空矩阵,大小为n*n^2,其中每个码最多占用n个。fori=1:n-1c(i,:)=blanks(n*n);%blanks是空格函数end%以下计算各个元素码字%如m所示,矩阵最后一行的两个非零值先置为1和0。每一位占用7bitc(n-1,n)='1';%c存放编码,开始编码c(n-1,2*n)='0';%先设置第一次的两个分支fori=2:n-1%继续编码%find(m(n-i+1,:)==1),查找位置号为1的元素。%n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1));此条语句作用是对应到码字所在的%后四位移到上一行的第一个元素的前四位,所得到的最后一位用于添加1或0c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));%c(n-i,n)='1';c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='0';forj=1:i-1%此语句作用是把此次未编码的移到上一行对应位置去c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));endendfori=1:n%将最终的编码存放在h中,ll存放每位编码的长度h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);ll(i)=length(find(abs(h(i,:))~=32));%计算最终得到各码的码长。endl=sum(p.*ll);%平均码长H=-sum(p.*log2(p));%显示各参数str=sprintf('信源熵:H=%0.3f',H);disp(str);str=sprintf('平均码长为:l=%0.4f',l);disp(str);str=sprintf('编码效率:η=%0.4f',H/l);disp(str);disp('二元霍夫曼编码为:'),disp(h)霍夫曼三元编码%function[h,l]=huffman(p);clear;clc;p=[0.10.30.050.090.210.25];%disp('概率分布');%pN=length(p);%统计事件个数r=3;%三元%kk=ceil((N-r)/(r-1))*(r-1)+r-N%(N-r)/(r-1)*(r-1)q=[p(1:N),zeros(1,ceil((N-r)/(r-1))*(r-1)+r-N)];n=length(q);A=(n-r)/(r-1)+1;m=zeros(A,n);fori=1:A[q,l]=sort(q);m(i,:)=[l(1:n-2*(i-1)),zeros(1,2*(i-1))];q=[sum(q(1:r)),q(r+1:n),ones(1,r-1)];endfori=1:Ac(i,:)=blanks(n*n);endc(A,n)='0';c(A,2*n)='1';c(A,3*n)='2';fori=1:(A-1)c(A-i,1:n-1)=c(A-i+1,n*(find(m(A-i+1,:)==1))-(n-2):n*(find(m(A-i+1,:)==1)));c(A-i,n)='0';c(A-i,n+1:2*n-1)=c(A-i,1:n-1);c(A-i,2*n)='1';c(A-i,2*n+1:3*n-1)=c(A-i,1:n-1);c(A-i,3*n)='2';forj=1:2*ic(A-i,(j+2)*n+1:(j+3)*n)=c(A-i+1,n*(find(m(A-i+1,:)==j+1)-1)+1:n*find(m(A-i+1,:)==j+1));endendfori=1:Nh(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);ll(i)=length(find(abs(h(i,:))~=32));endH=-sum(p.*log2(p));l=sum(p.*ll);str=sprintf('信源熵:H=%0.3f',H);disp(str);str=sprintf('三元霍夫曼编码平均码长:l=%0.2f',l);disp(str);str=sprintf('编码效率:η=%0.4f',H/(l*log2(r)));disp(str);disp('三元霍夫曼编码为:'),disp(h)%利用DCT变换进行图像压缩的MATLAB程序clc;clear;%清屏和数据空间RGB=imread('lenna.bmp');%读取图片I=rgb2gray(RGB);%灰度变换J=dct2(I);%DCT变换imshow(log(abs(J)),[])%用指定的灰度范围[lowhigh]且用指数形式显示灰度图像J。colormap(jet(64));%colormap来定义图像显示用的颜色查找表。colorbar;%在坐标轴旁边显示颜色条J(abs(J)10)=0;%将J中小于10的值置零K=idct2(J);%DCT反变换figure,imshow(I);title('压缩前');%显示灰度图figure,imshow(K,[0255]);title('解压后');%重构图像显示。在灰度范围[0255]内显示。%利用离散余弦变换进行JPEG图像压缩clear;clc;I=imread('lenna.bmp');%读入原图像%I=imread('rice.tif');%读入原图像I=rgb2gray(I);%转换成灰度用原图不会报错;I=im2double(I);%将原图像转换为双精度数据类型T=dctmtx(8);%产生二维DCT变换矩阵B=blkproc(I,[88],'P1*x*P2',T,T');%计算二维DCT,矩阵T及其转置T‘是DCT函数P1*x*P2的参数%二值掩膜,用来压缩DCT系数,只取系数左上角的10个;Mask=[1111000011100000110000001000000000000000000000000000000000000000];%数据压缩,丢弃右下角高频数据B2=blkproc(B,[88],'P1.*x',Mask);%只保留DCT变换的10个系数;I2=blkproc(B2,[88],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像subplot(1,2,1);imshow(I);title('原图像');%显示原图像subplot(1,2,2);imshow(I2);title('压缩图像');%显示压缩后的图像。%对比原始图像和压缩后的图像,虽然舍弃了85%的DCT系数,但图像任然清晰。%利用游程编码(RLE)进行图像压缩clear;clc;%I=checkerboard(10,2);%生成棋盘图像%imshow(I);%显示图像I=imread('rice.tif');%imshow(I);[mn]=size(I);J=[];fori=1:mvalue=I(i,1);num=1;forj=2:nifI(i,j)==valuenum=num+1;elseJ=[Jnumvalue];num=1;value=I(i,j);endendll=[Jnumvalue00];enddisp('原图像的大小')whos('I')disp('压缩后图像的大小')whos('J')%disp('图像的压缩比')%disp(m*n/length(J))str=sprintf('图像的压缩比为:%0.4f',m*n/length(J));disp(str);

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功