www.gusucode.com > DPCM 图像的线性预测编码 有完整的运行界面使用简单源码程序 > code2/Dpcmprj.m

    function Dpcmprj(Select,dpcm) 
% *************************************************************************
% 函数名称:
%     Dpcmprj()       “线性预测编码”菜单回调函数
% 说明:
%     读取原图像数据,根据“预测编码”和“传输误码”菜单调用不同
% 的算法函数,最后返回处理后的图像数组。  
% 调用函数:
%    newbuf=Dpcm_code(oldbuf,M,N,dim)       线性预测编解码器函数
%    newbuf=Error_Code(M,N,dim)             传输误码解码器函数   
% 上述函数调用的函数:
%    Pvalue=Predict_Value(row,col,N,dim)    预测器函数
%    Qvalue=Quant_Value(err)                量化器函数
%    Rvalue=Restor_Value(quan_err,pre_val)  求出DPCD恢复值函数
%    Cvalue=Clip_Value(res_val)             限幅函数 
% *************************************************************************
global oldbuf;                              %定义数组为全局变量 
global  M;                                  %图像尺寸
global  N;                                  %图像尺寸
global newbuf;                              %返回数组定义为全局变量

set(gcf,'pointer','watch');              
handle=get(gcf,'userdata');                

if  Select==1                              
    oldbuf=ReadImage(handle);
    [M,N]=size(oldbuf);                       
    newbuf=zeros(M,N);                        
    oldbuf=double(oldbuf);                    
else
   switch  dpcm                                %选择预测编码算法
    case 1                                      
           dim=1;                               %维数标志,选择1D_DPCM线性预测编码
           newbuf=Dpcm_code(oldbuf,M,N,dim);    %调用1D预测编码器函数
           subplot(1,3,2);              
           str='1D预测编码图像';
    case 2                                                             
           dim=2;                               %选择2D_DPCM预测编码  
           newbuf=Dpcm_code(oldbuf,M,N,dim);    %调用2D预测编码器函数
           subplot(1,3,3);                    
           str='2D预测编码图像';
    case 3
          dim=1;
          newbuf=Error_Code(M,N,dim);           %调用1D传输误码函数
          subplot(1,3,2);                      
          str='传输误码对图像的影响(1D)';
    case 4
          dim=2;
          newbuf=Error_Code(M,N,dim);           %调用2D传输误码函数
          subplot(1,3,3);                     
          str='传输误码对图像的影响(2D)';
end  
                     
newbuf=uint8(newbuf);                         
imshow(newbuf);                              
title(str);                                   
newbuf=0;
end
set(gcf,'pointer','arrow');                    
%-------------------------------------------------------------------------
function newbuf=Dpcm_code(oldbuf,M,N,dim);
% ************************************************************************* 
% 函数名称:
%     Dpcm_Code()      “线性预测编解码器”算法函数
% 参数:
%    oldbuf             原图像数组
%    M,N                原图像尺度
%    dim                选择预测编码维数 
%    newbuf             存放处理后的图像二维数组
% 说明:
%     根据线性预测编解码算法调用各个子模块,对原图像进行1D/2D线性预测编码和解码,
% 解码后的恢复图像放在newbuf数组中。
% *************************************************************************
global newbuf; 
%global oldbuf;                              %定义数组为全局变量 
newbuf=oldbuf;
%定义全局变量
   for i=1:M-1
     for j=1:N-1  
         Pvalue=Predict_Value(i,j,N,dim);
         err=oldbuf(i,j)-Pvalue;
         Qvalue=Quant_Value(err);
         Rvalue=Restor_Value(Pvalue,Qvalue);
         Cvalue=Clip_Value(Rvalue);
     end
 end


%-------------------------------------------------------------------------
function newbuf=Error_Code(M,N,dim);
% ************************************************************************* 
% 函数名称:
%    Error_Code()      “传输误码解码器”算法函数 
% 参数:
%    M,N                原图像尺度
%    dim                选择预测编码维数 
%    newbuf             存放处理后的图像二维数组
% 说明:
%     模拟信道传输过程中产生的误码,观察传输误码经解码后对恢复图像的影响,解码
% 后的恢复图像放在newbuf数组中。
% *************************************************************************
global newbuf;
newbuf=zeros(M,N);
g=zeros(M,N);g(55,55) =255;g(55,56)=255;g(56,55)=255;g(56,56)=255;
for i=1:M-1
    for j=1:N-1
        P(i,j)=Predict_Value(i,j,N,dim);
        P(i,1)=0;
        newbuf(i,1)=0;
        R(i,j)=Restor_Value(g(i,j),P(i,j));
       newbuf(i,j)=Clip_Value(R(i,j));
    end
