课程作业3--提取影像特征点分析.pdf

上传人:白大夫 文档编号:5422945 上传时间:2020-05-05 格式:PDF 页数:12 大小:776.47KB
返回 下载 相关 举报
课程作业3--提取影像特征点分析.pdf_第1页
第1页 / 共12页
课程作业3--提取影像特征点分析.pdf_第2页
第2页 / 共12页
课程作业3--提取影像特征点分析.pdf_第3页
第3页 / 共12页
课程作业3--提取影像特征点分析.pdf_第4页
第4页 / 共12页
课程作业3--提取影像特征点分析.pdf_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《课程作业3--提取影像特征点分析.pdf》由会员分享,可在线阅读,更多相关《课程作业3--提取影像特征点分析.pdf(12页珍藏版)》请在三一文库上搜索。

1、- 1 - 数字摄影测量作业报告 提取影像特征点 2010 年12 月15 日 - 2 - 1 作业任务 - 3 2 作业思想 - 3 3 设计原理与思路- 3 4 作业过程- 4 5 源程序- 5 6 作业成果- 9 7 作业自我评点 - 10 8 心得体会与建议 - 10 - 3 - 1 作业任务 提取一幅数字影像中的特征点:根据Moravec 算子,编制程序,从一幅数字影像中自 动提取 50 个以上的点特征(特征点) 2 作业思想 理论上,特征是影像灰度曲面的不连续点。在实际影像中,由于点扩散函数的作用, 特征表现为在一个微小邻域中灰度的急剧变化,或灰度分布的均匀性,也就是在局部区域中

2、具有较大的信息量。 若不考虑噪声,实际影像是理想灰度函数与点扩散函数的卷积,则点特征与边缘特征 如图 2 32 和图 233 所示,其灰度的分布均表现为从小到大或从大到小的明显变化, 因而除了用局部信息量来检测特征之外,还可以利用各种梯度或差分算于提取特征。本次作 业便采用Moravec 算子,从影像中提取感兴趣的特征点。 3 设计原理与思路 点特征主要是指明显点,如角点、圆点等。提取点特征的算子称为兴趣算子,即用某 种算法从影像中提取感兴趣的特征点。本次作业采用Moravec 算子的算法,提取特征点。 Moravec 算子的计算原理与步骤如下: (1). 计算各像素的兴趣值IV 。在以像素(

3、 c , r)为中心的n* n(如 5* 5)的窗口中, 如图 3-1 所示,计算四个方向相邻像素灰度差的平方和,则 1 2 1,1, 1 2 2,1,1 1 2 3,1 1 2 4,1,1 () () (31) () () k circir ik k ciriciri ik k cricri ik k ciriciri ik Vgg Vgg Vgg Vgg - 4 - 图 3-1 Morabec算子 式中: k=int(n/2) 。取其中最小者作为该像素(c , r)的兴趣值,即 cr1234 minIVVVVV , , (2). 给定一阈值,将兴趣值大于该阈值的点(窗口中心)作为候选点。

4、(3). 选取候选点中的极值点作为特征点。在一定大小的窗口内(窗口大小可不同于兴趣 值计算窗口) ,选择候选点中兴趣值最大的点作为特征点。 根据以上Moravec 算子的计算原理与步骤,运用visual studio 新建项目,制作一个简单 的小程序,包括打开图像,提取特征点,并且将特征点行列号列表显示等功能。 4 作业过程 41 窗体设计 如图 4-1-1,添加 picturebox 控件,相当于图像显示区;添加4 个 Button 控件,分别为 “打开图像” , “保存图像” , “提取特征点” , “关闭”事件按钮;添加textbox 控件,输入阈 值;添加listview 控件用于列表

5、显示所提取特征点的相关信息。 图 4-1-1 窗体设计 - 5 - 42 编写代码: 根据所设计的窗体,为各控件添加事件代码。 “打开图像” , “保存图像”以及“关闭”控件代码参考C#数字图像处理算法典型 事例 编写; “提取特征点”代码根据Moravec 算子的计算原理与步骤编写,并标记特征点; 添加 listview 控件中的列(序号、行号、列号、兴趣值)并设置属性,于listview 控件中列 表显示特征点的行列号和兴趣值。 43 调试程序: 准备一张特征明显的图像(在同学建议下,采用八卦图),编写完代码后启用调试, 根据错误提示找原因,一个一个解决问题。观察提取点的图像位置和数据有无

