在OpenCV中用Canny算子进行边缘检测的速度很快,但分割的高低阈值需要输入。在Matlab中,如果不指定阈值,函数将自适应确定阈值。因此仿照Matlab的做法,对Canny函数进行了修改,以便未指定高低阈值时,由函数自适应确定阈值。
在OpenCv原码库中增加了一个函数,用于确定高低阈值。
// 仿照Matlab,自适应求高低两个门限
CV_IMPL void AdaptiveFindThreshold(CvMat *dx, CvMat *dy, double *low, double *high)
{
CvSize size;
IplImage *imge=0;
int i,j;
CV_IMPL void AdaptiveFindThreshold(CvMat *dx, CvMat *dy, double *low, double *high)
{
//
计算高低门限
*high = (i+1) * maxv / hist_size ;
*low = *high * 0.4;
cvReleaseImage( &imge );
cvReleaseHist(&hist);
}
}
再把cvCanny函数进行以下修改。
在函数体中,当程序用两个sobel算子计算完水平和垂直两个方向的梯度强度过后加入以下代码:
// 自适应确定阈值
if(low_thresh == -1 && high_thresh == -1)
{
AdaptiveFindThreshold(dx, dy, &low_thresh, &high_thresh);
}
这样,在调用cvCanny函数时,指定高低门限为-1,则cvCanny函数就自适应确定门限。
转自:http://bixiaoxu.blog.163.com/blog/static/197727347201341345012574/