实验4 DPCM预测编码
一、 实验目的
1了解图像压缩的意义和手段;
2熟悉DPCM预测编码的基本性质;
3熟练掌握DPCM预测编码的方法与应用;
4掌握利用MATLAB编程实现数字图像的DPCM预测编码。
二、 实验原理
      DPCM编码,简称差值编码,是对模拟信号幅度抽样的差值进行量化编码的调制方式(抽样差值的含义请参见“增量调制”)。这种方式是用已经过去的抽样值来预测当前的抽样值,对它们的差值进行编码。差值编码可以提高编码频率,这种技术已应用于模拟信号的数字通信之中。 
  对于有些信号(例如图像信号)由于信号的瞬时斜率比较大,很容易引起过载,因此,不能用简
单增量调制进行编码,除此之外,这类信号也没有像话音信号那种音节特性,因而也不能采用像音节压扩那样的方法,只能采用瞬时压扩的方法。但瞬时压扩实现起来比较困难,因此,对于这类瞬时斜率比较大的信号,通常采用一种综合了增量调制和脉冲编码调制两者特点的调制方法进行编码,这种编码方式被简称为脉码增量调制,或称差值脉码调制,用DPCM表示。
三、 实验报告内容
1.MATLAB编程实现对图像的DPCM预测编码
2叙述实验过程;
3提交实验的原始图像和结果图像。
解:
Matlab程序如下:
%本文是数字图像处理的一个源程序
%实现的功能是DPCM编码
%DPCM编码,简称差值编码,是对模拟信号幅度抽样的差值进行量化编码的调制方式
%本程序实现一阶/二阶/三阶/四阶DPCM数字信号预测
%一阶/二阶/三阶/四阶预测的区别不仅在于信号的清晰度,而更重要在于
%阶数越高,图像越光滑.
clc
clear
close all;
%从D盘导入图片,以学校风光图片为例实现DPCM
I03=imread('图片3.jpg');
%把RGB图像转化为灰度图像
I02=rgb2gray(I03);
I=double(I02);
fid1=fopen('mydata1.dat','w');
fid2=fopen('mydata2.dat','w');
fid3=fopen('mydata3.dat','w');
fid4=fopen('mydata4.dat','w');
[m,n]=size(I);
%对预测信号将边缘锁定,防止程序运行时抓不到数据
J1=ones(m,n);
J1(1:m,1)=I(1:m,1);
J1(1,1:n)=I(1,1:n);
J1(1:m,n)=I(1:m,n);
J1(m,1:n)=I(m,1:n);
J2=ones(m,n);
J2(1:m,1)=I(1:m,1);
J2(1,1:n)=I(1,1:n);
J2(1:m,n)=I(1:m,n);
J2(m,1:n)=I(m,1:n);
J3=ones(m,n);
J3(1:m,1)=I(1:m,1);
J3(1,1:n)=I(1,1:n);
J3(1:m,n)=I(1:m,n);
J3(m,1:n)=I(m,1:n);
J4=ones(m,n);
J4(1:m,1)=I(1:m,1);
J4(1,1:n)=I(1,1:n);
J4(1:m,n)=I(1:m,n);
J4(m,1:n)=I(m,1:n);
%一阶DPCM编码
for k=2:m-1
    for l=2:n-1
        J1(k,l)=I(k,l)-I(k,l-1);
    end
end
J1=round(J1);
cont1=fwrite(fid1,J1,'int8');
cc1=fclose(fid1);
%二阶DPCM编码
for k=2:m-1
    for l=2:n-1
        J2(k,l)=I(k,l)-(I(k,l-1)/2+I(k-1,l)/2);
    end
end
J2=round(J2);
cont2=fwrite(fid2,J2,'int8');
cc2=fclose(fid2);
%三阶DPCM编码
for k=2:m-1
    for l=2:n-1
        J3(k,l)=I(k,l)-(I(k,l-1)*(4/7)+I(k-1,l)*(2/7)+I(k-1,l-1)*(1/7));
    end
end
J3=round(J3);
cont3=fwrite(fid3,J3,'int8');
cc3=fclose(fid3);
%四阶DPCM编码
for k=2:m-1
    for l=2:n-1
        J4(k,l)=I(k,l)-(I(k,l-1)/2+I(k-1,l)/4+I(k-1,l-1)/8+I(k-1,l+1)/8);
    end
