经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
---|
本节中最后介绍的边缘检测算法是Canny算法,该算法不容易受到噪声的影响,能够识别图像中的弱边缘和强边缘,并结合强弱边缘的位置关系,综和给出图像整体的边缘信息。Canny边缘检测算法是目前最优越的边缘检测算法之一,该方法的检测过程分为以下5个步骤:
为了简便,梯度方向常取值0°、45°、90°和135°这个四个角度之一。
Canny算法具有复杂的流程,然而在OpenCV 4中提供了Canny()函数用于实现Canny算法检测图像中的边缘,极大的简化了使用Canny算法提取边缘信息的过程。Canny()函数的函数原型在代码清单5-32中给出。
代码清单5-32 Canny()函数原型
1. void cv::Canny(InputArray image,
2. OutputArray edges,
3. double threshold1,
4. double threshold2,
5. int apertureSize = 3,
6. bool L2gradient = false
7. )
该函数利用Canny算法提取图像中的边缘信息。第一个参数是需要提取边缘的输入图像,目前只支持数据类型为CV_8U的图像,输入图像可以是灰度图像或者彩色图像。第二个参数是边缘检测结果的输出图像,图像是数据类型为为CV_8U的单通道灰度图像。函数第三个和第四个参数是Canny算法中用于区分强边缘和弱边缘的两个阈值,两个参数不区分较大阈值和较小阈值,函数会自动比较区分两个阈值的大小,不过一般情况下,较大阈值与较小阈值的比值在2:1到3:1之间。函数最后一个参数是计算梯度幅值方法的选择标志,无特殊需求的情况下,使用默认值即可。
为了更好的理解Canny()函数的使用方法,在代码清单5-33中给出了利用Canny()函数检测图像边缘的示例程序。程序中通过设置不同的阈值来比较阈值的大小对图像边缘检测效果的影响,程序的输出结果在图5-35给出。通过结果可以发现,较高的阈值会降低噪声信息对图像提取边缘结果的影响,但是同时也会减少结果中的边缘信息。同时程序中先对图像进行高斯模糊后再进行边缘检测,结果表明高斯模糊在边缘纹理较多的区域能减少边缘检测的结果,但是对纹理较少的区域影响较小。
代码清单5-33 myCanny.cpp利用Canny算法提取图像边缘
1. #include <opencv2\opencv.hpp>
2. #include <iostream>
3.
4. using namespace cv;
5. using namespace std;
6.
7. int main()
8. {
9. //读取图像,黑白图像边缘检测结果较为明显
10. Mat img = imread("equalLena.png", IMREAD_ANYDEPTH);
11. if (img.empty())
12. {
13. cout << "请确认图像文件名称是否正确" << endl;
14. return -1;
15. }
16. Mat resultHigh, resultLow, resultG;
17.
18. //大阈值检测图像边缘
19. Canny(img, resultHigh, 100, 200, 3);
20.
21. //小阈值检测图像边缘
22. Canny(img, resultLow, 20, 40, 3);
23.
24. //高斯模糊后检测图像边缘
25. GaussianBlur(img, resultG, Size(3, 3), 5);
26. Canny(resultG, resultG, 100, 200, 3);
27.
28. //显示图像
29. imshow("resultHigh", resultHigh);
30. imshow("resultLow", resultLow);
31. imshow("resultG", resultG);
32. waitKey(0);
33. return 0;
34. }
图5-35 myCanny.cpp程序中图像提取边缘结果
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持! |
---|