6、异常,不断调 试程序,直至程序运行正常。 5 源程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace 提取影像特征点 publicpartialclassForm1 : Form public Form1() InitializeComponent(); privatestring curFile

7、Name; private System.Drawing.Bitmap curBitmap; / 打开图像至 picturebox控件窗口 privatevoid open_Click(object sender, EventArgs e) OpenFileDialog opnDlg = new OpenFileDialog(); opnDlg.Filter = “所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;“ + “*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|“ + “位图 ( *.b

8、mp; *.jpg; *.png;.) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|“ + “矢量图 ( *.wmf; *.eps; *.emf;.) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf“; opnDlg.Title = “打开图像文件 “; - 6 - opnDlg.ShowHelp = true ; if (opnDlg.ShowDialog() = DialogResult.OK) curFileName = opnDlg.FileName; try curBitmap = (Bit

9、map) Image.FromFile(curFileName); pictureBox1.Image = curBitmap; catch ( Exception exp) MessageBox .Show(exp.Message); Invalidate(); / 提取特征点 privatevoid extraction_Click(object sender, EventArgs e) double V1, V2, V3, V4; int t = 0; int w, h, s; w = curBitmap.Width; h = curBitmap.Height; s = w * h; d

10、ouble f = int .Parse(textBox1.Text);/ 获取阈值 double , Gray = new double w, h;/ 存储所有像素点灰度值 double , IV = new double w, h;/ 存储所有像素点兴趣值 double V = new double s;/ 存储特征点兴趣值 double I = new double s;/ 存储特征点列号 double J = new double s;/ 存储特征点行号 Color curColor; Color c = Color .FromArgb(255, 0, 0);/ 设置标注特征点的颜色:

11、红色 / 计算并存储所有像素点灰度值 for ( int i = 0; i f) Vt = IVi, j; It = i; Jt = j; t+; curBitmap.SetPixel(i, j, c); for ( int n = 1; n = 0 curBitmap.SetPixel(i + n, j, c); curBitmap.SetPixel(i, j - n, c); curBitmap.SetPixel(i, j + n, c); - 8 - / 列表显示提取点的行列号和兴趣值 for ( int k = 0; k t; k+) int xh = k + 1; ListViewI

12、tem li = new ListViewItem(); li.Text = xh.ToString(); li.SubItems.Add(Ik.ToString(); li.SubItems.Add(Jk.ToString(); li.SubItems.Add(Vk.ToString(); listView1.Items.Add(li); / 保存图像 privatevoid save_Click(object sender, EventArgs e) if (curBitmap = null ) return ; SaveFileDialog saveDlg = new SaveFileD

13、ialog(); saveDlg.Title = “保存为 “; saveDlg.OverwritePrompt = true ; saveDlg.Filter = “BMP 文件 (*.bmp) | *.bmp|“ + “Gif 文件 (*.gif) | *.gif|“ + “JPEG文件 (*.jpg) | *.jpg|“ + “PNG 文件 (*.png) | *.png“; saveDlg.ShowHelp = true ; if (saveDlg.ShowDialog() = DialogResult.OK) string fileName = saveDlg.FileName; s

14、tring strFilExtn = fileName.Remove(0, fileName.Length - 3); switch (strFilExtn) case “bmp“: - 9 - curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp); break ; case “jpg“ : curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); break ; case “gif“: curBitmap.Save(fileName, Sys

15、tem.Drawing.Imaging.ImageFormat.Gif); break ; case “tif“: curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff); break ; case “png“ : curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Png); break ; default: break ; / 关闭窗口 privatevoid close_Click(object sender, EventArgs e) this

16、 .Close(); - 10 - 6 作业成果 阈值取 26000 时,提取 55 个特征点: 阈值取 20000 时,提取 423 个特征点: - 11 - 7 作业自我评点 71 优点: 窗体设计简洁大方,虽然舍去了常规菜单栏的设计,但按钮功能更突出作业目的。 提取特征点程序运算过程的编写无迭代和函数循环调用,运算速度快。 特征点的标记采用以特征点为中心,改变周围像素点颜色使其成“+”的红色标记, 定位准确,避免了直接使用DrawString方法绘制符号,造成符号中心与特征点不重 合的定位错误。 72 缺点: 窗体设计过于简单,程序功能不够完整全面,图像大小有上限,不能自动调整适应 大图