end
J4=round(J4);
cont4=fwrite(fid4,J4,'int8');
cc4=fclose(fid4);
%=====================================================================
%以上是DPCM编码的编码过程,为了使程序具有连贯性,将编码和解码放在同一个M文件目录下
%=====================================================================
%以下是DPCM解码
fid1=fopen('mydata1.dat','r');
fid2=fopen('mydata2.dat','r');
fid3=fopen('mydata3.dat','r');
fid4=fopen('mydata4.dat','r');
I11=fread(fid1,cont1,'int8');
I12=fread(fid2,cont2,'int8');
I13=fread(fid3,cont3,'int8');
I14=fread(fid4,cont4,'int8');
tt=1;
for l=1:n
    for k=1:m
        I1(k,l)=I11(tt);
        tt=tt+1;
    end
end
tt=1;
for l=1:n
    for k=1:m
        I2(k,l)=I12(tt);
        tt=tt+1;
      end
end
tt=1;
for l=1:n
    for k=1:m
        I3(k,l)=I13(tt);
        tt=tt+1;
    end
end
tt=1;
for l=1:n
    for k=1:m
        I4(k,l)=I14(tt);
        tt=tt+1;
    end
end
I1=double(I1);
I2=double(I2);
I3=double(I3);
I4=double(I4);
J1=ones(m,n);
J1(1:m,1)=I1(1:m,1);
J1(1,1:n)=I1(1,1:n);
J1(1:m,n)=I1(1:m,n);
J1(m,1:n)=I1(m,1:n);
J2=ones(m,n);
J2(1:m,1)=I2(1:m,1);
J2(1,1:n)=I2(1,1:n);
J2(1:m,n)=I2(1:m,n);
J2(m,1:n)=I2(m,1:n);
J3=ones(m,n);
J3(1:m,1)=I3(1:m,1);
J3(1,1:n)=I3(1,1:n);
J3(1:m,n)=I3(1:m,n);
J3(m,1:n)=I3(m,1:n);
J4=ones(m,n);
J4(1:m,1)=I4(1:m,1);
J4(1,1:n)=I4(1,1:n);
J4(1:m,n)=I4(1:m,n);
J4(m,1:n)=I4(m,1:n);
%一阶解码
for k=2:m-1
    for l=2:n-1
        J1(k,l)=I1(k,l)+J1(k,l-1);
    end
end
cc1=fclose(fid1);
J1=uint8(J1);
%二阶解码
for k=2:m-1
    for l=2:n-1
        J2(k,l)=I2(k,l)+(J2(k,l-1)/2+J2(k-1,l)/2);
    end
end
cc2=fclose(fid2);
J2=uint8(J2);
%三阶解码
for k=2:m-1
    for l=2:n-1
        J3(k,l)=I3(k,l)+(J3(k,l-1)*(4/7)+J3(k-1,l)*(2/7)+J3(k-1,l-1)*(1/7));
    end
end
cc3=fclose(fid3);
J3=uint8(J3);
%四阶解码
for k=2:m-1
    for l=2:n-1
fread和fwrite的区别
        J4(k,l)=I4(k,l)+(J4(k,l-1)/2+J4(k-1,l)/4+J4(k-1,l-1)/8+J4(k-1,l+1)/8);
    end
end
cc4=fclose(fid4);
J4=uint8(J4);
%分区画图
figure(1)
subplot(3,2,1);
imshow(I03);
%隐藏坐标轴和边框,以免坐标轴与标题重叠
axis off
box off
title('原始图像','fontsize',11,'fontname','隶体');
subplot(3,2,2);
imshow(I02);
axis off
box off
title('灰度图像','fontsize',11,'fontname','隶体');
subplot(3,2,3);
imshow(J1);
axis off
box off
title('一阶预测','fontsize',11,'fontname','隶体');
subplot(3,2,4);
imshow(J2);
axis off
box off
title('二阶预测','fontsize',11,'fontname','隶体');
subplot(3,2,5);
imshow(J3);
axis off
box off
title('三阶预测','fontsize',11,'fontname','隶体');