cvCanny()的使用以及阈值设置的比较

cvCanny()的使用以及阈值设置的比较  


转自:http://zhuyuge0.blog.163.com/blog/static/13230361420116178512694/

2011-07-17 21:00:01|  分类: C++,openCV |  标签: |字号 订阅

canny算子有两个阈值,上限和下限,构造函数定义为:

void cvCanny(const CvArr* img,CvArr* edges,double lowthreshold,double highthreshold,int apertureSize=3);

需要注意的是canny需要输入的是灰度图像,所以我们在使用canny之前要使用cvCvtColor将之转换为灰度图像,一下程序对高低阈值不同比例,不同大小进行设置来观察cvCanny的显示效果:

// TestCanny.cpp : 定义控制台应用程序的入口点。
// 设置canny中的阈值,对参数进行实验

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

int main(int argc,char** argv)
{
 IplImage* src=cvLoadImage(argv[1],1);
 IplImage* gray=cvCreateImage(cvSize(src->width,src->height),8,1);
 IplImage* dst0=cvCreateImage(cvSize(src->width,src->height),8,1);
 IplImage* dst1=cvCreateImage(cvSize(src->width,src->height),8,1);
 IplImage* dst2=cvCreateImage(cvSize(src->width,src->height),8,1);
 IplImage* dst3=cvCreateImage(cvSize(src->width,src->height),8,1);
 cvCvtColor(src,gray,CV_RGB2GRAY);
 cvCanny(gray,dst0,50,75,3);
 cvCanny(gray,dst1,120,80,3);
 cvCanny(gray,dst3,120,30,3);
 cvCanny(gray,dst2,180,120,3);
 cvNamedWindow("gray",0);
 cvNamedWindow("dst0",0);
 cvNamedWindow("dst1",0);
 cvNamedWindow("dst2",0);
 cvNamedWindow("dst3",0);
 cvShowImage("gray",gray);
 cvShowImage("dst0",dst0);
 cvShowImage("dst1",dst1);
 cvShowImage("dst2",dst2);
 cvShowImage("dst3",dst2);
 cvWaitKey(0);
 cvReleaseImage(&gray);
 cvReleaseImage(&dst0);
 cvReleaseImage(&dst1);
 cvReleaseImage(&dst2);
 cvReleaseImage(&dst3);
 cvDestroyWindow("gray");
 cvDestroyWindow("dst0");
 cvDestroyWindow("dst1");
 cvDestroyWindow("dst2");
 cvDestroyWindow("dst3");
}

图1是显示高低阈值在相同比例不同大小的情况下显示的图像,很显然随着阈值的增加,图像的边缘也趋于明显,因为过滤了许多杂点。这点也是很容易理解的。

 

图2显示的是高低阈值的比例不同所显示的结果。
因此我们可以总结以上实验的结果从而获得canny算子得实质:如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃,那么如果该店的梯度位于两者之间呢?则当其与高于上限值的像素点连接时我们才保留,否则删除。

你可能感兴趣的:(OpenCV)