17、。 程序运行并提取特征点后,要将程序最小化, 再打开, 才能看到特征点的标记。 (原 因尚在研究中) 出现同一区域重复提取特征点,或是特征点靠太近的现象 73 自我评点: 此次作业总体来说完成了预定的任务,达到目的,但仍存在一些问题。在作业过程中, 通过查阅资料, 自主学习以及与同学交流,发现了不少问题并及时改进,仍然存在的问题实 属时间和现阶段自己的编程技术限制,相信在以后的学习和提高之后能够解决好这些问题。 8 心得体会与建议 终于写到这一部分了,从开始准备做这次作业,到现在快要完成报告,不仅经历了很长 时间,这个过程中自己也是感慨颇多,恨不得赶紧来写心得体会,抒发一下自己的感想。 这一个

18、作业可能是历时最长的一次作业吧,开始的时候属于无从下手什么都不懂的阶 段,所以进展很慢,积极性也不高,自己也不自觉,导致时间拖得很长。一开始由于受“数 字图像处理” 这门课程影响, 想用 matlab 来实现这次作业,不过后来考虑matlab 的可视化 和使用方面不如visual studio编程,果断放弃了。转投visual studio程序设计后,又发 现很多东西都忘了,于是又图书馆借书回来自己琢磨,温习大一暑假程序设计实习,然后一 点一点开始了这次作业的编写。 在程序设计的过程中, C#数字图像处理算法典型事例这本书给了我很大的帮助和影 响,窗口的设计和“打开图像”“保存图像”等的设计理

19、念和代码大部分都源于这本书,慢 慢地自己也学习了不少图像处理方面的知识。在调试程序的过程中也很头疼,因为对C#语 言还不是非常熟悉,所以有些错误让人有些束手无策,不过事实证明, 耐心和细心地去寻找 原因并解决问题是可行的,也是以后的学习过程中自己需要培养的好习惯。当我的程序调试 运行之后, 各方面都挺顺利, 不过让人郁闷的是特征点老是出现在了不是“特征” 的位置上, 为了解决这个问题,我自己一直研究了很久,感觉遇到了瓶颈。后来去请教了班上已经完成 这个作业的同学, 他们给我了很大的帮助,我才发现原来是直接使用DrawString方法绘制“ +” 符号而引起的,这个方法是直接用笔刷的方式绘制“+

20、”符号,可能是取符号左上角对准位 置,不能使符号中心与特征点很好地重合,导致定位错误。 后来改用特征点的标记采用以特 征点为中心,改变周围像素点颜色使其成“+”的红色标记,才使得定位准确。 对比当初第一次完成的未修改的程序和今天经过多次调试和修改之后的程序,发现真是 变化很大。开始时自己的风格还总是局限于c+式,编写了很多子函数,如计算灰度值的子 函数,计算兴趣值的子函数,在特定大小的窗口中提取特征点的子程序等,然后再一一调用, 这样下来程序运行非常慢,同学看了之后都笑称我的程序提取点就像一个动态FLASH , 确实, - 12 - 每找到一个特征点标记一次,而非先全部找到后记录下来再标记这样

21、非常耗费时间。不过改 进之后,用3 个数组存储找到的特征点信息,然后再全部标记,这样速递大大提高。还有一 开始的时候我还不知道用listview控件,也是按照C+ 的思想,将特征点的行列号输出到 了文本。 后来在与同学交流中惊喜地发现这个控件可以使用,又改进了自己的程序。不过程 序很多地方仍然存在不足,感觉专业知识方面的原理都很清楚了,就是程序设计和代码编写 方面的技术不够,经验不足, 加上时间限制也没法短时间内让自己称为一个编程高手,故还 请老师原谅,我的程序确实比较简单。 这次作业又让我想起了上学期刚后方交会课程作业的情况,也是一开始觉得无从下手, 自己把自己吓倒了,最后完成之后才恍然发现其实也并不难,其实也不是作业很简单,是自 己在这个过程中又不断地学习和提高,使自己更加有实力来完成作业。作业过程中的经验和 体会相信会给以后的学习带来莫大的帮助。感谢老师, 感谢这样一次作业的机会又让我提高 了不少。 谢谢老师辛苦地审阅此次作业!

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1