void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 );
image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aperture_sizeSobel 算子内核大小 (见 cvSobel).
函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
- 注意事项:cvCanny只接受单通道图像作为输入。
- 外部链接:经典的canny自调整阈值算法的一个opencv的实现见在OpenCV中自适应确定canny算法的分割门限
- 参考OpenCV中文官网:http://www.opencv.org.cn/index.php/Cv图像处理#Canny
点击(此处)折叠或打开
- #include
"stdafx.h"
- #include
<</SPAN>cv.h>
- #include
<</SPAN>cxcore.h>
- #include
<</SPAN>highgui.h>
- #include
<</SPAN>cmath>
- using namespace std;
- using namespace cv;
-
- int
main(int argc ,char ** argv)
- {
-
IplImage * pImg=NULL;
-
IplImage * pCannyImg=NULL;
-
-
if (argc ==2&&(pImg=cvLoadImage(argv[1],0))!=0)
-
{
-
pCannyImg=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
-
-
cvCanny(pImg,pCannyImg,50,150,3);
-
//创建窗口
-
cvNamedWindow("src", 1);
-
cvNamedWindow("canny",1);
-
-
-
//显示图像
-
cvShowImage( "src", pImg );
-
cvShowImage( "canny", pCannyImg );
-
-
cvWaitKey(0); //等待按键
-
-
//销毁窗口
-
cvDestroyWindow( "src" );
-
cvDestroyWindow( "canny" );
-
//释放图像
-
cvReleaseImage( &pImg );
-
cvReleaseImage( &pCannyImg );
-
-
return 0;
-
}
-
return -1;
- }
图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量、检测和定位,自从1959提出边缘检测以来,经过五十多年的发展,已有许多中不同的边缘检测方法。根据作者的理解和实践,本文对边缘检测的原理进行了描述,在此基础上着重对Canny检测算法的实现进行详述。
![图像边缘检测--OpenCV之cvCanny函数](http://hi.csdn.net/attachment/201110/20/0_1319118393K2D6.gif)
2)图像高斯滤波
![图像边缘检测--OpenCV之cvCanny函数](http://hi.csdn.net/attachment/201110/20/0_1319118857NQ6k.gif)
![图像边缘检测--OpenCV之cvCanny函数](http://hi.csdn.net/attachment/201110/20/0_1319118933e59W.gif)
图1非极大值抑制原理