数字图像处理之几何变换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

结课设计(论文)
2008 级通信工程专业0813072 班级
课程数字图像处理
姓名李瑞芳学号081307214 指导教师陈宇职称讲师
二О一一年十月三十
基于VB的数字图像的几何变换
1 数字图像的发展
数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。

数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。

数字图像处理作为一门学科大约形成于20世纪60年代初期。

早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。

图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。

首次获得实际成功应用的是美国喷气推进实验室(JPL)。

他们对航天探测器徘徊者7号在1964年发回的几千张月球照片使用了图像处理技术,如几何校正、灰度变换、去除噪声等方法进行处理,并考虑了太阳位置和月球环境的影响,由计算机成功地绘制出月球表面地图,获得了巨大的成功。

随着图像处理技术的深入发展,从70年代中期开始,随着计算机技术和人工智能、思维科学研究的迅速发展,数字图像处理向更高、更深层次发展。

人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。

很多国家,特别是发达国家投入更多的人力、物力到这项研究,取得了不少重要的研究成果。

其中代表性的成果是70年代末MIT的Marr提出的视觉计算理论,这个理论成为计算机视觉领域其后十多年的主导思想。

图像理解虽然在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,因人类本身对自己的视觉过程还了解甚少,因此计算机视觉是一个有待人们进一步探索的新领域。

2 系统总体分析
本设计的主要工具是Microsoft Visual Basic 6.0 中文版。

主要用于实现彩色(或黑白)图像的放大,缩小,任意旋转,镜像和图像移动等几何变换。

2.1图像的任意旋转
一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。

旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。

图像的旋转分为正变换和逆变换。

它们有所不同,逆变换是对旋转后的图像所对应的大小范围逐次点循环,通过逆变换的公式求出对应于源图像中的像素点和像素值,这样旋转后的图像就不会出现空洞点,也就避免了旋转后的插值运算,从一定程度上提高了运算速度。

本次设计我们采用正变换,并用插值处理补充空洞点。

集体步骤如下:
(1)打开Vb新建一个工程如图所示:
(2)选中“打开”会出现如图所示:
(3)在左侧的部件栏里选中,拖到Form1 里按照布局以此拖入两次,分别为picture1,picture2,并修改属性栏里的AutoRedraw和AutoSize均为true。

将图像1属性栏里的Scalemode改为3—Pixel.按照相同的方法将
部件依次拖入到窗口中,并在属性栏里分别修改
,,。

(4)设置完成后,双击进入程序编写窗口,把程序完整的写入,另外添加声明
Option Explicit
Const Pi = 3.14
源程序如下:源图如上:
Dim x As Integer, y As Integer '点在Picture1中的坐标
Dim X1 As Integer, Y1 As Integer '过渡坐标
Dim X2 As Double, Y2 As Double '过渡坐标
Dim X3 As Double, Y3 As Double '点经过旋转后在Picture2中的坐标Dim angle As Double '旋转的角度
Dim radian As Double '旋转的弧度
angle = Text1.Text
'获得旋转的角度
radian = angle * Pi / 180
'获得旋转的弧度
Picture2.Cls
For x = 0 To Picture1.Width
For y = 0 To Picture1.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
If X3 > 0 And X3 < Picture2.Width - 1 And Y3 > 0 And Y3 < Picture2.Height - 1 Then Picture2.PSet (X3, Y3), Picture1.Point(x, y) '将Picture1中(x,y)点复制到Picture2的(X3,Y3)点
Picture2.PSet (X4, Y4), Picture1.Point(x, y)
End If
Next y
Next x
!(5) 运行时会发现当旋转角度为90,180,270时,图像旋转时比较理想,旋转其他角度时的会出现白色空洞点,如图所示旋转(以50度为例):
经过修改后的程序如下:
Dim X2 As Double, Y2 As Double '过渡坐标
Dim X3 As Double, Y3 As Double '点经过旋转后在Picture2中的坐标
Dim X4 As Double, Y4 As Double
Dim X5 As Double, Y5 As Double
Dim angle As Double '旋转的角度
Dim radian As Double '旋转的弧度
angle = Text1.Text
'获得旋转的角度
radian = angle * Pi / 180
'获得旋转的弧度
Picture2.Cls
For x = 0 To Picture1.Width
For y = 0 To Picture1.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
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
If X3 > 0 And X3 < Picture2.Width - 1 And Y3 > 0 And Y3 < Picture2.Height - 1 And X4 > 0 And X4 < Picture2.Width - 1 And Y4 > 0 And Y4 < Picture2.Height - 1 And X5 > 0 And X5 < Picture2.Width - 1 And Y5 > 0 And Y5 < Picture2.Height - 1 Then
Picture2.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)点End If
Next y
Next x
旋转50度时:可看到旋转后的图像质量较之前有很大改善
2.2图像的放大
图像放大的正变换是对源图像进行循环,通过对源图的每个像素点的位置放大k倍来得到放大后的新图像的像素点位置,并把原先像素点上的颜色值赋给它。

