前面我们用sobel算子和拉普拉斯变换也可以进行边缘检测,见我的上一篇blog:
http://blog.csdn.net/lu597203933/article/details/17252285
但这样得到的二值边缘图像有两大缺点。第一:检测到的边缘过粗,这意味着难以实现物体的精确定位。第二:难以找到这样的阀值,即能足够低检测到所有重要的边缘,同时也不至于包含过多次要的边缘。
这个正是canny算子要解决的。
Canny算子通常基于sobel算子,有两个阀值,这样可以得到两幅边缘图;canny算法组合这两幅边缘图以生成一副“最优”的轮廓图。如果存在连续的边缘点,则将低阀值图像中的边缘点与高阀值图像中的边缘相连接,那么就保留低阀值图像中的边缘点。这种使用双阀值以得到二值图像的策略被称为磁滞阀值化。
代码:
int main()
{
Mat image = imread("F:\\lena.png", 0); // 这里也可以是BGR 但是想想提取轮廓 效果是一样的
if(!image.data)
{
cout << "Fail to load image" << endl;
return 0;
}
Mat result;
Canny(image, result, 150, 220);
namedWindow("cannyResult");
imsh