热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【OpenCV4开发详解】Scharr算子

本文首发于“小白学视觉”微信公众号,欢迎关注公众号本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究ÿ

本文首发于“小白学视觉”微信公众号,欢迎关注公众号

本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!



经过几个月的努力,小白终于完成了市面上第一本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=31030003103Gy=30310010303(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. //读取图像&#xff0c;黑白图像边缘检测结果较为明显
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. //X方向一阶边缘
19. Scharr(img, resultX, CV_16S, 1, 0);
20. convertScaleAbs(resultX, resultX);
21.
22. //Y方向一阶边缘
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开发详解】图像二值化
【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”。





推荐阅读
  • 在ROS系统中,参数读写一般通过xml或者yaml格式的文件,其中yaml用得比较多。这是一种可读性高,轻量级的标记语言,简单好用。对于yaml文件,ros中用的较早版本的yaml- ... [详细]
  • [二分图]JZOJ 4612 游戏
    DescriptionInputOutputSampleInput44#****#****#*xxx#SampleOutput5DataConstraint分析非常眼熟࿰ ... [详细]
  • 这篇文章主要讲解了“GradeBook类怎么定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Grad ... [详细]
  • c语言自定义BOOL函数C语言没有BOOL类型变量boolean类型是C++所独有的由于使用BOOL类型可以使代码更具有可读性,很多编程者都在C中自己定义了类似的应用,一般方法有两 ... [详细]
  • #includestdafx.h#includeiostream#includesstream#includemap#includestring ... [详细]
  • QT串口通信文章目录QT串口通信前言一、Pycharm代码二、STM32代码前言前几天学了QT,只设计界面并没有用处,于是我便学习了QT的串口通信。Q ... [详细]
  • 这篇文章将为大家详细讲解有关如何使用C语言strcmp函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一 ... [详细]
  • 下载器,就是一种网络工具,从网络中接收自己想要的数据。下载器是一个网络客户端。它的下载流程无非就是客户端连接服务器端,然后发送资源下载请求 ... [详细]
  • 使用临时文件tmpnam该函数的功能是产生一个唯一的文件名系统回味该文件分配一块内存来保存临时变量例如下面的代码#includeintmain(){charnam ... [详细]
  • 水题。。main.cppPATA1121CreatedbyPhoenixon2018224.Copyright©2018年Phoenix.Allrightsreserve ... [详细]
  • *Copyright(c)2016,烟台大学计算机与控制工程学院Allrightsreserved.文件名称:字符串加密.cpp作者:彭友程完成日期&# ... [详细]
  • 原题我们定义“区间的价值”为一段区间的最大值*最小值。一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1)。求长度分别为1~n的区间的最大价值。保证数据随机因为保证数据随 ... [详细]
  • socket8 [命名管道]
    ::命名管道不但能实现同一台机器上两个进程通信,还能在网络中不同机器上的两个进程之间的通信机制。与邮槽不同,命名管道是采用基于连接并且可靠的传输方式,所以命名管道传输数据只能一对一 ... [详细]
  • wyh2000andastringproblemTimeLimit:20001000MS(JavaOthers)MemoryLimit:13107265 ... [详细]
  • 883.三维形体投影面积
    题目883.三维形体投影面积题目大意在nxn的网格grid中,我们放置了一些与x,y,z三轴对齐的1x1x1立方体。每个值vgri ... [详细]
author-avatar
yuanguo374
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有