OpenCV-Python学习之路-10:Image Gradients(图像梯度)-程序员宅基地

技术标签: python  计算机视觉  学点工具  opencv  

参考依据

官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_gradients/py_gradients.html#gradients

目标

  1. 寻找图像中的梯度、检测边缘等
  2. 学习到以下函数:cv2.Sobel()、cv2.Scharr()、cv2.Laplacian()等

图像梯度

OpenCV为我们提供了三个用于梯度检测的高通滤波器:Sobel,Scharr以及Laplacian

1. Sobel和Scharr求导

Sobel算子是高斯平滑求导运算的联合运算,因此它的抗噪性更好,在使用时,可以指定求导的方向x / y(水平方向或垂直方向)。还可以通过参数ksize指定内核的大小,如果ksize = -1(不指定),则默认使用大小为3x3的filter(此时,Scharr滤波器比Sobel滤波器的效果更好)。

Python: cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
Python: cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])

重要提示:ddepth为输出图像的深度,我们要注意,这里不能用cv2.CV_8U(8位无符号),因为在计算梯度时:White->Black这个方向计算得到的梯度是负值,如果使用uint8类型的话,会忽略掉这个方向的梯度,从而导致检测有误。因此最好将输出数据类型保留为更高的形式,例如cv2.CV_16S,16位的有符号数,或者更高阶的cv2.CV_64F等等。
Sobel

img = cv2.imread('0003.png',0)
sobelx = cv2.Sobel(img, cv2.CV_16S, 1, 0)  # 检测x方向梯度 ksize默认为3x3
sobely = cv2.Sobel(img, cv2.CV_16S, 0, 1)  # 检测y方向梯度
abx = cv2.convertScaleAbs(sobelx)  # 取sobelx绝对值,并转为uint8类型
aby = cv2.convertScaleAbs(sobely)  # 取sobelx绝对值,并转为uint8类型
 
dst = cv2.addWeighted(abx, 0.5, aby, 0.5, 0)  # 融合x、y两方向梯度

plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('原图')
plt.subplot(122), plt.imshow(abx, cmap='gray'), plt.title('x方向')
plt.show()
plt.subplot(121), plt.imshow(aby, cmap='gray'), plt.title('y方向')
plt.subplot(122), plt.imshow(dst, cmap='gray'), plt.title('边缘检测')
plt.show()

在这里插入图片描述
Scharr
代码和上面的差不多,只将Sobel换成对于的Scharr即可。

sobelx = cv2.Scharr(img, cv2.CV_16S, 1, 0)  # 检测x方向梯度 ksize默认为3x3
sobely = cv2.Scharr(img, cv2.CV_16S, 0, 1)  # 检测y方向梯度

在这里插入图片描述
Sobel vs. Scharr
scharr算子实际上是sobel算子的优化,从上述结果可以看出,scharr算子在处理边缘时比sobel精度高一些在ksize=3x3时,两种算子唯一的区别就是他们的卷积核不同,在时间复杂度都是一样的。但Scharr只应用在ksize=3x3的情况下,而Sobel可以为1, 3, 5, 7,...

2. Laplacian求导

图像的拉普拉斯算子由这个关系式计算:
在这里插入图片描述
其中每个梯度由Sobel方法求得,当ksize=1时,则使用以下内核进行滤波:
在这里插入图片描述

Python: cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

laplacian = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('原图')
plt.subplot(122), plt.imshow(abx, cmap='gray'), plt.title('Laplacian')
plt.show()

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36560894/article/details/107767281

智能推荐

Pytorch、Tensorflow、Keras 框架下实现KNN算法(MNIST数据集)附详解代码_knn pytorch-程序员宅基地

文章浏览阅读4k次,点赞7次,收藏26次。Pytorch、Tensorflow、Keras框架下实现KNN算法(MNIST数据集)附详解代码K最近邻法(KNN)是最常见的监督分类算法,其中根据K值的不同取值,模型会有不一样的效率,但是并不是k值越大或者越小,模型效率越高,而是根据数据集的不同,使用交叉验证,得出最优K值。Python—KNN分类算法(详解)欧式距离的快捷计算方法基于Pytorch实现KNN算法:#****************************************************************_knn pytorch

Android EditText输入框的使用(很详细很基础)-程序员宅基地