end

 
%-------------------------------------------------------------------------
function  Pvalue=Predict_Value(i,j,N,dim)
% *************************************************************************
% {This function is used to give predicted value as linear predictor.
% The prediction formula is as follows:
% 1_D DPCM:      ^x[i,j]=128           if j=1
%                        x'[i,j-1]     if j>1
% 2_D DPCM:      ^x[i,j]=128           if i=1,j=1
%                        x'[  i,j-1]   if i=1,j>1
%                        x'[i-1,j  ]   if i>1,j=1 or N
%                     1/2x'[  i,j-1]   if i>1,j>1
%                     1/8x'[i-1,j-1]   (Pirsch's predictor)
%                     1/4x'[i-1,j  ]
%                     1/8x'[i-1,j+1]
% Dim : Dimension of prediction
% Row : vertical coordinate of current pixel to be predicted
% COL : horizontal coordinate of current pixel to be predicted}
% *************************************************************************
global newbuf;
global oldbuf;
switch dim
    case 1
        if j==1 f=128;
        else f=newbuf(i,j-1);
        end
    case 2    
        if i==1&j==1 f=128;
        else if i==1&j>1 f=newbuf(i,j-1);
        else if i>1&(j==1|j==N-1) f=newbuf(i-1,j);
            else f=newbuf(i,j-1)/2+newbuf(i-1,j-1)/8+newbuf(i-1,j)/4+newbuf(i-1,j+1)/8;
            end
        end
    end
end;
Pvalue=f;
%-------------------------------------------------------------------------
function Qvalue=Quant_Value(err);
% ************************************************************************* 
%   This function is used as linear quantizer.The quantizer has totally
%  13 quantization level :
%  0,-+7,-+16,-+27,-+38,-+51,-+66
% ************************************************************************* 
  
   if     (abs(err)<=2)    lev=0;  
   else if(abs(err)<=7)   lev=5;  
   else if(abs(err)<=13)   lev=10; 
   else if(abs(err)<=22)   lev=17; 
   else if(abs(err)<=33)   lev=28; 
   else  if(abs(err)<=45)   lev=39; 
       else if(abs(err)<=59)  lev=52;
           else               lev=67;
           end;
       end;
       end;
       end;
       end;
       end;
   end;
      Qvalue = lev;
   if (err ~= 0) 
      Qvalue = lev*(err / abs(err));
   end;
%-------------------------------------------------------------------------
function  Rvalue=Restor_Value(quan_err,pre_val)
% *************************************************************************
% This function is used to get restored value of DPCM
%              x=^x+Quant_Error
% *************************************************************************
             
     Rvalue=quan_err + pre_val;

%-------------------------------------------------------------------------
function Cvalue=Clip_Value(res_val)
% *************************************************************************
%  This function is used to clip to restored value to 8_bit value
%               0       if x<0
%           x'=255     if x>255
%               x       otherwise
% *************************************************************************

  if (res_val<0)  Cvalue=0;
  else  if(res_val>255)  Cvalue=255;
           else Cvalue=res_val;
      end;
end;
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
function  oldbuf=ReadImage(handle);
% *************************************************************************
% 函数名称:                    
%    ReadImage()         
% 说明:
%    打开对话框,读入原图像。                   
% *************************************************************************
[FileName,PathName]=uigetfile({...
       '*.BMP;*.JPG;*.JPEG;*.JPE;*.GIF;*.TIF;*.PNG';}); 
                                       
    if isequal(FileName,0) | isequal(PathName,0)
        FullFileName=CurrentFullFileName;       
    else                                        
        FullFileName=strcat(PathName,FileName);
        subplot(1,3,1);                         
        str='原图像';                           
        imshow(FullFileName);                   
        title(str);                            
        oldbuf=imread(FullFileName);            
        set(handle(2),'Enable','on');          
        set(handle(3),'Enable','on');          
        set(handle(4),'Enable','on');          
        set(handle(5),'Enable','on');          
    end