首页 / 软件开发 / .NET编程技术 / 图像特征检测(Image Feature Detection)(一)
图像特征检测(Image Feature Detection)(一)2011-05-06 博客园 王先荣前言图像特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信 息,决定每个图像的点是否属于一个图像特征。本文主要探讨如何提取图像中的“角点”这 一特征,及其相关的内容。而诸如直方图、边缘、区域等内容在前文中有所提及,请查看相 关文章。OpenCv(EmguCv)中实现了多种角点特征的提取方法,包括:Harris角点、 ShiTomasi角点、亚像素级角点、SURF角点、Star关键点、FAST关键点、Lepetit关键点等等 ,本文将逐一介绍如何检测这些角点。在此之前将会先介绍跟角点检测密切相关的一些变换 ,包括Sobel算子、拉普拉斯算子、Canny算子、霍夫变换。另外,还会介绍一种广泛使用而 OpenCv中并未实现的SIFT角点检测,以及最近在OpenCv中实现的MSER区域检测。所要讲述的 内容会很多,我这里尽量写一些需要注意的地方及实现代码,而参考手册及书本中有的内容 将一笔带过或者不会提及。Sobel算子Sobel算子用多项式计算来拟合导数计算,可以用OpenCv中的cvSobel函数或者EmguCv中 的 Image<TColor,TDepth>.Sobel方法来进行计算。需要注意的是,xorder和yorder 中必须且只能有一个为非零值,即只能计算x方向或者y反向的导数;如果将方形滤波器的宽 度设置为特殊值CV_SCHARR(-1),将使用Scharr滤波器代替Sobel滤波器。使用Sobel滤波器的示例代码如下:Sobel算子private string SobelFeatureDetect()
{
//获取参数
int xOrder = int.Parse((string) cmbSobelXOrder.SelectedItem);
int yOrder = int.Parse((string) cmbSobelYOrder.SelectedItem);
int apertureSize = int.Parse((string) cmbSobelApertureSize.SelectedItem);
if ((xOrder == 0 && yOrder == 0) || (xOrder != 0 && yOrder != 0))
return "Sobel算子,参数错误:xOrder和yOrder 中必须且只能有一个非零。
";
//计算
Stopwatch sw = new Stopwatch();
sw.Start();
Image<Gray, Single> imageDest = imageSourceGrayscale.Sobel(xOrder, yOrder, apertureSize);
sw.Stop();
//显示
pbResult.Image = imageDest.Bitmap;
//释放资源
imageDest.Dispose();
//返回
return string.Format("·Sobel算子,用时{0:F05}毫秒, 参数(x方向求导阶数:{1},y方向求导阶数:{2},方形滤波器宽度:{3})
", sw.Elapsed.TotalMilliseconds, xOrder, yOrder, apertureSize);
}