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