数字图像处理之几何变换.docx

上传人:b****6 文档编号:6313510 上传时间:2023-01-05 格式:DOCX 页数:15 大小:1.47MB
下载 相关 举报
数字图像处理之几何变换.docx_第1页
第1页 / 共15页
数字图像处理之几何变换.docx_第2页
第2页 / 共15页
数字图像处理之几何变换.docx_第3页
第3页 / 共15页
数字图像处理之几何变换.docx_第4页
第4页 / 共15页
数字图像处理之几何变换.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数字图像处理之几何变换.docx

《数字图像处理之几何变换.docx》由会员分享,可在线阅读,更多相关《数字图像处理之几何变换.docx(15页珍藏版)》请在冰豆网上搜索。

数字图像处理之几何变换.docx

数字图像处理之几何变换

结课设计(论文)

 

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>0AndX30AndY3

Picture2.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>0AndX30AndY30AndX40AndY40AndX50AndY5

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)点

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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1