预测图像编码和解码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:
7, 对图象p04-01实施预测编码和解码,并将原图象与解码图象进行方差计算,考察解码后图象的视觉效果。预测模型为:
原理:
预测就是根据过去时刻的样本序列,运用一种模型,预测当前的样本值。预测编码是易于实现的,如差分脉冲编码调制(DPCM )方法。这种方法中,对每一个像素灰度值,都用先前扫描过的像素灰度值去减,求出它们的差值,此差值称为预测误差,预测误差被量化和编码与传送。接收端再将此差值与预测值相加,重建原始图像像素信号。由于量化和传送的仅是误差信号,根据一般扫描图像信号在空间及时间邻域内各像素的相关性,预测误差分布更加集中,即熵值比原来图像小,可用较少的单位像素比特率进行编码,使得图像数据得以压缩。DPCM 系统的基本系统框图如下图所示。
在该系统中,N x 为N t 时刻的亮度取样值。预测器根据N t 时刻之前的样本1x ,
2x ,……,1-N x 对N x 作预测,得到预测值'N x 。N x 与'N x 之间的误差为:
'N N N x x e -=
量化器对N e 进行量化得到'N e 。编码器对'N e 进行编码发送。接收端解码时的预测过程与发送端相同,所用预测器亦相同。接收端恢复的输出信号''N x 是N x 的近似值,两者的误差是 '
'''')(N N N N N N N N e e x x e x x x -=-=+-=∆
当输入图像信号是模拟信号时,“量化”过程中的信息损失是不可避免的。当N x ∆足够小时,输入信号N x 和DPCM 系统的输出信号几乎一致。
其它预测方法还有以下几种:
(1)前值预测:用),(y x f 同一行中临近的前一像素预测,即)1,(),(^-=y x f y x f
(2)一维预测:用同一行中前面若干像素预测。
(3)二维预测:用几行内像素预测。
(4)三维预测:利用相邻两帧图像信号的相关性预测。 )
,1(5.0)1,(5.0),(y x f y x f y x f -+-
=
程序为(一):
clc;
I=imread('lena512.bmp');
I2=I;
I=double(I);
fid = fopen( 'mydata.dat' ,'w');
[m,n]=size(I) ;
J=ones(m,n);
J(1:m,1)=I(1:m,1);
J(1,1:n)=I(1,1:n);
J(1:m,n)=I(1:m,n);
J(m,1:n)=I(m,1:n);
for k=2:m-1
for L=2:n-1
J(k,L)=I(k,L)-(I(k,L-1)/2+I(k-1,L)/2);
end
end
J=round(J) ;
cont=fwrite(fid,J,'int8');
cc=fclose(fid);
fid=fopen('mydata.dat','r');
I1=fread(fid,cont,'int8');
tt=1;
for L=1:n
for k=1:m
I(k,L)=I1(tt);
tt=tt+1;
end
end
I=double(I);
J=ones(m,n);
J(1:m,1)=I(1:m,1);
J(1,1:n)=I(1,1:n);
J(1:m,n)=I(1:m,n);
J(m,1:n)=I(m,1:n);
for k=2:m-1
for L=2:n-1
J(k,L)=I(k,L)+((J(k,L-1))/2+(J(k-1,L))/2); end
end
cc=fclose(fid);
J=uint8(J);
subplot(1,2,1),imshow(I2);title('原图');
subplot(1,2,2),imshow(J);title('解码图像');
for k=1:m
for l=1:n
A(k,l)=J(k,l)-I2(k,l);
end
end
for k=1:m
for l=1:n
A(k,l)=A(k,l)*A(k,l);
end
end
b=sum(A(:));
s=b/(m*n) %两幅图的方差运行结果为:
程序为(二):
clc;
i1=imread('lena512.bmp'); 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-1;
for l=2:n-1;
y(k,l)=(i(k,l-1)/2+i(k-1,l)/2);
p(k,l)=round(i(k,l)-y(k,l));
end
end
p=round(p);
subplot(3,2,1),imshow(i1);title('原灰度图像');
subplot(3,2,2),imshow(uint8(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-1;
for l=2:n-1;
j(k,l)=p(k,l)+y(k,l);
end
end
for r=1:m
for t=1:n
d(r,t)=round(i(r,t)-j(r,t));
end
end
a=zeros(m,n);
for l=1:m;
for h=1:n;
a(l,h)=(j(l,h)-i(l,h))^2;
end
end
b=sum(a(:));
c=b/(m*n) ;
subplot(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('解码重建后图像与原图像的误差');