实验二图像预测编码一、实验题目:图像预测编码:二、实验目的:实现图像预测编码和解码.三、实验内容:给定一幅图片,对其进行预测编码,获得预测图像,绝对残差图像, 再利用预测图像和残差图像进行原图像重建并计算原图像和重建图像误差.四、预备知识:预测方法,图像处理概论。
五、实验原理:根据图像中任意像素与周围邻域像素之间存在紧密关系,利用周围邻域四个像素来进行该点像素值预测,然后传输图像像素值与其预测值的差值信号,使传输的码率降低,达到压缩的目的。
六、实验步骤:(1)选取一幅预测编码图片;(2)读取图片内容像素值并存储于矩阵;(3)对图像像素进行预测编码;(4)输出预测图像和残差图像;(5)根据预测图像和残差图像重建图像;(6)计算原预测编码图像和重建图像误差.七、思考题目:如何采用预测编码算法实现彩色图像编码和解码.八、实验程序代码:预测编码程序1:编码程序:i1=imread('lena.jpg');if isrgb(i1)i1=rgb2gray(i1);endi1=imcrop(i1,[1 1 256 256]);i=double(i1);[m,n]=size(i);p=zeros(m,n);y=zeros(m,n);y(1:m,1)=i(1:m,1);p(1:m,1)=i(1:m,1);y(1,1:n)=i(1,1:n);p(1,1:n)=i(1,1:n);y(1:m,n)=i(1:m,n);p(1:m,n)=i(1:m,n);p(m,1:n)=i(m,1:n);y(m,1:n)=i(m,1:n);for k=2:m-1for l=2:n-1y(k,l)=(i(k,l-1)/2+i(k-1,l)/4+i(k-1,l-1)/8+i(k-1,l+1)/8);p(k,l)=round(i(k,l)-y(k,l));endendp=round(p);subplot(3,2,1);imshow(i1);title('原灰度图像');subplot(3,2,2);imshow(y,[0 256]);title('利用三个相邻块线性预测后的图像');subplot(3,2,3);imshow(abs(p),[0 1]);title('编码的绝对残差图像');解码程序j=zeros(m,n);j(1:m,1)=y(1:m,1);j(1,1:n)=y(1,1:n);j(1:m,n)=y(1:m,n);j(m,1:n)=y(m,1:n);for k=2:m-1for l=2:n-1j(k,l)=p(k,l)+y(k,l);endendfor r=1:mfor t=1:nd(r,t)=round(i1(r,t)-j(r,t));endendsubplot(3,2,4);imshow(abs(p),[0 1]);title('解码用的残差图像');subplot(3,2,5);imshow(j,[0 256]);title('使用残差和线性预测重建后的图像');subplot(3,2,6);imshow(abs(d),[0 1]);title('解码重建后图像的误差');九、实验结果:图2.1 Lena图像预测编码实验结果预测编码程序2:x=imread('e:\imagebase\cameraman.jpg');figure(1)subplot(2,3,1);imshow(x);title('原始图像');subplot(2,3,2);imhist(x);title('原始图像直方图');subplot(2,3,3);x=double(x);x1=yucebianma(x);imshow(mat2gray(x1));title('预测误差图像');subplot(2,3,4);imhist(mat2gray(x1));title('预测误差直方图');x2=yucejiema(x1);subplot(2,3,5);imshow(mat2gray(x2));title('解码图像');e=double(x)-double(x2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n));%预测编码函数;%一维无损预测编码压缩图像x,f为预测系数,如果f默认,则f=1,即为前值预测function y=yucebianma(x,f)error(nargchk(1,2,nargin))if nargin<2f=1;endx=double(x);[m,n]=size(x);p=zeros(m,n);xs=x;zc=zeros(m,1);if length(f)>1for j=1:length(f)xs=[zc xs(:,1:end-1)];p=p+f(j)*xs;endy=x-round(p);elsexs=[zc xs(:,1:end-1)];p=xs;y=x-round(p);end% yucejiema是解码程序,与编码程序用的是同一个预测器function x=yucejiema(y,f)error(nargchk(1,2,nargin));if nargin<2f=1;endif length(f)>1f=f(end:-1,1);[m,n]=size(y);order=length(f);x0=zeros(m,n+order);for j=1:njj=j+order;for i=1:mtep=0.0;for k=order:-1:1tep=tep+f(k)*x0(i,jj-order-1+k);endx0(i,jj)=y(i,j)+tep;endendx=x0(:,order+1:end);else[m,n]=size(y);x0=zeros(m,n+1);for j=1:njj=j+1;for i=1:mx0(i,jj)=y(i,j)+x0(i,jj-1);endendx=x0(:,2:end);end图2.2 摄影师图像预测编码实验结果实验三图像熵编码与压缩一、实验题目:图像熵编码与压缩二、实验目的:学习和理解建立在图像统计特征基础上的熵编码压缩方法。
三、实验内容:(1)编程实现二值文本图像的行程编码。
(2)编程实现灰度图像的霍夫曼编码,并计算图像熵、平均码字长度及编码效率。
四、预备知识:(1)熟悉行程编码原理。
(2)熟悉霍夫曼编码原理。
(3)熟悉在MATLAB环境下对图像文件的I/O操作。
五、实验原理:(1)行程编码行程编码是将一行中颜色相同的相邻像素用一个计数值和该颜色值来代替。
比如,aaabbcccccdddeeee可以表示为3a2b5c3d4e。
如果一幅图像由很多块颜色相同的大面积区域组成,则采用行程编码可大大提高压缩效率,尤其适用于二值图像。
但当图像中每两个相邻像素的颜色都不相同时,采用这种方法不但不能实现数据压缩,反而使数据量增加一倍。
因此,对复杂的图像都不能单纯地采用行程编码。
(2)霍夫曼编码霍夫曼编码是一种代码长度不均匀的编码方法。
它的基本原理是按信源符号出现的概率大小进行排序,出现概率大的分配短码,反之则分配长码。
霍夫曼编码基本步骤如下:步骤1:统计图像每个灰度级(信息符号)出现的概率,并按概率从大到小进行排序。
步骤2:选出概率最小的两个值进行组合相加,形成的新概率值和其他概率值形成一个新的概率集合。
步骤3:重复步骤2,反复利用合并和排序的方法,直到只有两个概率为止。
步骤4:分配码字,对最后两个概率一个赋予“0”码字,一个赋予“1”码字。
如此反向进行到开始的概率排列,这样就得到了各个符号的霍夫曼编码。
六、实验步骤:(1)编程实现二值文本图像的行程编码。
(2)编程实现连续灰度图像的霍夫曼编码,并计算图像熵、平均码字长度及编码效率。
七、思考题目:将行程编码与霍夫曼编码结合,能否提高压缩效果?试验证之。
八、实验程序代码:(1)二值文本图像的行程编码程序:clear,close allt=imread('text.png');ts=logical(t);codetable=zeros(1,20000);[m,n]=size(ts);nn=n+1;icodecount=1;for i=1:mp1=ts(i,1);%第i行,第1个像素ipcount=1;%同一灰度值连续出现的次数for j=2:np2=ts(i,j);if ((p1==p2)&(ipcount<nn))ipcount=ipcount+1;elsecodetable(icodecount)=ipcount;codetable(icodecount+1)=p1;icodecount=icodecount+2;p1=p2;ipcount=1;end;end;codetable(icodecount)=ipcount;codetable(icodecount+1)=p1;icodecount=icodecount+2;codetable(icodecount)=nn;%行结束符号icodecount=icodecount+1;end;codetable(icodecount)=65535;%码表结束符号(2)连续灰度图像的霍夫曼编码程序代码function s=reduce(p)s=cell(length(p),1);for i=1:length(p)s{i}=i;end;n=size(s,1);while n>2[p,i]=sort(p);p(2)=p(1)+p(2);p(1)=[];s=s(i);s{2}={s{1},s{2}};s(1)=[];n=size(s,1);end;function makecode(sc,codeword)global CODEif isa(sc,'cell')makecode(sc{1},[codeword 0]);makecode(sc{2},[codeword 1]);elseCODE{sc}=char('0'+codeword); end;function CODE=huffman(p)global CODECODE=cell(length(p),1);if length(p)>1p=p/sum(p);s=reduce(p);makecode(s,[]);elseCODE={'1'};end;function y=mat2huff(x)y.size=uint32(size(x));x=round(double(x));xmin=min(x(:));xmax=max(x(:));pmin=double(int16(xmin)); pmin=uint16(pmin+32768); y.min=pmin;x=x(:)';h=histc(x,xmin:xmax); maxh=max(h);if maxh>65535h=65535*h/maxh; end;h=uint16(h);y.hist=h;map=huffman(double(h)); hx=map(x(:)-xmin+1);hx=char(hx)';hx=hx(:)';hx(hx==' ')=[];ysize=ceil(length(hx)/16); hx16=repmat('0',1,ysize*16); hx16(1:length(hx))=hx;hx16=reshape(hx16,16,ysize); hx16=hx16'-'0';twos=pow2(15:-1:0);%y.code=uint16(sum(t3,2))'; t1=ones(ysize,1);t2=twos(t1,:);t3=hx16.*t2;t4=sum(t3,2);y.code=uint16(t4)';实验四 图像DCT 变换编码与压缩一、实验题目:图像DCT 变换编码与压缩二、实验目的:(1)掌握离散余弦变换DCT 的实现方法,了解DCT 的幅度分布特性,从而加深对DCT 变换的认识。