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中的阈值,对参数进行实验
【cvCanny()的使用以及阈值设置的比较】#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main(int argc,char** argv)
{
IplImage* src=https://www.it610.com/article/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算子得实质:如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃,那么如果该店的梯度位于两者之间呢?则当其与高于上限值的像素点连接时我们才保留,否则删除。

    推荐阅读