数字图像处理实验答案2Word文件下载.docx
《数字图像处理实验答案2Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验答案2Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
end
end
%-------------------------------------------------------------------------
functionnewbuf=SobFilter(oldbuf,M,N);
%SobFilter()
Sobel'
fori=2:
forj=2:
N-1
sx=oldbuf(i+1,j-1)+2*oldbuf(i+1,j)+oldbuf(i+1,j+1)-oldbuf(i-1,j-1)-2*oldbuf(i-1,j)-oldbuf(i-1,j+1);
sy=oldbuf(i-1,j+1)+2*oldbuf(i,j+1)+oldbuf(i+1,j+1)-oldbuf(i-1,j-1)-2*oldbuf(i,j-1)-oldbuf(i+1,j-1);
newbuf(i,j)=abs(sx)+abs(sy);
end
functionnewbuf=LapFilter(oldbuf,M,N);
%LapFilter()
Laplace'
%************************************************************************
fori=2:
newbuf(i,j)=5*oldbuf(i,j)-oldbuf(i-1,j)-oldbuf(i+1,j)-oldbuf(i,j-1)-oldbuf(i,j+1);
4、实验结果及分析(原图像和处理后的图像比较及分析)
如上图所示即为实验结果。
如上图所示Robert算子能够检测出原图像的边缘,并且显示出来;
Sobel在Robert算子的基础上增强了边缘,所以图像上结果会显示比原图像边缘要更加粗一些;
Laplace算子与其他边缘增强方法不同,即其边缘的增强程度和边缘的方向无关,所以图像的细节明显比原来更加突出。
图像方块编码
3、实验目的
通过编程实验,掌握方块编码的基本方法及压缩性能。
4、实验内容
编程实现子块为nxn的方块编码基本算法,分别取n=2,4,8方块尺寸进行编解码实验,计算编码后的均方误差和压缩比。
实验图像可为任意图像。
5、实验方法及编程
用Matlab进行编程,主要是对照着实验书上面的算法流程图进行代码的编写,下面是主要的实验代码:
functionnewbuf=BtcCode(oldbuf,M,N,n)
%BtcCode()方块编码函数
%参数:
%oldbuf原图像数组
%MN原图像尺寸
%n方块尺寸
%调用方块编码算法函数,输出编码后的图像
newbuf=oldbuf;
rowblocks=M/n;
colblocks=N/n;
fori=1:
rowblocks-1
row=i*n;
forj=1:
colblocks-1
col=j*n;
n
inbuf(i,j)=oldbuf(i+row,j+col);
outbuf=BtcBlock(inbuf,n);
newbuf(i+row,j+col)=outbuf(i,j);
functionoutbuf=BtcBlock(inbuf,n)
%btcblock()方块编码算法函数
%inbuf方块数组
%outbuf存放处理后的方块图像
%把原图像分成n*n子块,对每个方块的图像数据分别计算xt,a0,a1值,再用分辨率分
%量(a0,a1)替代方块原来的数据最后放入方块图像数组中并返回该数组。
temp=0;
temp0=0;
temp1=0;
q=0;
m=n*n;
inbuf=double(inbuf);
temp=temp+inbuf(i,j);
xt=temp/m;
if(inbuf(i,j)>
=xt)
q=q+1;
temp1=temp1+inbuf(i,j);
else
temp0=temp0+inbuf(i,j);
ifq~=m
a0=round(temp0/(m-q));
ifq~=0
a1=round(temp1/q);
if(inbuf(i,j)<
xt)
outbuf(i,j)=a0;
outbuf(i,j)=a1;
End
6、实验结果及分析(原图像和处理后的图像比较及分析)
如上图所示,即为实验结果。
实验将图像分为m=n*n的子图像块,然后进行方块编码;
由实验结果可知,窗口愈大时,方块效应越明显,方块编码图像变得越模糊;
窗口愈小时,编码图像接近于原图像。
图像线性预测编码
7、实验目的
通过编程设计,掌握帧内DPCM的编解码方法(预测,量化)及其压缩性能。
8、实验内容
(1)编制一维前值预测DPCM编解码程序,预测系数取(1,0,0,0)。
(2)编制二维前值预测DPCM编解码程序,预测系数取(1/2,1/4,0,1/4)。
(3)重建图像
与原图像
误差图像,用绝对误差表示如下:
式中的n为放大因子,以便观察误差的分布情况。
本实验采用15个量化分层的主观量化器,其量化电平分别取(0,+5,+10,+17,+28,+39,+52,+67)。
分别计算重建后图像的PSNR。
实验的图像为cla0或cla1。
用Matlab进行编程,主要是对照着实验书上面的算法流程图进行代码的编写,主要的代码如下所示:
functionnewbuf=Dpcm_code(oldbuf,M,N,dim);
%*************************************************************************
%Dpcm_Code()“线性预测编解码器”算法函数
%M,N原图像尺度
%dim选择预测编码维数
%newbuf存放处理后的图像二维数组
%根据线性预测编解码算法调用各个子模块,对原图像进行1D/2D线性预测编码和解码,
%解码后的恢复图像放在newbuf数组中。
globalnewbuf;
%定义全局变量
M
N
pre_val=Predict_Value(i,j,N,dim);
err=oldbuf(i,j)-pre_val;
quan_err=Quant_Value(err);
res_val=Restor_Value(quan_err,pre_val);
newbuf(i,j)=Clip_Value(res_val);
functionnewbuf=Error_Code(M,N,dim);
%Error_Code()“传输误码解码器”算法函数
%模拟信道传输过程中产生的误码,观察传输误码经解码后对恢复图像的影响,解码
%后的恢复图像放在newbuf数组中。
wrong=zeros(M,N);
wrong(100,100)=120;
err=wrong(i,j);
functionPvalue=Predict_Value(row,col,N,dim)
%{Thisfunctionisusedtogivepredictedvalueaslinearpredictor.
%Thepredictionformulaisasfollows:
%1_DDPCM:
^x[i,j]=128ifj=1
%x'
[i,j-1]ifj>
1
%2_DDPCM:
^x[i,j]=128ifi=1,j=1
[i,j-1]ifi=1,j>
[i-1,j]ifi>
1,j=1orN
%1/2x'
[i,j-1]ifi>
1,j>
%1/8x'
[i-1,j-1](Pirsch'
spredictor)
%1/4x'
[i-1,j]
[i-1,j+1]
%Dim:
Dimensionofprediction
%Row:
verticalcoordinateofcurrentpixeltobepredicted
%COL:
horizontalcoordinateofcurrentpixeltobepredicted}
switchdim%预测算法编程
case1
ifcol==1
Pvalue=128;
Pvalue=newbuf(row,col-1);
case2
if(row==1&
&
col==1)
col>
1)
if(row>
1&
col==1)||(row>
col==N)
Pvalue=newbuf(row-1,col);
col<
N)
Pvalue=(1/2)*newbuf(row,col-1)+(1/4)*newbuf(row-1,col-1)+...
(1/4)*newbuf(row-1,col+1);
functionQvalue=Quant_Value(err);
%Thisfunctionisusedaslinearquantizer.Thequantizerhastotally
%13quantizationlevel:
%0,-+7,-+16,-+27,-+38,-+51,-+66
if(abs(err)<
=3)lev=0;
elseif(abs(err)<
=11)lev=7;
=21)lev=16;
=32)lev=27;
=44)lev=38;
=58)lev=51;
elselev=66;
end;
Qvalue=lev;
if(err~=0)
Qvalue=lev*(err/abs(err));
functionRvalue=Restor_Value(quan_err,pre_val)
%ThisfunctionisusedtogetrestoredvalueofDPCM
%x=^x+Quant_Error
Rvalue=quan_err+pre_val;
functionCvalue=Clip_Value(res_val)
%Thisfunctionisusedtocliptorestoredvalueto8_bitvalue
%0ifx<
=255ifx>
255
%xotherwise
if(res_val<
0)Cvalue=0;
elseif(res_val>
255)Cvalue=255;
elseCvalue=res_val;
end;
如上图所示,即为实验所得的结果图像。
由实验结果可以看出,一维和二维预测编码图像非常接近原图像;
从误码图像中可以看出,一维预测编码会将误差延续到行末端,而二维预测编码其将误码延续至其后的斜后方,所以二维预测编码的误差会偏小。
JPEG压缩编码
9、实验目的
(1)掌握nxn子块的DCT图像变换及频谱特点。
(2)熟悉JPEG基本系统的图像编解码方法。
(1)编程实现nxn子块DCT变换的图像频谱显示,8x8子块DCT变换系数按“Z”扫描图像重建,计算图像的均方根误差RMSE,显示误差图像和误差直方图。
(2)编程实现JPEG压缩编码,进行8x8子块的DCT图像变换,JPEG量化矩阵的量化与反量化,8x8子块DCT的图像重建,计算图像的均方根误差RMSE,显示误差图像和误差直方图。
functionnewbuf=DctBlock(oldbuf,Block)
%DctBlock()DCTn*n块频谱函数
%
%BlockDCTn*n当前块选择值
%根据Block块的当前选择值,计算原图像的n*n块DCT变换,并转换为可视频谱图,
%有利于频谱的观察。
oldbuf=double(oldbuf);
%添加程序
H=dctmtx(Block);
newbuf=blkproc(oldbuf,[BlockBlock],'
P1*x*P2'
H,H'
);
newbuf=log(abs(newbuf));
subplot(2,2,2);
imshow(newbuf,[]);
%-------------------------------------------------------------------------
functionnewbuf=DctCode(oldbuf,DCTch)
%DctCode()DCT8*8块系数“Z”字扫描图像压缩函数
%DCTchDCT8*8块“Z”扫描当前系数选择值
%计算图像的8×
8子块DCT变换,按“Z”字扫描顺序,根据DCTch参数,只保留64个
%DCT系数中的前DCTch个系数,对修改后的DCT系数用逆DCT变换重建图像,得到DCT变
%换的压缩图像。
计算重建图像的均方根误差RMSE;
显示误差图像和误差直方图。
zigzag=[126715162829%设置z扫描顺序
3581417273043
49131826314244
1012192532414554
1120243340465355
2123343947525661
2235384851576062
3637495058596364];
tbuf=ones(8);
%定义8*8全1数组