【OpenCV 4开发详解】Sobel算子
本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
Sobel算子是通过离散微分方法求取图像边缘的边缘检测算子,其求取边缘的思想原理与我们前文介绍的思想一致,除此之外Sobel算子还结合了高斯平滑滤波的思想,将边缘检测滤波器尺寸由ksize * 1改进为ksize * ksize,提高了对平缓区域边缘的响应,相比前文的算法边缘检测效果更加明显。使用Sobel边缘检测算子提取图像边缘的过程大致可以分为以下三个步骤:
Step1:提取X方向的边缘, X 方向一阶Sobel边缘检测算子如(5.16)所示。
[−101−202−101](5.16){\begin{bmatrix} {{\rm{ - 1}}}&{\rm{0}}&{\rm{1}}\\ {{\rm{ - 2}}}&{\rm{0}}&{\rm{2}}\\ {{\rm{ - 1}}}&{\rm{0}}&{\rm{1}} \end{bmatrix}} \tag{5.16}⎣⎡−1−2−1000121⎦⎤(5.16)Step2:提取Y方向的边缘, Y 方向一阶Sobel边缘检测算子如(5.17)所示。
[−1−2−1000121](5.17){\begin{bmatrix} {{\rm{ - 1}}}&{{\rm{ - 2}}}&{{\rm{ - 1}}}\\ {\rm{0}}&{\rm{0}}&{\rm{0}}\\ {\rm{1}}&{\rm{2}}&{\rm{1}} \end{bmatrix}}\tag{5.17}⎣⎡−101−202−101⎦⎤(5.17)Step3:综合两个方向的边缘信息得到整幅图像的边缘。由两个方向的边缘得到整体的边缘有两种计算方式:第一种是求取两张图像对应像素的像素值的绝对值之和;第二种是求取两张图像对应像素的像素值的平方和的二次方根。这两种计算方式在式(5.18)给出。
I(x,y)=Ix(x,y)2+Iy(x,y)2I(x,y)=∣Ix(x,y)2∣+∣Iy(x,y)∣(5.18)\begin{array}{c} I(x,y) = \sqrt {{I_x}{{(x,y)}^2} + {I_y}{{(x,y)}^2}} \\ I(x,y) = \left| {{I_x}{{(x,y)}^2}} \right| + \left| {{I_y}(x,y)} \right| \end{array} \tag{5.18}I(x,y)=Ix(x,y)2+Iy(x,y)2I(x,y)=∣∣∣Ix(x,y)2∣∣∣+∣Iy(x,y)∣(5.18)
OpenCV 4提供了对图像提取Sobel边缘的Sobel()函数,该函数的函数原型在代码清单5-24中给出。
代码清单5-24 Sobel()函数原型
1. void cv::Sobel(InputArray src,
2. OutputArray dst,
3. int ddepth,
4. int dx,
5. int dy,
6. int ksize = 3,
7. double scale = 1,
8. double delta = 0,
9. int borderType = BORDER_DEFAULT
10. )
- src:待提取边缘的图像,
- dst:输出图像,与输入图像src具有相同的尺寸和通道数,数据类型由第三个参数ddepth控制。
- ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
- dx:X方向的差分阶数
- dy:Y方向的差分阶数
- ksize:Sobel边缘算子的尺寸,必须是1、3、5或者7。
- scale:对导数计算结果进行缩放的缩放因子,默认系数为1,不进行缩放。
- delta:偏值,在计算结果中加上偏值。
- borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
该函数的使用方式与分离卷积函数sepFilter2D()相似,函数的前两个参数分别为输入图像和输出图像,第三个参数为输出图像的数据类型,这里需要注意由于提取边缘信息时有可能会出现负数,因此不要使用CV_8U数据类型的输出图像,与Sobel算子方向不一致的边缘梯度会在CV_8U数据类型中消失,使得图像边缘提取不准确。函数中第三个、第四个和第五个参数是控制图像边缘检测效果的关键参数,这三者存在的关系是任意一个方向的差分阶数都需要小于滤波器的尺寸,特殊情况是当ksize=1时,任意一个方向的阶数需要小于3。一般情况中,差分阶数的最大值为1时,滤波器尺寸选3;差分阶数的最大值为2时,滤波器尺寸选5;差分阶数最大值为3时,滤波器尺寸选7。当滤波器尺寸ksize=1时,程序中使用的滤波器尺寸不再是正方形,而是3×1或者1×3。最后三个参数为图像放缩因子、偏移量和图像外推填充方法的标志,多数情况下并不需要设置,只需要采用默认参数即可。
为了更好的理解Sobel()函数的使用方法,在代码清单5-25中给出了利用Sobel()函数提取图像边缘的示例程序,程序中分别提取X方向和Y方向的1阶边缘,并利用两个方向的边缘求取整幅图像的边缘,程序运行结果如图5-30所示。
代码清单5-25 mySobel.cpp图像Sobel边缘提取
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_ANYCOLOR);
11. if (img.empty())
12. {13. cout << "请确认图像文件名称是否正确" << endl;
14. return -1;
15. }
16. Mat resultX, resultY, resultXY;
17.
18. //X方向一阶边缘
19. Sobel(img, resultX, CV_16S, 2, 0, 1);
20. convertScaleAbs(resultX, resultX);
21.
22. //Y方向一阶边缘
23. Sobel(img, resultY, CV_16S, 0, 1, 3);
24. convertScaleAbs(resultY, resultY);
25.
26. //整幅图像的一阶边缘
27. resultXY = resultX + resultY;
28.
29. //显示图像
30. imshow("resultX", resultX);
31. imshow("resultY", resultY);
32. imshow("resultXY", resultXY);
33. waitKey(0);
34. return 0;
35. }
图5-30 mySobel.cpp程序Sobel边缘检测结果
OpenCV 4开发详解 |
往期推荐 |
---|
【OpenCV 4开发详解】颜色模型与转换 |
【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入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持! |
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。 |
【OpenCV 4开发详解】Sobel算子相关推荐
- 【OpenCV 4开发详解】Laplacian算子
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】Scharr算子
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】Canny算法
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】分割图像——分水岭法
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】深度神经网络应用实例
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】图像修复
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】分割图像——Grabcut图像分割
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【OpenCV 4开发详解】漫水填充法
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
最新文章
- 自然语言处理-Word2Vec
- 图灵有奖书评征集活动第001期
- JQuery Attributes 方法说明
- Python程序开发——第一章 基本python语法
- javascript_如何不再害怕JavaScript
- C语言程序设计孙家啸第一版,广东(年4月自考各专业课程使用教材.doc
- Bitmap createBitmap()裁剪图片
- -TEST 16 for NOIP 让scar_lyw都绝望的T3(120-300)
- Html移动端红包雨功能页面实现
- java 给一个开学日期,计算当天是开学第几周星期几或者开学第几周星期几为哪一天
- android应用程序设计答案,Android移动应用程序设计智慧职教MOOC答案
- 知识图谱 01:知识图谱概述
- 【软件篇】~ 为什么打开谷歌浏览器就是360导航页面呢?
- 最简单的11g Active DataGuard(ADG)搭建配置过程(项目步
- 2021-09-21如何在PCB上做一个城市地铁图?
- Python爬取10529条《三十而已》热评,看看大家都说了些啥!
- 需求文档不明确,怎么处理?项目很紧急,也会写测试用例吗?
- 安装VUE过程中出现的4048错误
- Github如何添加合适的开源License(Apache License 2.0、MIT License、GPL3)
- Redis数据库相关知识总结
热门文章
- 美团大脑:知识图谱的建模方法及其应用 | 公开课笔记
- 360的新手机没用AI,用在了车载后视镜上
- 一位后端妹纸的面试总结(美团+阿里+携程+58+贝贝+招银+华为+....)
- 如何参与一个顶级开源项目
- 鱼佬:我的数据挖掘之路!
- 有一份华为荣誉证书等你来拿!网络人工智能硬盘异常预测黑客松比赛火热报名中...
- 全新发布:《SQL语法速成手册》
- 这是什么操作?导师一作,研究生挂通讯...
- 66篇论文入选CVPR 2021,商汤的秘籍竟是“大力出奇迹”
- NLP研究索引神器,3000+代码库,一键查找论文、GitHub库