文章浏览阅读5.7k次,点赞6次,收藏11次。关于Android手机的各类输入框,在编辑多行文本,文本块,统一使用的是EditText,这也是我们使用的最多的常用控件之一,在此做一个简单的总结。一、基础属性首先,EditText作为一个控件,他是继承于View的,所以他具有View的很多属性及方法。当然,现在出了个AppCompatEditText,它是继承于EditText的,加了一些外观的处理,其余的用法那些一模一样。在写Xml界面时,我们可以通过Android:,tools:,自定义属性等等为其定义各种属性。这些属性可以确定他的.._android edittext

【EDA】Electric VLSI Design System(芯片设计软件): 介绍_electric芯片设计-程序员宅基地

文章浏览阅读2.9k次。http://savannah.gnu.org/projects/electricThis project is part of the GNU Project.A circuit design system for IC layout, schematics, hardware description languages, and more.Registration Date: Fri 06 Apr 2001 02:32:31 AM UTCLicense:GNU General Pub._electric芯片设计

元心科技分享:Gstreamer 初探 (五) (GTK+)_gstreamer画界面必须在主线程吗-程序员宅基地

文章浏览阅读885次。Gstreamer 初探 (五)(GTK+)本次教程我们介绍将Gstreamer集成到GTK+中的操作详解,基本上Gstreamer负责媒体流的处理,用户交互的部分留给GTK+来处理,最有趣的部分是Gstreamer如何将视频输出到Gtk+的窗口,而Gtk+将用户操作转发到Gstreamer进行控制通过这次课程,请留意以下内容:如何将Gstreamer的视频输出到指定的窗口(而不是让其创建自己的窗口)如何将Gstreamer的信息在界面上进行刷新如何从Gstreamer的多个线程中更新界面如_gstreamer画界面必须在主线程吗

三维GIS显示中,利用太阳高度角和方位角计算光照_太阳方位角与高度角对应光线向量-程序员宅基地

文章浏览阅读4k次。三维GIS显示中,利用太阳高度角和方位角计算光照利用【太阳方位角】和【太阳高度角】进行光照计算的时候,需要注意:– 1、 坐标系是球坐标系,具体正方向如下图所示:极坐标公式:x=rsinθcosφ.y=rsinθsinφ.z=rcosθ.φ:由x轴出发,逆时针旋转到地物方位所得的角度;θ:由z轴出发,顺时针旋转到地物方位所得的角度;– 2、太阳高度角和方位角正方向表示:太阳高..._太阳方位角与高度角对应光线向量

vba报错:不能设置类worksheet的visible属性-程序员宅基地

文章浏览阅读7.3k次。错误原因: 工作簿被保护了解决方法: 点击 “审阅” 下的 “保护工作簿”,输入密码 取消保护即可_不能设置类worksheet的visible属性

随便推点

Apache Oozie Installation-程序员宅基地

文章浏览阅读95次。oozie就是一个workflow协调系统,主要用来管理Hadoop作业(job)。属于web应用程序,由oozie client和oozie server两个组件构成。oozie server运行于java servlet容器(tomcat)中的web程序。由于使用HUE需要oozie的支持,所以先介绍oozie的安装配置,后续增加HUE的安装配置文档。1、环境介绍前期已配置好Hadoop集群服..._apache oozie 安装包

Jittor 深度学习框架入门(pytorch转换)、对比_jittor和pytorch哪个好-程序员宅基地

文章浏览阅读2.1k次。1.PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。中文网站:https://pytorch-cn.readthedocs.io/zh/latest/2.NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运_jittor和pytorch哪个好

postman测试接口成功,实际发请求时失败_postman成功,云效接口自动执行失败-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏3次。postman测试接口成功,实际发请求时失败,当遇到这个问题的时候,你需要关注一下两次携带的数据是否相同,有可能是因为格式的不同导致的,我最近也遇到了这个问题,因为postman测试的sh_postman成功,云效接口自动执行失败

read函数---------详解-程序员宅基地

文章浏览阅读3.7w次,点赞5次,收藏36次。read函数从打开的设备或文件中读取数据。#include ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注_read函数

lombok @Builder注解 和 build父类属性问题_@builder 父类-程序员宅基地

文章浏览阅读8.2k次。1、简介通过@Builder注解,lombok可以方便的实践建造者模式。2、使用1)创建基类Userimport lombok.*;/** * @author 周鑫(玖枭) */@Getter@Setter@ToString@NoArgsConstructor@AllArgsConstructor@Builderpublic class User { private Long id; private String name;}2)创建子类UserExt_@builder 父类

LaTeX----$$中的字母如何由斜体变成正体_latex让$$里的字体和正常一样-程序员宅基地

文章浏览阅读10w+次,点赞30次,收藏43次。{\rm x_{z}}_latex让$$里的字体和正常一样

推荐文章

热门文章

相关标签