具体步骤如同2.1中(1)----(3)的步骤将Form中内容设置如下
添加部件如下:
主要程序如下(将图像放大2倍或是4倍):If flag = 2 Then
'将图像放大2倍
Picture2.Width = Picture1.Width * 2
Picture2.Height = Picture1.Height * 2
For i = 0 To Picture2.Width * 2 - 1 Step 2
For j = 0 To Picture2.Height * 2 - 1 Step 2
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
ElseIf flag = 4 Then
'将图像放大4倍
Picture2.Width = Picture1.Width * 4
Picture2.Height = Picture1.Height * 4
For i = 0 To Picture2.Width * 4 - 3 Step 4
For j = 0 To Picture2.Height * 4 - 3 Step 4
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
ElseIf flag = 3 Then
'利用PictureBox控件放大图像
temp = InputBox("请输入放大倍数", "自定义", 1.5)
If temp <> "" And temp > 0 Then
Picture2.Width = Picture1.Width * temp
Picture2.Height = Picture1.Height * temp
Picture2.PaintPicture Picture1.Picture, 0, 0, Picture2.Width, Picture2.Height, _
0, 0, Picture1.Width, Picture1.Height Else
MsgBox "输入倍数不符合要求", vbExclamation, "错误"
End If
End If
Form Load 内的程序如下:
Form1.Left = 0
Form1.Top = 0
Form1.Width = Screen.Width
Form1.Height = Screen.Height
'为Picture1添加图像并初始化flag变量
Picture1.Picture = LoadPicture(App.Path + "\我.bmp")
flag = 2
在相应的位置上的程序如下:
Private Sub Option1_Click()
If Option1.Value = True Then flag = 2
End Sub
Private Sub Option2_Click()
If Option2.Value = True Then flag = 4
End Sub
Private Sub Option3_Click()
If Option3.Value = True Then flag = 3
End Sub
将属性设置好,即可实现图像的放大2倍或4倍。

2.3图像的缩小
图像缩小的正变换是对源图像进行循环,通过对源图的每个像素点的位置缩小1/k倍来得到缩小后的新图像的像素点位置,并把原先像素点上的颜色值赋给它。

同2.1中(1)----(3)的步骤将Form中内容设置如下
相关程序参见源文件。

2.4图像的镜像
图像的镜像变换分为两种:水平镜像和垂直镜像。

图像的镜像变换不改变图像的形状。

图像的镜像操作是以源图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换;图像的垂直镜像操作是以源图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。

如上述方法
将Form1设置为:
程序如下:
Set pic = Picture1.Picture
Select Case Index
Case 0
bHort = Not bHort
Case 1
bVert = Not bVert
End Select
If bHort And bVert Then
Picture1.PaintPicture pic, Picture1.Width, Picture1.Height, Picture1.Width * -1, Picture1.Height * -1
ElseIf bHort And Not bVert Then
Picture1.PaintPicture pic, Picture1.Width, 0, Picture1.Width * -1, Picture1.Height ElseIf Not bHort And bVert Then
Picture1.PaintPicture pic, 0, Picture1.Height, Picture1.Width, Picture1.Height * -1 Else
Picture1.PaintPicture pic, 0, 0
End If
垂直镜像图:水平镜像图:
2.5图像的平移
图像的平移是将一幅图像中所有的点都按照指定的平移量在水平,垂直方向移动,平移后的图像和源图像相同。

图像平移变换有两种不同的方法,一种是图像平移的正变换,通过对源图的每个像素点进行变换来得到平移后的新图像的像素点位置,并把原先像素点上的颜色值赋给它;另外一种是图像的逆变换,对平移后的新图像做循环,在新图像的每个像素的位置上填上源图像相对应的位置的颜色。

将Form设置为如图所示:
依次写入程序:
(也可以根据需要移动相应的位置)
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
End Sub
Private Sub Command3_Click()
End ‘用于退出
End Sub
Private Sub Command4_Click()
Picture2.Width = Picture1.Width
Picture2.Height = Picture1.Height
For i = 0 To Picture2.Width - 1
For j = 0 To Picture2.Height - 1
c = Picture1.Point(i, j)
x = i + 50: y = j-100
Picture2.PSet (x, y), c
Next
Next
End Sub
以向左移动50个单位,向下移动100个单位为例,移动后的效果图:
3 总结
通过这个数字图像处理的几何变换,加深了对VB的熟悉和运用。

其中图像旋转中,旋转的角度不是特殊角度(如90度,190度,270度等)时,处理的图像会明显出现一些空洞点,我们必须要对这些空洞点进行填充处理,否则图像旋转后的图像就不好了。

这种操作叫插值处理,可采用行或列插值方法。

最简单的插值方法是:图像旋转前某一点的像素点除了填充在旋转后坐标(X3,Y3)上外,还要填充在旋转后坐标为(X3+1,Y3)和(X3,Y3+1)的像素点上。

本文基于VB的数字图像处理的几何变换,包括图像的任意旋转,放大、缩小、镜像和移动,期间遇到了很多问题,在同学和老师的帮助下,最终还是完成了这个设计,虽然显得简单,但看到图像按照预期的那样显示时,还是很高兴的。

末了,非常感谢陈宇老师的指导!。

相关文档
最新文档