课程作业4--相关系数法识别同名点.doc_第1页
课程作业4--相关系数法识别同名点.doc_第2页
课程作业4--相关系数法识别同名点.doc_第3页
课程作业4--相关系数法识别同名点.doc_第4页
课程作业4--相关系数法识别同名点.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字摄影测量作业报告相关系数法识别同名点2010 年 12 月 16 日1 作业任务 -32 作业思想 -33 设计原理与思路-34 作业过程 -45 源程序 - 56 作业成果 - 97作业自我评点 - 108心得体会与建议- 101 作业任务根据给出的两幅影像,编制程序:1. 从左影像(L.jpg)中,利用Moravec算子,自动提取10个以上的特征点。要求:程序能读取*.JPG图像、在窗口或控件中显示整幅图像、在图像中显示出所提取的特征点(+),并列表显示各特征点的像素坐标。2. 从右(R.jpg)影像中,利用相关系数测度,自动提取与左影像特征点匹配的同名像点。要求:在左、右影像中分别显示特征点与同名像点,并列表显示各点的像素坐标。2作业思想数字影像相关原理:数字影像相关是利用计算机对数字影像进行数字计算得方式完成影像的相关,识别出两幅(或多幅)影像的同名点。计算时,首先取出以待定点为中心的小区域中的影像信号,然后取出其在另一影像中相应区域的影像信号,计算两者的相关函数,以相关函数最大值对应的相应区域中心点为同名点,即以影像信号分布最相似的区域为同名区域。同名区域的中心点为同名点,这就是自动化立体量测的基本原理。一般在影像上搜索同名点是一个二维搜索即二维相关的过程。二维影像相关时,先在一般在左影像上先确定一个待定点,称之为目标点,以此待定点为中心选取m * n(通常取mn)个像素的灰度阵列作为目标区或称目标窗口,如图2-1所示。为了在右影像上搜索同名点,必须估计出该同名点可能存在的范围,建立一个k * l(km,ln)个像素的灰度阵列作为搜索区,相关的过程就是依次在搜索区中取出m * n个像素灰度阵列作为搜索窗口,计算其与目标区的相似性测度,则式中:(i0 , j0) 为搜索中心。当取最大值时,该搜索窗口的中心像素被认为是目标点的同名点。即当时,(c , r )即为目标点的同名点。图2-13设计原理与思路在“课程作业3提取影像特征点”编制的程序基础上,提取数字影像左片的特征点,根据以上思想和原理,按照相关系数法算法继续编制程序提取出右片中相应特征点的相关系数最大的点,即同名点。相关系数法:相关系数是标准化的协方差函数,协方差函数除以两信号的方差即得相关系数。函数g (x , y)与g (x , y )的相关系数为对于离散灰度数据,相关系数的估计公式为:若,则为搜索区影像相对于目标去影像位移的行、列参数。4作业过程 41 窗体设计如图4-1-1,添加2个picturebox控件,相当于图像显示区,分别用于显示左片和右片;添加7个Button控件,分别为“提取左片特征点”,“识别右片同名点”,“关闭”, 2个“打开图像”,2个“保存图像”事件按钮;添加textbox控件,输入阈值;添加listview控件用于列表显示所提取特征点的相关信息以及所识别的同名点的相关信息,使两个控件靠近,便于做数据比对。图 4-1-1 窗体设计42 编写代码: 根据所设计的窗体,为各控件添加事件代码。 “打开图像”,“保存图像”以及“关闭”控件代码参考C#数字图像处理算法典型事例编写;“提取特征点”代码根据Moravec算子的计算原理与步骤编写,并标记特征点;“识别同名点”代码根据数字影像匹配的原理,按照相关系数法的估计公式计算相关系数,分别识别出每一个特征点的同名点;添加listview控件中的列(序号、行号、列号、兴趣值)并设置属性,于listview控件中列表显示特征点的行列号和兴趣值。43 调试程序: 编写完代码后启用调试,根据错误提示找原因,一个一个解决问题。左右片使用同一张图片,运行程序,对比图像和数据,观察特征点的提取有无异常,观察同名点识别是否准确,观察相关系数值大小变化,有错误便重新返回程序寻找原因,解决问题。5 源程序using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace 相关系数法识别同名点 public partial class Form1 : Form public Form1() InitializeComponent(); private string curFileName1; private string curFileName2; private System.Drawing.Bitmap curBitmap1; private System.Drawing.Bitmap curBitmap2; /打开左片 private void open1_Click(object sender, EventArgs e) OpenFileDialog opnDlg = new OpenFileDialog(); opnDlg.Filter = 所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif; + *.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf| + 位图( *.bmp; *.jpg; *.png;.) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico| + 矢量图( *.wmf; *.eps; *.emf;.) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf; opnDlg.Title = 打开图像文件; opnDlg.ShowHelp = true; if (opnDlg.ShowDialog() = DialogResult.OK) curFileName1 = opnDlg.FileName; try curBitmap1 = (Bitmap)Image.FromFile(curFileName1); pictureBox1.Image = curBitmap1; catch (Exception exp) MessageBox.Show(exp.Message); Invalidate(); /打开右片 private void open2_Click(object sender, EventArgs e) OpenFileDialog opnDlg = new OpenFileDialog(); opnDlg.Filter = 所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif; + *.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf| + 位图( *.bmp; *.jpg; *.png;.) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico| + 矢量图( *.wmf; *.eps; *.emf;.) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf; opnDlg.Title = 打开图像文件; opnDlg.ShowHelp = true; if (opnDlg.ShowDialog() = DialogResult.OK) curFileName2 = opnDlg.FileName; try curBitmap2 = (Bitmap)Image.FromFile(curFileName2); pictureBox2.Image = curBitmap2; catch (Exception exp) MessageBox.Show(exp.Message); Invalidate(); /保存左片图像 private void save1_Click(object sender, EventArgs e) if (curBitmap1 = null) return; SaveFileDialog saveDlg = new SaveFileDialog(); 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; string strFilExtn = fileName.Remove(0, fileName.Length - 3); switch (strFilExtn) case bmp: curBitmap1.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp); break; case jpg: curBitmap1.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); break; case gif: curBitmap1.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif); break; case tif: curBitmap1.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff); break; case png: curBitmap1.Save(fileName, System.Drawing.Imaging.ImageFormat.Png); break; default: break; /保存右片图像 private void save2_Click(object sender, EventArgs e) if (curBitmap2 = null) return; SaveFileDialog saveDlg = new SaveFileDialog(); 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; string strFilExtn = fileName.Remove(0, fileName.Length - 3); switch (strFilExtn) case bmp: curBitmap2.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp); break; case jpg: curBitmap2.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); break; case gif: curBitmap2.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif); break; case tif: curBitmap2.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff); break; case png: curBitmap2.Save(fileName, System.Drawing.Imaging.ImageFormat.Png); break; default: break; private int I = new int50;/存储左片特征点列号 private int J = new int50;/存储左片特征点行号 private double V = new double50;/存储左片特征点兴趣值 private double, Gray = new double600, 500;/存储左片所有像素点灰度值 private double, Gray1 = new double600, 500;/存储右片所有像素点灰度值 /提取左片特征点 private void extraction_Click(object sender, EventArgs e) double V1, V2, V3, V4; int t = 0; int w, h; w = curBitmap1.Width; h = curBitmap1.Height; double f = int.Parse(textBox1.Text); double, IV = new doublew, h; Color curColor; Color c1 = Color.FromArgb(255, 0, 0); for (int i = 0; i w; i+) for (int j = 0; j h; j+) curColor = curBitmap1.GetPixel(i, j); Grayi, j = (int)(curColor.R * 0.299 + curColor.G * 0.587 + curColor.B * 0.114); for (int i = 2; i w - 2; i+) for (int j = 2; j h - 2; j+) V1 = Math.Pow(Grayi - 2, j - Grayi - 1, j), 2) + Math.Pow(Grayi - 1, j - Grayi, j), 2) + Math.Pow(Grayi, j - Grayi + 1, j), 2) + Math.Pow(Grayi + 1, j - Grayi + 2, j), 2); V2 = Math.Pow(Grayi - 2, j - 2 - Grayi - 1, j - 1), 2) + Math.Pow(Grayi - 1, j - 1 - Grayi, j), 2) + Math.Pow(Grayi, j - Grayi + 1, j + 1), 2) + Math.Pow(Grayi + 1, j + 1 - Grayi + 2, j + 2), 2); V3 = Math.Pow(Grayi, j - 2 - Grayi, j - 1), 2) + Math.Pow(Grayi, j - 1 - Grayi, j), 2) + Math.Pow(Grayi, j - Grayi, j + 1), 2) + Math.Pow(Grayi, j + 1 - Grayi, j + 2), 2); V4 = Math.Pow(Grayi - 2, j + 2 - Grayi - 1, j + 1), 2) + Math.Pow(Grayi - 1, j + 1 - Grayi, j), 2) + Math.Pow(Grayi, j - Grayi + 1, j - 1), 2) + Math.Pow(Grayi + 1, j - 1 - Grayi + 2, j - 2), 2); double IV1 = Math.Min(V1, V2); double IV2 = Math.Min(IV1, V3); double IV3 = Math.Min(IV2, V4); IVi, j = IV3; for (int i = 2; i w - 2; i+) for (int j = 2; j f) Vt = IVi, j; It = i; Jt = j; t+; curBitmap1.SetPixel(i, j, c1); for (int n = 1; n 4; n+) if (i + n w & j + n = 0 & j - n = 0) curBitmap1.SetPixel(i - n, j, c1); curBitmap1.SetPixel(i + n, j, c1); curBitmap1.SetPixel(i, j - n, c1); curBitmap1.SetPixel(i, j + n, c1); for (int k = 0; k t; k+) int xh = k + 1; ListViewItem 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); textBox2.Text = t.ToString(); /计算相关系数 public double RelatedCoefficient(int x, int y, int c, int r) double g = 0, g1 = 0, h1 = 0, h2 = 0, h3 = 0, p = 0; for (int i = -2; i 2; i+) for (int j = -2; j 2; j+) g += Grayx + i, y + j; g1 += Gray1c + i, r + j; g /= 25; g1 /= 25; for (int i = -2; i 2; i+) for (int j = -2; j 2; j+) h1 += (Grayx + i, y + j - g) * (Gray1c + i, r + j - g1); h2 += Math.Pow(Grayx + i, y + j - g), 2); h3 += Math.Pow(Gray1c + i, r + j - g1), 2); p = h1 / Math.Sqrt(h2 * h3); return p; /识别同名点 private void matching_Click(object sender, EventArgs e) int f = int.Parse(textBox2.Text);/获取特征点个数 int w2 = curBitmap1.Width; int h2 = curBitmap1.Height; int I2 = new intf;/存储同名点列号 int J2 = new intf;/存储同名点行号 double RC = new doublef; Color curColor; Color c1 = Color.FromArgb(255, 0, 0); /计算右片所有像素点灰度值 for (int i = 0; i w2; i+) for (int j = 0; j h2; j+) curColor = curBitmap2.GetPixel(i, j); Gray1i, j = (int)(curColor.R * 0.299 + curColor.G * 0.587 + curColor.B * 0.114); /识别同名点并标记 for (int k = 0; k f; k+) double p = 0; for (int c = 2; c w2 - 2; c+) for (int r = 2; r h2 - 2; r+) if (p RelatedCoefficient(Ik, Jk, c, r) p = RelatedCoefficient(Ik, Jk, c, r); I2k = c; J2k = r; RCk = p; curBitmap2.SetPixel(I2k, J2k, c1); for (int n = 1; n 4; n+) if (I2k + n w2 & J2k + n = 0 & J2k - n = 0) curBitmap2.SetPixel(I2k - n, J2k, c1); curBitmap2.SetPixel(I2k + n, J2k, c1); curBitmap2.SetPixel(I2k, J2k - n, c1); curBitmap2.SetPixel(I2k, J2k + n, c1); int xh = k + 1; ListViewItem li = new ListViewItem(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论