实验8 图像旋转和去高斯噪声资料.docx
《实验8 图像旋转和去高斯噪声资料.docx》由会员分享,可在线阅读,更多相关《实验8 图像旋转和去高斯噪声资料.docx(14页珍藏版)》请在冰点文库上搜索。
实验8图像旋转和去高斯噪声资料
图像旋转与高斯白噪声
姓名:
夏夏班级:
2010级信息与计算科学一班学号:
060210055
实验目的
1.掌握图像旋转、图像大小改变的原理。
2.利用“几何操作”剪切图像、改变图像大小、旋转图像。
3.了解改变图像大小的方法,包括不同的插值方式。
4.掌握两种方式下图像的旋转效果。
5.用3×3的模板处理加了高斯与椒盐噪声之后的图像,比较处理效果。
实验原理:
1.将一幅图像视为一个二维矩阵,用MATLAB进行图像处理。
2.利用MATLAB图像处理工具箱中的函数imread(读)、imshow(显示)、imresize(改变大小)、imrotate(旋转)对图像进行几何操作。
3.改变图像大小方法:
以最近邻插值方法、双线性插值法、双三次插值法。
分析不同的插值法对图像大小的影响。
4.图像旋转过程:
为了观察图像旋转过程的效果,采用不同的方式旋转图像。
5.对图像旋转自己编程xuanzhuan()进行实现。
6.高斯白噪声与椒盐噪声处理图像比较。
实验步骤:
1.自己编程xuanzhuan()函数实现图像旋转
所说的图像旋转是保持目标区域大小不变化,则整幅图像变大;其实就是用旋转之后的图形覆盖目标区域的面积来确定旋转之后的图,但是由于旋转之后的图有时会有些像素不能被填充,所以会出现很多空点出没数据填充。
旋转之中所用的公式:
或
几何运算一般定义为:
一个几何运算需要两个独立的算法。
首先,需要一二算法来定义空间变换本身,用它描述每个像素如何从起初位置“移动”到终止位置,即每个像素的“运动”。
同时,还需要一个用于灰度插值的算法。
只因在一般情况下,输入图像的位置坐标(x,y)为整数,而输出图像的位置坐标为非整数,反之亦然。
2.imrotate库函数实现图像的旋转:
Matlab使用imrotate函数改变图像大小,其使用格式如下:
上式中X表示需要进行操作的图像,dag表示旋转的角度,这个角度以逆时针的方向计算,负值则表示顺时针方向的旋转,method参数表示选择何种插值方法,‘crop’参数表示将旋转以后的图像取与原图像大小相同的中心部分输出,和‘loose’参数。
3.改变图像大小:
Matlab使用imresize函数改变图像大小,其使用格式如下:
上式中X表示需要进行操作的图像,M是放大的倍数,method参数表示选择何种插值方法,包括neareat(最近邻插值方法)、bilinear(双线性插值法)bicubic(双三次插值法)。
imresize函数在缺省情况下使用的是最近邻插值方法。
在这种算法的原理是每一个插值输出像素的值是在输入图像中与其最邻近的采样点的值,这种插值方法的运算量最小,适用于索引图像;而双线性插值的输出像素值是它在输入图像中2乘2领域采样点的平均值,它根据像素周围4个像素的灰度值在水平和垂直两个方向上对其进行插值;双三次插值使用三次插值函数,选择4乘4领域采样点,取得的效果较好,但相应的计算量也是前两种大。
4.高斯与椒盐噪声
1)高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。
如果一个噪声,它的幅度分布服从正态分布,而它的功率谱密度又是均匀分布的。
2)椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。
椒盐噪声往往由图像切割引起。
我们这里主要使用了几个和椒盐噪声一样的模板来去噪,前面的实验一详细介绍了这里就不介绍了。
实验过程:
1.自己编程实现图像旋转—xuanzhuan()
子函数
functionz=xuanzhuan(c)
szg=imread('G:
/专业课/数字图像处理/实验提交/图片/宋、彩.JPG');%读入原图
szg=rgb2gray(szg);%转化为灰度图
szg=imread('eight.tif');
subplot(2,2,1),imshow(szg);title('原图像');
[M,N,L]=size(szg);%M为行数,x方向,N为列数,y方向,L为维数
d=c*pi/180;%旋转的角度
backgray=0;%用作背景值的灰度值
a=cos(d);
b=sin(d);
prxmin=round(a-N*b);
prxmax=round(M*a-b);
prymin=round(a+b);
prymax=round(M*b+N*a);
nr=prxmax-prxmin+1;%行数,x
nc=prymax-prymin+1;%列数,y
primag(1:
nr,1:
nc,1:
L)=backgray;
fori=1:
M
forj=1:
N
ii=round(i*a-j*b)-prxmin+1;
jj=round(i*b+j*a)-prymin+1;
fork=1:
L
primag(ii,jj,k)=szg(i,j,k);
end
end
end
subplot(2,2,2),imshow(primag/255);title('45°旋转后未插值处理的图像');
%对图像中空格进行行插值
fori=1:
nr
forj=2:
nc-1
fork=1:
L
if(primag(i,j,k)==backgray&&primag(i,j-1,k)~=backgray&&primag(i,j+1,k)~=backgray)
primag(i,j,k)=primag(i,j-1,k);
end
end
end
end
subplot(2,2,3),imshow(primag/256);title('45°旋转并经插值处理的图像');
%matlab自带的旋转函数
X=imrotate(szg,c);
subplot(2,2,4),imshow(X);title('用matlab自带的旋转函数运算得到的旋转图像');
运行结果:
图像旋转(旋转c=30°):
主函数
c=30;
xuanzhuan(c);
图像旋转(旋转c=45°):
图像旋转(c=90°):
2.调用imrotate()库函数图像旋转
%%运用crop和loose库函数进行图像旋转比较
I=imread('G:
/专业课/数字图像处理/实验提交/图片/文彩媛.JPG');
I=rgb2gray(I);
J=imrotate(I,15,'bilinear');%普通旋转
J1=imrotate(I,15,'bilinear','crop');%crop库函数进行图像旋转
J2=imrotate(I,15,'bilinear','loose');%loose库函数进行图像旋转
subplot(2,2,1),imshow(I);title('原灰图像')
subplot(2,2,2),imshow(J);title('普通旋转下的图像')
subplot(2,2,3),imshow(J1);title('crop参数下的旋转图像')
subplot(2,2,4),imshow(J2);title('loose参数下的旋转图像')
3.resize库函数改变图像大小
%运用resize库函数来改变图像的大小
I=imread('G:
/专业课/数字图像处理/实验提交/图片/文彩媛.JPG');%matlab中的库图像
figure,subplot(1,2,1),imshow(I);title('原图像');
I=rgb2gray(I);%转化为灰度图
J=imresize(I,2,'nearest');%nearest邻插值方法放大2倍
J1=imresize(I,2,'bilinear');%bilinear双线性插值法放大2倍
J2=imresize(I,2,'bicubic');%bicubic双三次插值法放大2倍
subplot(1,2,2),imshow(I);title('原灰图像');
figure,
subplot(2,2,1),imshow(J);title('neareat插值法');
subplot(2,2,2),imshow(J1);title('bilinear插值法');
subplot(2,2,3),imshow(J2);title('bicubic插值法');
J3=imresize(I,[200,200]);%指定图像的大小
subplot(2,2,4),imshow(J3);title('指定图像大小');
运行结果:
4.高斯与椒盐噪声比较
I=imread('eight.tif');%读入原函数
%%I=imread('J:
/专业课/数字图像处理/实验提交/图片/丁.jpg');%读入原函数
%%I=rgb2gray(I);%转化为灰度图
subplot(2,3,1),imshow(I,[]);title('原图像');
f=imnoise(I,'gaussian',0,0.02);%对图象加高斯白噪声,噪声的均值与方差分别为0与0.01
subplot(2,3,2),imshow(f);title('原图像加高斯白噪声后的图');
h0=1/9.*[111;111;111];%定义平滑模板
h1=[0.10.10.1;0.10.20.1;0.10.10.1];
h2=1/16.*[121;242;121];%高斯模板
h3=1/8.*[111;101;111];
g0=[filter2(h0,f)];%对模板进行滤波处理
g1=[filter2(h1,f)];
g2=[filter2(h2,f)];
g3=[filter2(h3,f)];
subplot(2,3,3),imshow(g0,[]);title('h0图像');%显示平滑结束结果
subplot(2,3,4),imshow(g1,[]);title('h1图像');
subplot(2,3,5),imshow(g2,[]);title('h2图像');
subplot(2,3,6),imshow(g3,[]);title('h3图像');
figure,subplot(2,3,1),imshow(I,[]);title('原图像');
J=imnoise(I,'salt&pepper',0.04);;%对图象加椒盐噪声,噪声强度为0.04
subplot(2,3,2),imshow(f);title('原图像加椒盐噪声后的图');
subplot(2,3,3),imshow(g0,[]);title('h0图像');%显示平滑结束结果
subplot(2,3,4),imshow(g1,[]);title('h1图像');
subplot(2,3,5),imshow(g2,[]);title('h2图像');
subplot(2,3,6),imshow(g3,[]);title('h3图像');运行结果:
●加高斯白噪声结果:
●加椒盐噪声运行结果:
●人物图像去高斯噪声:
●人物图像去椒盐噪声:
实验心得与总结:
1.通过自己编的函数xuanzhuan()来旋转图像发现旋转之后出现很多空白点,根据老师您上课所说这应该是由于旋转之后导致图像变大了,出现很多像素没数值造成的。
所以后来就编了插值来补充那些数据空白点所造成的图像不清楚。
我发现图像旋转时在0到90度之间是有很大差别的。
但是在90度时就没有差位了,这是因为90度刚好把它完全填充。
这个程序有个不好的地方就是它旋转的角度永远只是90度以内。
我也调用了库函数进行比较。
发现自己的插值之后还是远不如库函数。
2.调用库函数直接进行旋转,我发现一点瑕疵都没有,因为库函数考虑的比较细,进行了很好的插值。
3.调用了库函数来进行图像大小放缩,有三种方式,最近邻插值方法、双线性插值法、双三次插值法,还有一中直接把图拉大或拉小的,做出来的结果都很直观。
同样为了方便,所以把图放在一张里,但是现象就不是很明显了,单独一张张看大图会发现明显区别的。
4.加高斯噪声与椒盐噪声然后用同样的模板去噪,通过比较发现效果差别是有点大的。
但是有与我们是初学图像处理辨别能力不是很很强,这里是为了看起来方便所以把图放在一个框里。
但是放在一个框里所以看起来就不是很明显。
做实验时是把图像分开做的,然后看区别的。
高斯噪声是对整体都有的那种,处理之后整体都变化的比较清楚。
椒盐噪声则是会是哪些大的颗粒慢慢的被过滤掉。