Moravec算子提取特征点.doc_第1页
Moravec算子提取特征点.doc_第2页
Moravec算子提取特征点.doc_第3页
Moravec算子提取特征点.doc_第4页
Moravec算子提取特征点.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using System.Drawing.Imaging;namespace 课程作业3_bk20113268 public partial class Form1 : Form public Form1() InitializeComponent(); / / 打开图像 / / / private void button1_Click(object sender, EventArgs e) /设置文件的类型 openFileDialog1.Filter = *.jpg,*.jpeg,*.bmp,*.gif,*.ico,*.png,*.tif,*.wmf|*.jpg;*.jpeg;*.bmp;*.gif;*.ico;*.png;*.tif;*.wmf; if (openFileDialog1.ShowDialog() = DialogResult.OK) /打开文件对话框 /根据文件的路径创建Image对象 Image myImage = System.Drawing.Image.FromFile(openFileDialog1.FileName); pictureBox1.Image = myImage; /显示打开的图片 pictureBox1.Height = myImage.Height; pictureBox1.Width = myImage.Width; this.button2.Enabled = true; / / 为数据表表头添加行号 / / / private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) try /添加行号 SolidBrush v_SolidBrush = new SolidBrush(dataGridView1.RowHeadersDefaultCellStyle.ForeColor); int v_LineNo = 0; v_LineNo = e.RowIndex + 1; string v_Line = v_LineNo.ToString(); e.Graphics.DrawString(v_Line, e.InheritedRowStyle.Font, v_SolidBrush, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5); catch (Exception ex) MessageBox.Show(添加行号时发生错误,错误信息: + ex.Message, 操作失败); / / 提取特征点 / / / private void button2_Click(object sender, EventArgs e) Image myImage = System.Drawing.Image.FromFile(openFileDialog1.FileName); pictureBox1.Image = myImage; /显示打开的图片 toolStripProgressBar1.Visible = true; /进度条可视 toolStripProgressBar1.Maximum = 7; /设置进度条最大长度值 toolStripProgressBar1.Value = 0; /设置进度条当前值 toolStripProgressBar1.Step = 1; /设置进度条步长 toolStripProgressBar1.Value += toolStripProgressBar1.Step; /进度条前进 int Var_H = pictureBox1.Image.Height; /获取图象的高度 int Var_W = pictureBox1.Image.Width; /获取图象的宽度 Bitmap Var_bmp = (Bitmap)pictureBox1.Image; /根据图象的大小创建Bitmap对象 double, huiduzhi = new doubleVar_W, Var_H; /用于存储各点灰度值 for (int i = 0; i Var_W; i+) for (int j = 0; j Var_H; j+) Color tem_color = Var_bmp.GetPixel(i, j); /获取当前像素的颜色值 huiduzhii, j = tem_color.R * 0.299 + tem_color.G * 0.587 + tem_color.B * 0.114; /各点灰度值 toolStripProgressBar1.Value += toolStripProgressBar1.Step; double, xingquzhi = new doubleVar_W, Var_H; /用于存储各点兴趣值 for (int i = 2; i Var_W - 2; i+) for (int j = 2; j Var_H - 2; j+) double V1 = 0; for (int m = 0; m 4; m+) V1 = V1 + Math.Pow(huiduzhii - 2 + m, j - huiduzhii - 1 + m, j, 2); /计算V1方向相邻像素灰度差平方和 double V2 = 0; for (int m = 0; m 4; m+) V2 = V2 + Math.Pow(huiduzhii - 2 + m, j - 2 + m - huiduzhii - 1 + m, j - 1 + m, 2); /计算V2方向相邻像素灰度差平方和 double V3 = 0; for (int m = 0; m 4; m+) V3 = V3 + Math.Pow(huiduzhii, j - 2 + m - huiduzhii, j - 1 + m, 2); /计算V3方向相邻像素灰度差平方和 double V4 = 0; for (int m = 0; m 4; m+) V4 = V4 + Math.Pow(huiduzhii - 2 + m, j + 2 - m - huiduzhii - 1 + m, j + 1 - m, 2); /计算V4方向相邻像素灰度差平方和 xingquzhii, j = Math.Min(Math.Min(Math.Min(V1, V2), V3), V4); /从V1、V2、V3、V4中取最小值作为该点兴趣值 toolStripProgressBar1.Value += toolStripProgressBar1.Step; double sum=0; for (int i = 0; i Var_W; i+) for (int j = 0; j 100) c = 0; double yuzhi = pingjunzhi * zeng; /设定阈值 double, jianding = new doubleVar_W, Var_H; for (int i = 0; i Var_W; i+) for (int j = 0; j Var_H; j+) if (xingquzhii, j = yuzhi) jiandingi, j = 0; /选取兴趣值大于阈值的点作为特征候选点,其他点兴趣值归零 else jiandingi, j = 1; houxuan+; int, tezhengzhi1 = new inthouxuan, 2; /假定一个数组能容纳所有点皆为特征点的像素坐标矩阵 int yuzhimuban = 5; /定义阈值模板 int mubanbanchuang = 2; for (int i = mubanbanchuang; i Var_W - mubanbanchuang; i = i + yuzhimuban) for (int j = mubanbanchuang; j Var_H - mubanbanchuang; j = j + yuzhimuban) double MAX = 0; /假定5*5模板最大值起始值为第一个元素值 int a = 0; /设a为最大值行 int b = 0; /设b为最大值列 for (int m = 0; m yuzhimuban; m+) for (int n = 0; n yuzhimuban; n+) if (jiandingi - mubanbanchuang + m, j - mubanbanchuang + n = 1) if (MAX xingquzhii - mubanbanchuang + m, j - mubanbanchuang + n) MAX = xingquzhii - mubanbanchuang + m, j - mubanbanchuang + n; /获取5*5模板中最大值 a = i - mubanbanchuang + m; /获取最大值列 b = j - mubanbanchuang + n; /获取最大值行 else a = 0; b = 0; if (a != 0) & (b != 0) tezhengzhi1c, 0 = a; /存储特征点列 tezhengzhi1c, 1 = b; /存储特征点行 c+; /每有一个既不为0也不重复的最大值特征点数目加一 tezhengzhi = tezhengzhi1; zeng += 1; toolStripProgressBar1.Value += toolStripProgressBar1.Step; toolStripProgressBar1.Value += toolStripProgressBar1.Step; int, tezhengdian2 = new intc, 2; /定义一个数组存储像素坐标 for (int i = 0; i c; i+) for (int j = 0; j 2; j+) tezhengdian2i, j = tezhengzhii,j; tezheng = tezhengdian2; Image img = pictureBox1.Image; /将pictureBox1中图像存储入另一个变量 Bitmap bmp = new Bitmap(img.Width, img.Height); /创建Bitmap对象 Graphics g = Graphics.FromImage(bmp); /创建Graphics对象 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; /设置高质量双三次插值法 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; /设置高质量,低速度呈现平滑程度 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; /设置绘制到此 Graphics 的合成图像的呈现质量 g.DrawImage(img, 0, 0, img.Width, img.Height); /以img为原本重新于(0,0)点绘制 g.Dispose(); /释放资源 for (int i = 0; i c; i+) Graphics myGraphics = Graphics.FromImage(bmp); /创建Graphics对象 myGraphics.DrawLine(new Pen(Color.Red, 1), new Point(tezhengdian2i, 0, tezhengdian2i, 1 - 5), new Point(tezhengdian2i, 0, tezhengdian2i, 1 + 5); /画出竖直方向直线 myGraphics.DrawLine(new Pen(Color.Red, 1), new Point(tezhengdian2i, 0 - 5, tezhengdian2i, 1), new Point(tezhengdian2i, 0 + 5, tezhengdian2i, 1); /画出水平方向直线 myGraphics.Dispose(); /释放资源 pictureBox1.Image = bmp; /显示含有“+”的图

温馨提示

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

评论

0/150

提交评论