边缘特征点提取
- 格式:doc
- 大小:48.00 KB
- 文档页数:18
Python技术实现图像特征提取与匹配的方法随着科技的不断进步,图像处理技术在各个领域得到了广泛应用。
图像特征提取与匹配是图像处理中的重要环节之一,它能够通过识别图像中的关键特征点,进行图像的检索、识别和对比。
Python作为一门功能强大的编程语言,提供了各种库和工具,可以方便地实现图像特征提取与匹配的方法。
一、图像特征提取图像特征是指在图像中具有独特而稳定的可视化特性,例如边缘、角点、颜色分布等。
图像特征提取的目的就是从图像中找到这些独特的特征点,以便后续的处理和分析。
1. 边缘检测边缘是图像中不同区域之间的分界线,是图像中的显著特征。
Python的OpenCV库提供了Sobel算子、Canny算子等用于边缘检测的函数,可以方便地实现边缘检测的过程。
2. 角点检测角点是图像中具有明显曲率或者弯曲的地方,是图像中的显著特征。
OpenCV 中的Harris角点检测算法和Shi-Tomasi角点检测算法提供了在Python中实现角点检测的函数。
3. SIFT和SURF特征提取SIFT(尺度不变特征变换)和SURF(加速稳健特征)是两种经典的特征提取算法,它们可以提取图像中的局部特征,并具有旋转、尺度不变性。
Python中的OpenCV库提供了SIFT和SURF算法的实现,可以方便地提取图像的特征。
二、图像特征匹配图像特征匹配是将两幅或多幅图像中的特征点进行对齐和匹配。
通过图像特征匹配,可以实现图像的检索、识别和对比,是图像处理中的重要环节。
1. 特征点描述在进行图像特征匹配之前,需要对特征点进行描述。
描述子是一种对特征点进行数学表示的方法,可以用于特征点的匹配和对比。
OpenCV中的SIFT和SURF 算法可以提取特征点的描述子。
2. 特征点匹配特征点匹配是将两个图像中的对应特征点连接起来,实现图像的对齐和匹配。
OpenCV中提供了FLANN(最近邻搜索)库,可以高效地实现特征点的匹配。
同时,还可以使用RANSAC算法进行特征点匹配的筛选和优化。
几种特征点提取算子的分析和比较特征点提取是计算机视觉中的一个重要任务,用于定位和描述图像中的重要局部特征,如角点、边缘、斑点等。
通过提取图像的特征点,可以实现目标识别、图像配准、图像检索等任务。
常用的特征点提取算子包括Harris角点检测算子、SIFT(尺度不变特征变换)算子、SURF(加速稳健特征)算子和FAST(快速特征点)算子。
下面对这几种算子进行分析和比较。
1. Harris角点检测算子:Harris角点检测算子是一种基于图像亮度变化的角点检测方法。
它通过计算图像每个像素的Harris响应函数来判断是否为角点。
Harris算子具有旋转不变性和尺度不变性的优点,但对于光照变化比较敏感。
2.SIFT算子:SIFT算子是一种局部特征描述算子,通过尺度空间的不变性和局部光度不变性来提取特征点。
SIFT算子对旋转、尺度、光照和仿射变化具有较好的不变性,适用于一些复杂场景下的目标识别和图像匹配任务。
3.SURF算子:SURF算子是一种基于SIFT算子的加速算法,它通过使用积分图像和快速Hessian矩阵的计算方法,提高了特征点提取的效率。
SURF算子在保持SIFT算子的不变性的基础上,显著提升了运算速度。
4.FAST算子:FAST算子是一种基于灰度阈值的快速特征点提取算子。
FAST算子速度快,适用于实时应用和大规模图像处理任务。
但FAST算子对于尺度和旋转变化较为敏感,不适用于复杂场景下的图像处理任务。
综上所述,不同的特征点提取算子适用于不同的图像处理任务。
如果要求高精度、高稳定性和较好的不变性,可以选择SIFT或SURF算子;如果要求处理速度较快,可以选择FAST算子。
实际应用中,可以根据具体需求选择适合的算子或者结合多个算子进行特征点提取,以达到更好的效果。
特征点提取与深度估计
特征点提取和深度估计是计算机视觉领域中的两个重要问题,它们在许多视觉任务中起着关键作用。
特征点提取是指从图像中识别出具有显著特征的点,这些点通常具有不变性和区分性,能够用于匹配、跟踪和识别物体。
常见的特征点包括角点、边缘点和斑点等。
特征点提取的方法包括Harris角点检测、SIFT(尺度不变特征变换)、SURF(加速稳健特征)等。
深度估计是指从单个图像或图像序列中推断出场景的三维深度信息。
深度估计可以用于构建三维模型、姿态估计、遮挡检测等任务。
深度估计的方法包括基于视差的方法、基于结构光的方法、基于深度学习的方法等。
近年来,随着深度学习的发展,基于神经网络的深度估计方法取得了很大的进展,如使用卷积神经网络(CNN)进行端到端的深度估计。
特征点提取和深度估计通常是相辅相成的,它们经常在许多计算机视觉应用中同时使用。
例如,在SLAM(同时定位与地图构建)中,特征点提取用于提取场景中的关键点,深度估计用于估计相机的运动和场景的三维结构。
在自动驾驶中,特征点提取和深度估计可以用于实时的环境感知和障碍物检测。
在增强现实中,特征点提
取和深度估计可以用于实时的场景重建和虚拟物体的叠加。
总的来说,特征点提取和深度估计是计算机视觉中的两个核心
问题,它们的发展对于提高视觉系统的性能和鲁棒性具有重要意义。
随着技术的不断进步和深度学习的应用,特征点提取和深度估计的
方法也在不断地得到改进和拓展,将为更多的视觉任务提供更加可
靠和有效的解决方案。
图像处理中的边缘检测和特征提取方法图像处理是计算机视觉领域中的关键技术之一,而边缘检测和特征提取是图像处理中重要的基础操作。
边缘检测可以帮助我们分析图像中的轮廓和结构,而特征提取则有助于识别和分类图像。
本文将介绍边缘检测和特征提取的常见方法。
1. 边缘检测方法边缘检测是指在图像中找到不同区域之间的边缘或过渡的技术。
常用的边缘检测方法包括Sobel算子、Prewitt算子和Canny算子。
Sobel算子是一种基于梯度的边缘检测算法,通过对图像进行卷积操作,可以获取图像在水平和垂直方向上的梯度值,并计算获得边缘的强度和方向。
Prewitt算子也是一种基于梯度的边缘检测算法,类似于Sobel算子,但其卷积核的权重设置略有不同。
Prewitt算子同样可以提取图像的边缘信息。
Canny算子是一种常用且经典的边缘检测算法。
它结合了梯度信息和非极大值抑制算法,可以有效地检测到图像中的边缘,并且在边缘检测的同时还能削弱图像中的噪声信号。
这些边缘检测算法在实际应用中常常结合使用,选择合适的算法取决于具体的任务需求和图像特点。
2. 特征提取方法特征提取是指从原始图像中提取出具有代表性的特征,以便进行后续的图像分析、识别或分类等任务。
常用的特征提取方法包括纹理特征、形状特征和颜色特征。
纹理特征描述了图像中的纹理信息,常用的纹理特征包括灰度共生矩阵(GLCM)、局部二值模式(LBP)和方向梯度直方图(HOG)。
GLCM通过统计图像中像素之间的灰度变化分布来描述纹理特征,LBP通过比较像素与其邻域像素的灰度值来提取纹理特征,HOG则是通过计算图像中梯度的方向和强度来提取纹理特征。
这些纹理特征可以用于图像分类、目标检测等任务。
形状特征描述了图像中物体的形状信息,常用的形状特征包括边界描述子(BDS)、尺度不变特征变换(SIFT)和速度不变特征变换(SURF)。
BDS通过提取物体边界的特征点来描述形状特征,SIFT和SURF则是通过提取图像中的关键点和描述子来描述形状特征。
点云边缘特征提取
点云边缘特征提取是指从点云数据中提取出具有边缘特征的点或点云区域。
边缘特征通常表示了物体的边界或者不连续变化的部分,对于点云的分割、识别和重建等任务都具有重要的意义。
以下是几种常用的点云边缘特征提取方法:
1. 法线估计:通过计算点云中每个点的法线方向,可以获得点云的法线信息。
边缘通常对应着法线变化较大的区域。
2. 曲率计算:曲率表示了点云表面的弯曲程度。
可以通过计算点云上每个点的曲率来判断点云是否存在边缘区域。
3. 点云聚类:通过将点云数据进行聚类,可以将边缘区域与其他区域分开。
一种常用的点云聚类算法是基于区域生长的方法。
4. 深度图像分析:将点云数据转换为深度图像,然后使用传统的边缘检测算法,如Canny算法等,来提取边缘特征。
5. 高斯曲率计算:高斯曲率表示了点云曲面的凸凹性。
可以通过计算点云上每个点的高斯曲率来找到边缘区域。
6. 深度学习方法:近年来,深度学习方法在点云处理领域取得了很大的进展。
可以使用深度学习模型来提取点云的边缘特征,如PointNet, PointNet++, PointCNN等。
以上是一些常见的点云边缘特征提取方法,具体选择方法可以根据应用需求和实际情况来确定。
地形特征点的提取实验报告地形特征点的提取是一种重要的地理信息处理过程,它可以帮助我们对地形进行定量分析和判断地形类型。
本实验主要探讨了三种常见的地形特征点提取算法,包括高斯滤波算法、Sobel算子算法和Canny算子算法,并通过实验验证了它们的可行性和有效性。
首先,高斯滤波算法是一种常见的平滑滤波算法,可以有效地抑制噪声,同时保留图像的边缘信息。
在地形特征点提取实验中,我们首先对原始地形数据进行高斯滤波处理,使得图像变得平滑。
然后,通过计算图像的梯度,可以得到图像中的边缘信息,边缘处即为地形特征点。
高斯滤波算法主要是通过卷积操作实现,具体的算法流程如下:1. 将地形数据转换为灰度图像。
2. 定义高斯核函数,例如3x3或5x5的高斯核。
3. 将高斯核应用于灰度图像,通过卷积操作实现平滑化。
4. 计算平滑后图像的梯度,得到边缘信息。
5. 使用阈值化方法将边缘信息转化为二值图像,边缘处即为地形特征点。
其次,Sobel算子算法是一种常见的图像边缘检测算法,可以有效提取图像的边缘信息。
在地形特征点提取实验中,我们可以将Sobel算子应用于地形数据,以检测地形的边缘。
该算法的主要流程如下:1. 将地形数据转换为灰度图像。
2. 定义Sobel算子,例如3x3的水平和垂直卷积核。
3. 将Sobel算子应用于灰度图像,分别计算水平和垂直方向上的导数值。
4. 根据导数值的大小确定边缘位置,即特征点所在处。
最后,Canny算子算法是一种常见的图像边缘检测算法,可以实现较高的边缘检测准确性和鲁棒性。
在地形特征点提取实验中,我们可以将Canny算子应用于地形数据,以提取地形的边缘和特征点。
该算法的主要流程如下:1. 将地形数据转换为灰度图像。
2. 对灰度图像进行高斯滤波,以去除噪声。
3. 计算图像的梯度幅值和方向。
4. 应用非极大值抑制,以细化边缘。
5. 使用双阈值算法进行边缘连接,形成闭合的轮廓。
6. 通过筛选边缘像素,得到地形特征点。
医学图像配准中的图像特征提取与匹配医学图像配准是指将多个医学图像按照相同的参考系统进行对齐,以实现不同图像之间的对比和分析。
在医学图像配准的过程中,图像特征提取与匹配是关键的步骤之一。
本文主要介绍医学图像配准中的图像特征提取与匹配的方法和技术。
1. 图像特征提取图像特征提取是指从医学图像中提取有用的、能够表征图像信息的特征。
医学图像中的特征可以包括形状、纹理、边缘等。
常用的图像特征提取方法包括:(1)边缘检测:边缘是图像中灰度变化较大的地方,边缘检测可以通过计算图像像素间的灰度差异来提取边缘信息。
(2)纹理特征提取:纹理是描述图像内部灰度分布的一种特征。
常见的纹理特征提取方法包括灰度共生矩阵、小波变换等。
(3)形状特征提取:形状是指物体的外观轮廓,可以通过提取轮廓特征、边界特征等来描述图像的形状。
2. 图像特征匹配图像特征匹配是指将不同图像中提取到的特征进行对应,以实现医学图像的配准。
医学图像特征匹配常用的方法有:(1)特征点匹配:通过提取图像中的特征点,并计算特征点间的相似性来实现匹配。
常用的特征点匹配算法有SIFT、SURF、ORB等。
(2)区域匹配:将图像划分为不同的区域,通过计算每个区域的特征来进行匹配。
常用的区域匹配方法有基于颜色直方图、基于形状特征等。
(3)局部匹配:先将图像进行分块,然后通过比较每个块的特征来实现匹配。
常用的局部匹配算法有基于SIFT局部特征的匹配方法。
3. 医学图像配准算法医学图像配准算法主要包括基于特征的配准算法和基于区域的配准算法。
(1)基于特征的配准算法:这类算法主要利用图像中提取到的特征进行匹配和配准。
常用的算法有Harris角点算法、SIFT算法等。
特征点匹配算法在医学图像配准中具有较好的鲁棒性和准确性。
(2)基于区域的配准算法:这类算法主要针对整个图像区域进行匹配和配准。
常用的算法有基于互信息和归一化互相关系数的方法。
区域匹配算法在医学图像配准中更适用于相似度较低的图像配准。
特征点提取特征点提取,也称为特征检测,是图像处理领域的一个重要的领域,是非常重要的一个步骤,主要用于检测和描述图像中的视觉特征。
它不仅仅可以检测图像内部的轮廓,还可以发现图像中的局部特征,在许多应用场景中,特征点提取及其他处理方法都是使用该领域技术的基础。
在应用特征点提取之前,我们首先要了解它的基本原理以及获得信息对象所必要的步骤,有助于从图像中挖掘出有价值的信息并使用它们为后续的应用做准备。
1.处理预处理是特征点提取的前提,是将原始图像进行加工并经过一系列处理,以满足特定应用需求的过程。
其核心思想是将无关性信息除去,而重要信息更容易被发现,以便更好地得到特征点。
通常有以下几种操作:1)灰度化处理:由于颜色信息对特征提取无关,因此灰度化处理可以减少图像的数据量,提高提取特征点的效率和准确率。
2)去噪处理:去噪处理是图像中的重要步骤,可有效去除图像中噪声的干扰,提高特征提取的准确性。
3)滤波处理:滤波处理的目的是去除图像中的毛刺和损坏的边缘,使图像信息更加清晰,从而更容易检测到特征点。
2.特征提取特征提取是将图像中有价值的信息以特定的形式提取出来的过程。
它包括检测轮廓特征、局部特征和局部模式,以及许多其他技术。
(1)轮廓特征检测轮廓特征一般指的是一组有用的点,用以描述一个物体的形状、大小以及它与周围环境的关系,如圆形物体的半径、边框线、拐角等。
轮廓特征检测最常用的算法是Canny边缘检测,用于检测图像边缘的强度。
(2)局部特征提取局部特征提取是指从图像中提取出小尺度特征,此类特征不仅可以提取图像中的简单特征,还可以用于复杂场景的特征分析。
局部特征提取算法中常用的算法有SIFT和SURF。
(3)局部模式检测局部模式检测是从图像中检测出小范围的图像模式的技术,如纹理、斑点等,它是一种赋予图像更多的细节描述的方法,可以获得更多的细节特征。
局部模式检测中常用的算法有Gabor滤波器和LBP (Local Binary Patterns)。
slam特征点SLAM特征点SLAM(Simultaneous Localization and Mapping)是一种在未知环境中同时进行定位和建图的技术。
在SLAM中,特征点是非常重要的一部分,它们被用来描述环境中的关键信息,帮助机器人进行定位和建图。
本文将介绍SLAM特征点的定义、提取方法以及在SLAM中的应用。
一、特征点的定义特征点,又称为关键点,是图像中具有显著性、可重复性和独特性的点。
它们通常在不同图像中具有相似的外观和特征,可以被用来进行匹配和跟踪。
在SLAM中,特征点被用来构建地图和进行机器人的定位。
二、特征点的提取方法1. 角点检测:角点是图像中具有尖锐变化的点,通常位于物体的边缘或转角处。
常用的角点检测算法有Harris角点检测和Shi-Tomasi角点检测。
2. 边缘检测:边缘是图像中灰度变化较大的区域,通常可以通过计算梯度来检测。
常用的边缘检测算法有Sobel算子和Canny边缘检测。
3. 斑点检测:斑点是图像中具有一定纹理的区域,通常可以通过计算图像的局部方差来检测。
常用的斑点检测算法有Harris-Laplace 和Hessian-Laplace。
4. SIFT特征:尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)是一种在不同尺度和旋转下具有不变性的特征描述子。
SIFT特征点可以通过检测图像中的极值点来提取。
5. SURF特征:加速稳健特征(Speeded Up Robust Features,SURF)是一种快速计算的特征描述子。
SURF特征点可以通过检测图像中的兴趣点来提取。
三、特征点在SLAM中的应用SLAM中的特征点主要用于定位和建图。
在定位过程中,机器人通过匹配当前图像中的特征点和地图中已知的特征点,来估计自己的位置。
在建图过程中,机器人通过检测当前图像中的新特征点,并将其加入地图中,来实时更新地图。
特征点的应用使得SLAM系统能够在未知环境中实现精确的定位和建图。
图像特征提取及描述算法分析图像特征提取及描述算法是计算机视觉领域的核心内容之一,其在图像处理、模式识别和计算机视觉任务中扮演着重要的角色。
本文将分析一些常用的图像特征提取及描述算法,包括边缘检测、角点检测、尺度不变特征变换(SIFT)和高级表观算子(HOG),以及它们在实际应用中的优缺点。
边缘检测是图像处理中常用的特征提取方法之一。
边缘是图像中灰度变化最明显的地方,通常包含了物体的轮廓和纹理信息。
常用的边缘检测算法有Sobel算子、Prewitt算子和Canny边缘检测算法。
Sobel算子和Prewitt算子是基于局部差分的算法,通过计算像素点邻域内灰度值的差异来检测边缘。
Canny边缘检测算法在Sobel算子的基础上添加了非最大抑制和双阈值处理,能够在减少噪声的同时保留重要的边缘信息。
边缘检测算法在许多图像处理和计算机视觉任务中都有广泛的应用,例如目标检测、图像分割和图像识别等。
角点检测是另一种常用的图像特征提取算法,它主要用于寻找图像中的角点或感兴趣点。
角点是图像中两条或多条边缘相交的地方,通常具有良好的鲁棒性和唯一性。
常用的角点检测算法有SIFT算法、Harris角点检测算法和FAST角点检测算法。
SIFT算法通过在不同尺度空间上进行高斯模糊和建立尺度空间极值点来寻找图像中的关键点。
Harris角点检测算法基于图像灰度的变化率来检测角点,通过计算图像的梯度和结构矩阵的特征值来判断像素点是否为角点。
FAST角点检测算法则是通过快速的像素比较来寻找图像中的角点。
角点检测算法在图像配准、目标跟踪和三维重建等领域有广泛的应用。
尺度不变特征变换(SIFT)是一种用于图像特征提取和描述的经典算法。
SIFT 算法通过在不同尺度空间上构建高斯金字塔和相对梯度直方图来提取图像的局部不变特征。
SIFT特征具有旋转不变性和尺度不变性,能够在不同角度和尺度下描述同一物体的特征。
SIFT算法在目标识别、图像匹配和三维重建等领域有广泛的应用。
边缘特征点提取这个是主程序:界面和代这using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace 这这这这这影量作1{public partial class Form1 : Form{public Form1(){InitializeComponent();}private string curFileName;private System.Drawing.Bitmap curBitmap;int a =0;int b =0;int n = 0;int count = 0;private void button2_Click(object sender, EventArgs e){OpenFileDialog of = new OpenFileDialog();of.Filter = "JPG这像(*.jpg)|*.jpg|BMP这像(*.bmp)|*.bmp|所有文件(*.*)|*.*";of.Title = "打文件这这这";of.ShowDialog();curFileName = of.FileName;try{curBitmap = (Bitmap)Image.FromFile(curFileName);}catch(Exception ex){MessageBox.Show("出这!" + ex.Message);}pictureBox1.Image = Image.FromFile(curFileName );}private void button1_Click(object sender, EventArgs e){button4.Visible = true;int i,j,k,m;double V1 = 0, V2 = 0,V3 =0, V4 = 0;double [,]V= new double [curBitmap.Width, curBitmap.Height];double [,] VV = new double[curBitmap.Width, curBitmap.Height];int [,] Gray = new int[curBitmap.Width, curBitmap.Height];for (i=0;i<curBitmap .Width ;i++)for (j = 0; j < curBitmap.Height; j++){Color pixelColor = this.curBitmap.GetPixel(i,j);Gray[i, j] = (int )(pixelColor.R * 0.299 + pixelColor.G * 0.587 + pixelColor.B *0.114);//灰度算公式这这这这}for (i=2;i<curBitmap .Width -2;i++)for (j = 2; j < curBitmap.Height-2; j++){for (k = -2; k < 2; k++){V1 += (Gray[i + k, j] - Gray[i + k + 1, j]) * (Gray[i + k, j] - Gray[i + k + 1, j]);V2 += (Gray[i + k, j + k] - Gray[i + k + 1, j + k + 1]) * (Gray[i + k, j + k] - Gray[i+ k + 1, j + k + 1]);V3 += (Gray[i, j + k] - Gray[i, j + k + 1]) * (Gray[i, j + k] - Gray[i, j + k + 1]);V4 += (Gray[i - k, j + k] - Gray[i - k - 1, j + k + 1]) * (Gray[i - k, j + k] - Gray[i -k - 1, j + k + 1]);}V[i, j] = MaxMin.MyMin(V1, V2, V3, V4);V1 = 0; V2 = 0; V3 = 0; V4 = 0;}for (i = 2; i < curBitmap.Width - 2; i++)for (j = 2; j < curBitmap.Height - 2; j++){try{if (V[i, j] >= Convert.ToDouble(textBox1.Text)){VV[i, j] = 1;}else{VV[i, j] = 0;}}catch (Exception ex){MessageBox.Show("这这这这这入出:"+ex.Message);}}int WindowsScal=comboBox1.SelectedIndex;if (WindowsScal == 0)WindowsScal = 2;else if (WindowsScal == 1)WindowsScal = 3;else if (WindowsScal == 2)WindowsScal = 4;elseMessageBox.Show("这这这特征点窗口模板大小");m = WindowsScal * 2 + 1;double temp;int wsi=WindowsScal;int wsj=WindowsScal;int[] Record = new int[curBitmap.Width * curBitmap.Height ]; bool bol = true;do{temp = 0;for (i = wsi; i < wsi + m; i++) {for (j = wsj; j < wsj + m; j++) {if (VV[i, j] == 1){if (temp < V[i, j]){temp = V[i, j];a = i;b = j;}}else{a = 0;b = 0;}}}Record[n++] = a;Record[n++] = b;a = 0;b = 0;if(curBitmap .Width - (wsi + m)<m){wsj+=m;wsi = WindowsScal;}else if (curBitmap.Height - (wsj + m) <m){bol = false;}else{wsi += m;}} while (bol);for (i = 0; i < n; i = i + 2){if (Record[i] != 0 && Record[i + 1] != 0){count ++;DrawCircle.circle(Record[i], Record[i + 1],pictureBox1);richTextBox1.Text = richTextBox1.Text + '\n' + " " +Record[i] + " " + Record[i+ 1] +" " +Gray[Record[i], Record[i + 1]]+" "+V[Record[i], Record[i + 1]];}}label3.Text = count.ToString()+"个";pictureBox1.Refresh();MessageBox.Show("这理完成:");}private void button3_Click(object sender, EventArgs e){SaveFileDialog sf = new SaveFileDialog();sf.Filter = "特征点数据|*.dat";sf.FileName = "特征点数据";sf.ShowDialog();FileStream fs = new FileStream(sf.FileName , FileMode.Append); StreamWriter sw = new StreamWriter(fs, Encoding.Default);sw.Write(richTextBox1.Text);sw.Close();fs.Close();}private void button4_Click(object sender, EventArgs e){string str;if (pictureBox1.Image != null){Bitmap box1 = new Bitmap(pictureBox1.Image);SaveFileDialog sv = new SaveFileDialog();sv.Filter = "jpg文件|*.jpg";sv.ShowDialog();str = sv.FileName;box1.Save(str);}else{MessageBox.Show("没有片:这这这");}}}}//////////////////////////////////////////////////////////////////// //////////////////////////////////下面是各这这这:第一个是比大小这这这using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace 这这这这这影量作1{public partial class Form1 : Form{public Form1(){InitializeComponent();}private string curFileName;private System.Drawing.Bitmap curBitmap;int a =0;int b =0;int n = 0;int count = 0;private void button2_Click(object sender, EventArgs e){OpenFileDialog of = new OpenFileDialog();of.Filter = "JPG这像(*.jpg)|*.jpg|BMP这像(*.bmp)|*.bmp|所有文件(*.*)|*.*";of.Title = "打文件这这这";of.ShowDialog();curFileName = of.FileName;try{curBitmap = (Bitmap)Image.FromFile(curFileName);}catch(Exception ex){MessageBox.Show("出这!" + ex.Message);}pictureBox1.Image = Image.FromFile(curFileName );}private void button1_Click(object sender, EventArgs e){button4.Visible = true;int i,j,k,m;double V1 = 0, V2 = 0,V3 =0, V4 = 0;double [,]V= new double [curBitmap.Width, curBitmap.Height];double [,] VV = new double[curBitmap.Width, curBitmap.Height];int [,] Gray = new int[curBitmap.Width, curBitmap.Height];for (i=0;i<curBitmap .Width ;i++)for (j = 0; j < curBitmap.Height; j++){Color pixelColor = this.curBitmap.GetPixel(i,j);Gray[i, j] = (int )(pixelColor.R * 0.299 + pixelColor.G * 0.587 + pixelColor.B *0.114);//灰度算公式这这这这}for (i=2;i<curBitmap .Width -2;i++)for (j = 2; j < curBitmap.Height-2; j++){for (k = -2; k < 2; k++){V1 += (Gray[i + k, j] - Gray[i + k + 1, j]) * (Gray[i + k, j] - Gray[i + k + 1, j]);V2 += (Gray[i + k, j + k] - Gray[i + k + 1, j + k + 1]) * (Gray[i + k, j + k] - Gray[i+ k + 1, j + k + 1]);V3 += (Gray[i, j + k] - Gray[i, j + k + 1]) * (Gray[i, j + k] - Gray[i, j + k + 1]);V4 += (Gray[i - k, j + k] - Gray[i - k - 1, j + k + 1]) * (Gray[i - k, j + k] - Gray[i -k - 1, j + k + 1]);}V[i, j] = MaxMin.MyMin(V1, V2, V3, V4);V1 = 0; V2 = 0; V3 = 0; V4 = 0;}for (i = 2; i < curBitmap.Width - 2; i++)for (j = 2; j < curBitmap.Height - 2; j++){try{if (V[i, j] >= Convert.ToDouble(textBox1.Text)) {VV[i, j] = 1;}else{VV[i, j] = 0;}}catch (Exception ex){MessageBox.Show("这这这这这入出:"+ex.Message); }}int WindowsScal=comboBox1.SelectedIndex;if (WindowsScal == 0)WindowsScal = 2;else if (WindowsScal == 1)WindowsScal = 3;else if (WindowsScal == 2)WindowsScal = 4;elseMessageBox.Show("这这这特征点窗口模板大小");m = WindowsScal * 2 + 1;double temp;int wsi=WindowsScal;int wsj=WindowsScal;int[] Record = new int[curBitmap.Width * curBitmap.Height ]; bool bol = true;do{temp = 0;for (i = wsi; i < wsi + m; i++){for (j = wsj; j < wsj + m; j++){if (VV[i, j] == 1){if (temp < V[i, j]){temp = V[i, j];a = i;b = j;}}else{a = 0;b = 0;}}}Record[n++] = a;Record[n++] = b;a = 0;b = 0;if(curBitmap .Width - (wsi + m)<m){wsj+=m;wsi = WindowsScal;}else if (curBitmap.Height - (wsj + m) <m) {bol = false;}else{wsi += m;}} while (bol);for (i = 0; i < n; i = i + 2){if (Record[i] != 0 && Record[i + 1] != 0) {count ++;DrawCircle.circle(Record[i], Record[i + 1],pictureBox1);richTextBox1.Text = richTextBox1.Text + '\n' + " " +Record[i] + " " + Record[i+ 1] +" " +Gray[Record[i], Record[i + 1]]+" "+V[Record[i], Record[i + 1]];}}label3.Text = count.ToString()+"个";pictureBox1.Refresh();MessageBox.Show("这理完成:");}private void button3_Click(object sender, EventArgs e){SaveFileDialog sf = new SaveFileDialog();sf.Filter = "特征点数据|*.dat";sf.FileName = "特征点数据";sf.ShowDialog();FileStream fs = new FileStream(sf.FileName , FileMode.Append);StreamWriter sw = new StreamWriter(fs, Encoding.Default);sw.Write(richTextBox1.Text);sw.Close();fs.Close();}private void button4_Click(object sender, EventArgs e){string str;if (pictureBox1.Image != null){Bitmap box1 = new Bitmap(pictureBox1.Image);SaveFileDialog sv = new SaveFileDialog();sv.Filter = "jpg文件|*.jpg";sv.ShowDialog();str = sv.FileName;box1.Save(str);}else{MessageBox.Show("没有片:这这这");}}}}//////////////////////////////////////////////////////////////////// //////////////////////////////////第二个:这在像上面做这这这这这这这using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace 这这这这这影量作1{public class DrawCircle{public static void circle(int CursorX, int CursorY, PictureBox pictureBox1){Graphics g;g = Graphics.FromImage(pictureBox1.Image);//g.DrawEllipse(new Pen(Color.Green, 1), CursorX - r, CursorY - r, 2 * r, 2 * r);g.DrawLine(new Pen(Color.Red, 1), CursorX-8, CursorY,CursorX+8, CursorY);g.DrawLine(new Pen(Color.Red, 1), CursorX, CursorY - 8, CursorX, CursorY + 8);}}。