数字图像处理之几何变换.docx
《数字图像处理之几何变换.docx》由会员分享,可在线阅读,更多相关《数字图像处理之几何变换.docx(15页珍藏版)》请在冰豆网上搜索。
![数字图像处理之几何变换.docx](https://file1.bdocx.com/fileroot1/2023-1/5/2243cdb1-9dc1-4c4b-bbd7-d6d897901a50/2243cdb1-9dc1-4c4b-bbd7-d6d897901a501.gif)
数字图像处理之几何变换
结课设计(论文)
2008级通信工程专业0813072班级
课程数字图像处理
姓名李瑞芳学号081307214
指导教师陈宇职称讲师
二О一一年十月三十
基于VB的数字图像的几何变换
1数字图像的发展
数字图像处理(DigitalImageProcessing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。
数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。
数字图像处理作为一门学科大约形成于20世纪60年代初期。
早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。
图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。
首次获得实际成功应用的是美国喷气推进实验室(JPL)。
他们对航天探测器徘徊者7号在1964年发回的几千张月球照片使用了图像处理技术,如几何校正、灰度变换、去除噪声等方法进行处理,并考虑了太阳位置和月球环境的影响,由计算机成功地绘制出月球表面地图,获得了巨大的成功。
随着图像处理技术的深入发展,从70年代中期开始,随着计算机技术和人工智能、思维科学研究的迅速发展,数字图像处理向更高、更深层次发展。
人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。
很多国家,特别是发达国家投入更多的人力、物力到这项研究,取得了不少重要的研究成果。
其中代表性的成果是70年代末MIT的Marr提出的视觉计算理论,这个理论成为计算机视觉领域其后十多年的主导思想。
图像理解虽然在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,因人类本身对自己的视觉过程还了解甚少,因此计算机视觉是一个有待人们进一步探索的新领域。
2系统总体分析
本设计的主要工具是MicrosoftVisualBasic6.0中文版。
主要用于实现彩色(或黑白)图像的放大,缩小,任意旋转,镜像和图像移动等几何变换。
2.1图像的任意旋转
一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。
旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。
图像的旋转分为正变换和逆变换。
它们有所不同,逆变换是对旋转后的图像所对应的大小范围逐次点循环,通过逆变换的公式求出对应于源图像中的像素点和像素值,这样旋转后的图像就不会出现空洞点,也就避免了旋转后的插值运算,从一定程度上提高了运算速度。
本次设计我们采用正变换,并用插值处理补充空洞点。
集体步骤如下:
(1)打开Vb新建一个工程如图所示:
(2)选中“打开”会出现如图所示:
(3)在左侧的部件栏里选中
,拖到Form1里按照布局以此拖入两次,分别为picture1,picture2,并修改属性栏里的AutoRedraw和AutoSize均为true。
将图像1属性栏里的Scalemode改为3—Pixel.按照相同的方法将
部件依次拖入到窗口中,并在属性栏里分别修改
,
,
。
(4)设置完成后,双击
进入程序编写窗口,把程序完整的写入,另外添加声明
OptionExplicit
ConstPi=3.14
源程序如下:
源图如上:
DimxAsInteger,yAsInteger'点在Picture1中的坐标
DimX1AsInteger,Y1AsInteger'过渡坐标
DimX2AsDouble,Y2AsDouble'过渡坐标
DimX3AsDouble,Y3AsDouble'点经过旋转后在Picture2中的坐标
DimangleAsDouble'旋转的角度
DimradianAsDouble'旋转的弧度
angle=Text1.Text
'获得旋转的角度
radian=angle*Pi/180
'获得旋转的弧度
Picture2.Cls
Forx=0ToPicture1.Width
Fory=0ToPicture1.Height
X1=x-Picture1.Width\2
Y1=y-Picture1.Height\2
'将坐标轴原点移动到Picture1的中心后原来坐标为(x,y)
'的点的新坐标为(X1,Y1)
X2=X1*Cos(radian)+Y1*Sin(radian)
'获得在更改坐标原点后旋转后该点的X坐标
Y2=Y1*Cos(radian)-X1*Sin(radian)
'获得在更改坐标原点后旋转后该点的Y坐标
X3=X2+Picture1.Width\2
'获得恢复坐标原点后旋转后的X坐标
Y3=Y2+Picture1.Height\2
'获得恢复坐标原点后旋转后的Y坐标
IfX3>0AndX30AndY3Picture2.PSet(X3,Y3),Picture1.Point(x,y)'将Picture1中(x,y)点复制到Picture2的(X3,Y3)点
Picture2.PSet(X4,Y4),Picture1.Point(x,y)
EndIf
Nexty
Nextx
!
(5)运行时会发现当旋转角度为90,180,270时,图像旋转时比较理想,旋转其他角度时的会出现白色空洞点,如图所示旋转(以50度为例):
经过修改后的程序如下:
DimX2AsDouble,Y2AsDouble'过渡坐标
DimX3AsDouble,Y3AsDouble'点经过旋转后在Picture2中的坐标
DimX4AsDouble,Y4AsDouble
DimX5AsDouble,Y5AsDouble
DimangleAsDouble'旋转的角度
DimradianAsDouble'旋转的弧度
angle=Text1.Text
'获得旋转的角度
radian=angle*Pi/180
'获得旋转的弧度
Picture2.Cls
Forx=0ToPicture1.Width
Fory=0ToPicture1.Height
X1=x-Picture1.Width\2
Y1=y-Picture1.Height\2
'将坐标轴原点移动到Picture1的中心后原来坐标为(x,y)
'的点的新坐标为(X1,Y1)
X2=X1*Cos(radian)+Y1*Sin(radian)
'获得在更改坐标原点后旋转后该点的X坐标
Y2=Y1*Cos(radian)-X1*Sin(radian)
'获得在更改坐标原点后旋转后该点的Y坐标
X3=X2+Picture1.Width\2
'获得恢复坐标原点后旋转后的X坐标
Y3=Y2+Picture1.Height\2
'获得恢复坐标原点后旋转后的Y坐标
X4=X2+Picture1.Width\2+1
Y4=Y2+Picture1.Height\2
X5=X2+Picture1.Width\2
Y5=Y2+Picture1.Height\2+1
IfX3>0AndX30AndY30AndX40AndY40AndX50AndY5Picture2.PSet(X3,Y3),Picture1.Point(x,y)'将Picture1中(x,y)点复制到Picture2的(X3,Y3)点
Picture2.PSet(X4,Y4),Picture1.Point(x,y)'将Picture1中(x,y)点复制到Picture2的(X4,Y4)点
Picture2.PSet(X5,Y5),Picture1.Point(x,y)'将Picture1中(x,y)点复制到Picture2的(X5,Y5)点
EndIf
Nexty
Nextx
旋转50度时:
可看到旋转后的图像质量较之前有很大改善
2.2图像的放大
图像放大的正变换是对源图像进行循环,通过对源图的每个像素点的位置放大k倍来得到放大后的新图像的像素点位置,并把原先像素点上的颜色值赋给它。
具体步骤如同2.1中
(1)----(3)的步骤将Form中内容设置如下
添加部件如下:
主要程序如下(将图像放大2倍或是4倍):
Ifflag=2Then
'将图像放大2倍
Picture2.Width=Picture1.Width*2
Picture2.Height=Picture1.Height*2
Fori=0ToPicture2.Width*2-1Step2
Forj=0ToPicture2.Height*2-1Step2
c=Picture1.Point(i/2,j/2)
Picture2.PSet(i,j),c
Picture2.PSet(i+1,j),c
Picture2.PSet(i,j+1),c
Picture2.PSet(i+1,j+1),c
Next
Next
ElseIfflag=4Then
'将图像放大4倍
Picture2.Width=Picture1.Width*4
Picture2.Height=Picture1.Height*4
Fori=0ToPicture2.Width*4-3Step4
Forj=0ToPicture2.Height*4-3Step4
c=Picture1.Point(i/4,j/4)
Picture2.PSet(i,j),c
Picture2.PSet(i,j+1),c
Picture2.PSet(i,j+2),c
Picture2.PSet(i,j+3),c
Picture2.PSet(i+1,j),c
Picture2.PSet(i+1,j+1),c
Picture2.PSet(i+1,j+2),c
Picture2.PSet(i+1,j+3),c
Picture2.PSet(i+2,j),c
Picture2.PSet(i+2,j+1),c
Picture2.PSet(i+2,j+2),c
Picture2.PSet(i+2,j+3),c
Picture2.PSet(i+3,j),c
Picture2.PSet(i+3,j+1),c
Picture2.PSet(i+3,j+2),c
Picture2.PSet(i+3,j+3),c
Next
Next
ElseIfflag=3Then
'利用PictureBox控件放大图像
temp=InputBox("请输入放大倍数","自定义",1.5)
Iftemp<>""Andtemp>0Then
Picture2.Width=Picture1.Width*temp
Picture2.Height=Picture1.Height*temp
Picture2.PaintPicturePicture1.Picture,0,0,Picture2.Width,Picture2.Height,_
0,0,Picture1.Width,Picture1.Height
Else
MsgBox"输入倍数不符合要求",vbExclamation,"错误"
EndIf
EndIf
FormLoad内的程序如下:
Form1.Left=0
Form1.Top=0
Form1.Width=Screen.Width
Form1.Height=Screen.Height
'为Picture1添加图像并初始化flag变量
Picture1.Picture=LoadPicture(App.Path+"\我.bmp")
flag=2
在相应的位置上的程序如下:
PrivateSubOption1_Click()
IfOption1.Value=TrueThenflag=2
EndSub
PrivateSubOption2_Click()
IfOption2.Value=TrueThenflag=4
EndSub
PrivateSubOption3_Click()
IfOption3.Value=TrueThenflag=3
EndSub
将属性设置好,即可实现图像的放大2倍或4倍。
2.3图像的缩小
图像缩小的正变换是对源图像进行循环,通过对源图的每个像素点的位置缩小1/k倍来得到缩小后的新图像的像素点位置,并把原先像素点上的颜色值赋给它。
同2.1中
(1)----(3)的步骤将Form中内容设置如下
相关程序参见源文件。
2.4图像的镜像
图像的镜像变换分为两种:
水平镜像和垂直镜像。
图像的镜像变换不改变图像的形状。
图像的镜像操作是以源图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换;图像的垂直镜像操作是以源图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。
如上述方法
将Form1设置为:
程序如下:
Setpic=Picture1.Picture
SelectCaseIndex
Case0
bHort=NotbHort
Case1
bVert=NotbVert
EndSelect
IfbHortAndbVertThen
Picture1.PaintPicturepic,Picture1.Width,Picture1.Height,Picture1.Width*-1,Picture1.Height*-1
ElseIfbHortAndNotbVertThen
Picture1.PaintPicturepic,Picture1.Width,0,Picture1.Width*-1,Picture1.Height
ElseIfNotbHortAndbVertThen
Picture1.PaintPicturepic,0,Picture1.Height,Picture1.Width,Picture1.Height*-1
Else
Picture1.PaintPicturepic,0,0
EndIf
垂直镜像图:
水平镜像图:
2.5图像的平移
图像的平移是将一幅图像中所有的点都按照指定的平移量在水平,垂直方向移动,平移后的图像和源图像相同。
图像平移变换有两种不同的方法,一种是图像平移的正变换,通过对源图的每个像素点进行变换来得到平移后的新图像的像素点位置,并把原先像素点上的颜色值赋给它;另外一种是图像的逆变换,对平移后的新图像做循环,在新图像的每个像素的位置上填上源图像相对应的位置的颜色。
将Form设置为如图所示:
依次写入程序:
(也可以根据需要移动相应的位置)
CommonDialog1.ShowOpen
Picture1.Picture=LoadPicture(CommonDialog1.FileName)
EndSub
PrivateSubCommand3_Click()
End‘用于退出
EndSub
PrivateSubCommand4_Click()
Picture2.Width=Picture1.Width
Picture2.Height=Picture1.Height
Fori=0ToPicture2.Width-1
Forj=0ToPicture2.Height-1
c=Picture1.Point(i,j)
x=i+50:
y=j-100
Picture2.PSet(x,y),c
Next
Next
EndSub
以向左移动50个单位,向下移动100个单位为例,移动后的效果图:
3总结
通过这个数字图像处理的几何变换,加深了对VB的熟悉和运用。
其中图像旋转中,旋转的角度不是特殊角度(如90度,190度,270度等)时,处理的图像会明显出现一些空洞点,我们必须要对这些空洞点进行填充处理,否则图像旋转后的图像就不好了。
这种操作叫插值处理,可采用行或列插值方法。
最简单的插值方法是:
图像旋转前某一点的像素点除了填充在旋转后坐标(X3,Y3)上外,还要填充在旋转后坐标为(X3+1,Y3)和(X3,Y3+1)的像素点上。
本文基于VB的数字图像处理的几何变换,包括图像的任意旋转,放大、缩小、镜像和移动,期间遇到了很多问题,在同学和老师的帮助下,最终还是完成了这个设计,虽然显得简单,但看到图像按照预期的那样显示时,还是很高兴的。
末了,非常感谢陈宇老师的指导!