作者:yuanguo374 | 来源:互联网 | 2023-09-25 15:00
本文首发于“小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
虽然Sobel算子可以有效的提取图像边缘,但是对图像中较弱的边缘提取效果较差。因此为了能够有效的提取出较弱的边缘,需要将像素值间的差距增大,因此引入Scharr算子。Scharr算子是对Sobel算子差异性的增强,因此两者之间的在检测图像边缘的原理和使用方式上相同。Scharr算子的边缘检测滤波的尺寸为3×3,因此也有称其为Scharr滤波器。可以通过将滤波器中的权重系数放大来增大像素值间的差异,Scharr算子就是采用的这种思想,其在X方向和Y方向的边缘检测算子如(5.19)中所示。
Gx=[−303−10010−303]Gy=[−3−10−30003103](5.19)\begin{array}{c} {{G_x} = \left[ {\begin{array}{c} { - 3}&0&3\\ { - 10}&0&{10}\\ { - 3}&0&3 \end{array}} \right]}&{{G_y} = \left[ {\begin{array}{c} { - 3}&{ - 10}&{ - 3}\\ 0&0&0\\ 3&{10}&3 \end{array}} \right]} \end{array} \tag{5.19}Gx=⎣⎡−3−10−30003103⎦⎤Gy=⎣⎡−303−10010−303⎦⎤(5.19)
OpenCV 4提供了对图像提取Scharr边缘的Scahrr ()函数,该函数的函数原型在代码清单5-26中给出。
代码5-26 Scharr()函数原型
1. void cv::Scharr(InputArray src,
2. OutputArray dst,
3. int ddepth,
4. int dx,
5. int dy,
6. double scale = 1,
7. double delta = 0,
8. int borderType = BORDER_DEFAULT
9. )
- src:待提取边缘的图像,
- dst:输出图像,与输入图像src具有相同的尺寸和通道数,数据类型由第三个参数ddepth控制。
- ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
- dx:X方向的差分阶数
- dy:Y方向的差分阶数
- scale:对导数计算结果进行缩放的缩放因子,默认系数为1,不进行缩放。
- delta:偏值,在计算结果中加上偏值。
- borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
该函数利用Scharr算子提取图像中的边缘信息,与Soble()函数相同,函数的前两个参数分别为输入图像和输出图像,第三个参数为输出图像的数据类型,这里需要注意由于提取边缘信息时有可能会出现负数,因此不要使用CV_8U数据类型的输出图像,与Scarr算子方向不一致的边缘梯度会在CV_8U数据类型中消失,使得图像边缘提取不准确。函数第四个和五个参数是提取X方向边缘还是Y方向边缘的标志,该函数要求这两个参数只能有一个参数为1,并且不能同时为0,否则函数将无法提取图像边缘,该函数默认的滤波器尺寸为3×3,并且无法修改。最后三个参数为图像放缩因子、偏移量和图像外推填充方法的标志,多数情况下并不需要设置,只需要采用默认参数即可。
为了更好的理解Scahrr ()函数的使用方法,在代码清单5-27中给出了利用Scharr ()函数提取图像边缘的示例程序,程序中分别提取X方向和Y方向的边缘,并利用两个方向的边缘求取整幅图像的边缘,程序运行结果如图5-31所示,通过结果可以看出Scharr算子可以比Sobel算子提取到更微弱的边缘。
代码清单5-27 myScharr.cpp图像Scharr边缘提取
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 &#61; imread("equalLena.png", IMREAD_ANYDEPTH);
11. if (img.empty())
12. {
13. cout << "请确认图像文件名称是否正确" << endl;
14. return -1;
15. }
16. Mat resultX, resultY, resultXY;
17.
18.
19. Scharr(img, resultX, CV_16S, 1, 0);
20. convertScaleAbs(resultX, resultX);
21.
22.
23. Scharr(img, resultY, CV_16S, 0, 1);
24. convertScaleAbs(resultY, resultY);
25.
26.
27. resultXY &#61; resultX &#43; resultY;
28.
29.
30. imshow("resultX", resultX);
31. imshow("resultY", resultY);
32. imshow("resultXY", resultXY);
33. waitKey(0);
34. return 0;
35. }
图5-31 myScharr.cpp程序Scharr边缘检测结果
往期推荐 |
---|
【OpenCV 4开发详解】多通道分离与合并 |
【OpenCV 4开发详解】图像像素统计 |
【OpenCV 4开发详解】两图像间的像素操作 |
【OpenCV 4开发详解】图像二值化 |
【OpenCV 4开发详解】图像LUT查找表 |
【OpenCV 4开发详解】图像连接 |
【OpenCV 4开发详解】图像仿射变换 |
【OpenCV 4开发详解】图像透视变换 |
【OpenCV 4开发详解】图像极坐标变换 |
【OpenCV 4开发详解】图像上绘制几何图形 |
【OpenCV 4开发详解】图像金字塔 |
【OpenCV 4开发详解】窗口交互操作 |
【OpenCV 4开发详解】图像直方图绘制 |
【OpenCV 4开发详解】直方图操作 |
【OpenCV 4开发详解】直方图应用 |
【OpenCV 4开发详解】图像模板匹配 |
【OpenCV 4开发详解】图像卷积 |
【OpenCV 4开发详解】图像噪声的种类与生成 |
【OpenCV 4开发详解】均值滤波 |
【OpenCV 4开发详解】方框滤波 |
【OpenCV 4开发详解】高斯滤波 |
【OpenCV 4开发详解】可分离滤波 |
【OpenCV 4开发详解】中值滤波 |
【OpenCV 4开发详解】边缘检测原理 |
【OpenCV 4开发详解】Sobel算子 |
经过几个月的努力&#xff0c;市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助&#xff0c;希望到时候多多支持&#xff01; |
关注小白的小伙伴可以提前看到书中的内容&#xff0c;我们创建了学习交流群&#xff0c;欢迎各位小伙伴添加小白微信加入交流群&#xff0c;添加小白时请备注“学习OpenCV 4”。 |