Ⅰ 如何利用opencv实现彩色图像边缘检测算法
在opencv中显示边缘检测很简单,只需调用一个cvCanny函数,其使用的是Canny算法来实现对图像的边缘检测.
函数原型为:
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
第一个参数为待检测的图像,注意一点,其必须是灰度图.
第二个参数为输出的边缘图,其也是一个灰度图.
后三个参数与Canny算法直接相关,threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割,aperture_size算子内核大小,可以去看看Canny算法.
从彩色图到灰度图需要使用到cvCvtColor函数,其接受三个参数,第一为输入,第二为输出,第三个为转换的标识,我们这边是RGB到GRAY,使用的是CV_RGB2GRAY.
参考demo代码如下:
#include <iostream>
#include <string>
#include <sstream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace std;
int String2int(const string& str_)
{
int _nre = 0;
stringstream _ss;
_ss << str_;
_ss >> _nre;
return _nre;
}
void DoCanny(const string& strFileName_)
{
//原彩色图片
IplImage* _pIplImageIn = cvLoadImage(strFileName_.data());
if (_pIplImageIn == NULL)
{
return;
}
//彩色图片转换成灰度图放置的图片
IplImage* _pIplImageCanny = cvCreateImage(cvGetSize(_pIplImageIn), _pIplImageIn->depth, 1);
cvCvtColor(_pIplImageIn, _pIplImageCanny, CV_RGB2GRAY);//CV_RGB2GRAY将rgb图转成灰度图
//只有边缘路径的图片
IplImage* _pIplImageOut = cvCreateImage(cvGetSize(_pIplImageIn), IPL_DEPTH_8U, 1);
//边缘检测只能作用于灰度图
if (_pIplImageCanny->nChannels != 1)
{
return;
}
//边缘检测操作
cvCanny(_pIplImageCanny, _pIplImageOut, 1, 110, 3);
cvNamedWindow("Src");
cvShowImage("Src", _pIplImageIn);
cvNamedWindow("Canny");
cvShowImage("Canny", _pIplImageOut);
cvWaitKey(0);
cvReleaseImage(&_pIplImageIn);
cvReleaseImage(&_pIplImageCanny);
cvReleaseImage(&_pIplImageOut);
cvDestroyWindow("Src");
cvDestroyWindow("Canny");
}
int main(int argc, char* argv[])
{
if (argc < 2)
{
cout << "You should give the filename of picture!" << endl;
return -1;
}
DoCanny(argv[1]);
return 0;
}
Ⅱ 边缘检测的检测边缘
如果将边缘认为是一定数量点亮度发生变化的地方,那么边缘检测大体上就是计算这个亮度变化的导数。为简化起见,我们可以先在一维空间分析边缘检测。在这个例子中,我们的数据是一行不同点亮度的数据。例如,在下面的1维数据中我们可以直观地说在第4与第5个点之间有一个边界:
除非场景中的物体非常简单并且照明条件得到了很好的控制,否则确定一个用来判断两个相邻点之间有多大的亮度变化才算是有边界的阈值,并不是一件容易的事。实际上,这也是为什么边缘检测不是一个微不足道问题的原因之一。
检测方法
有许多用于边缘检测的方法, 他们大致可分为两类:基于搜索和基于零交叉。
基于搜索的边缘检测方法首先计算边缘强度, 通常用一阶导数表示, 例如梯度模,然后,用计算估计边缘的局部方向, 通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。
基于零交叉的方法找到由图像得到的二阶导数的零交叉点来定位边缘。 通常用拉普拉斯算子或非线性微分方程的零交叉点。
滤波做为边缘检测的预处理通常是必要的,通常采用高斯滤波。
已发表的边缘检测方法应用计算边界强度的度量,这与平滑滤波有本质的不同。 正如许多边缘检测方法依赖于图像梯度的计算,他们用不同种类的滤波器来估计x-方向和y-方向的梯度。
计算一阶导数
许多边缘检测操作都是基于亮度的一阶导数——这样就得到了原始数据亮度的梯度。使用这个信息我们能够在图像的亮度梯度中搜寻峰值。如果 I(x) 表示点 x 的亮度,I′(x) 表示点 x 的一阶导数(亮度梯度),这样我们就会发现:
对于更高性能的图像处理来说,一阶导数能够通过带有掩码的原始数据(1维)卷积计算得到。
计算二阶导数
其它一些边缘检测操作是基于亮度的二阶导数。这实质上是亮度梯度的变化率。在理想的连续变化情况下,在二阶导数中检测过零点将得到梯度中的局部最大值。另一方面,二阶导数中的峰值检测是边线检测,只要图像操作使用一个合适的尺度表示。如上所述,边线是双重边缘,这样我们就可以在边线的一边看到一个亮度梯度,而在另一边看到相反的梯度。这样如果图像中有边线出现的话我们就能在亮度梯度上看到非常大的变化。为了找到这些边线,我们可以在图像亮度的二阶导数中寻找过零点。如果 I(x) 表示点 x 的亮度,I′′(x) 表示点 x 亮度的二阶导数,那么:
同样许多算法也使用卷积掩码快速处理图像数据:
步骤:
①滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折中。
②增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域(或局部)强度值有显着变化的点突显出来。边缘增强一般是通过计算梯度幅值来完成的。
③检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。最简单的边缘检测判据是梯度幅值阈值判据。
④定位:如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来。在边缘检测算法中,前三个步骤用得十分普遍。这是因为大多数场合下,仅仅需要边缘检测器指出边缘出现在图像某一像素点的附近,而没有必要指出边缘的精确位置或方向。
边缘检测的实质是采用某种算法来提取出图像中对象与背景间的交界线。我们将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的的。
Ⅲ canny边缘检测算法 滤波用什么方法好
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
(1)最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
(2)最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
(3)检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。
为了满足这些要求 Canny 使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数。
Ⅳ 图像的边缘检测原理是什么啊
边缘通常都是一边亮,一边暗
边缘检测就是利用亮 与 暗 之间的梯度变化
Ⅳ 边缘检测的理论依据是什么有哪些方法各有什么特点
就是通过一些临近像素相关算法突出灰度变化比较大的部分。变化平缓的取值低,变化越剧烈取值越高。比如有卷积算法,具体计算方法,有拉普拉斯算子、高斯算子等的应用。
Ⅵ 边缘检测算法中为什么阈值影响检测效果
canny边缘检测的实现大致有4步:1.高斯滤波对图像去噪。2.由原始灰度图求出纵横2个梯度图,以及综合梯度图(求梯度的算子很多)。3.结合3个 梯度图来进行非极大抑制(此步一过,检测的图像边缘已经很细了)4.进行边缘连接(个人感觉这一步虽叫连接,算法也确实体现了连接的行为,但那是强边缘到 弱边缘的连接,所有可能连接的点都出不了非极大抑制后的范围,所以这一步更准确的目的应该是在非极大抑制的结果中去除假边缘保留真边缘,同时又能让保留的 边缘尽量连贯真实)5.对边缘进行细化(这步在matlab的canny算法中有,但是考虑到通过以上4步尤其是第3步得到的边缘已经很细,一般没有再对 边缘进行细化的必要,因此,此步可以省略)
上述4步中,前两步比较简单,实现的关键在于后两步。这里对第二步也概括的说一下,求纵横梯度的算子是很多的,像3×3的sobel算子,其卷积核是 [1,0,-1;1,0,-1;1,0,-1]和[1,1,1;0,0,0;-1,-1,-1];2×2的robert算子,其卷积核是 [1,-1;1,-1]和[1,1;-1,-1]。而我们学习matlab中canny检测的算法,在第一步滤波和第二步求纵横梯度时用的都是高斯模版。 注意,滤波的模版系数之和为1,求梯度的模版系数之和为0,这是卷积模版的一个规律。我们滤波和求梯度的模版都是二维的高斯模版,但是用纵横2次两个一维 的高斯卷积模版进行卷积可以达到和一个二维模版一样的效果,同时减小了总计算量,所以,在第一步滤波的时候我们用两个一维高斯模版代替一个二维高斯模版, 但是第二步的高斯模版牵扯到梯度方向,所以还是用一个二维的高斯模版来直接卷积。
Ⅶ 图像边缘检测算法有哪些
早期的有边缘算子法、曲线拟合法、模板匹配法、门限化法。近年来又有许多新的边缘检测的算法:小波变换、小波包的边缘检测等,基于数学形态学、模糊理论和神经网络的边缘检测算法等。