OpenCV-Python (Sobel算子)[通俗易懂]

OpenCV-Python (Sobel算子)[通俗易懂]Sobel算子Sobel算子的基本概念Sobel算子是一个主要用于边缘检测的离散微分算子(discretedifferentiationoperator)。它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。在图像的任意一点使用此算子,都将会产生对应的梯度矢量或是其法矢量。原型Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Pyt…

大家好,又见面了,我是你们的朋友全栈君。

Sobel算子

Sobel算子的基本概念

          Sobel算子是一个主要用于边缘检测的离散微分算子(discrete differentiation operator)。它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。在图像的任意一点使用此算子,都将会产生对应的梯度矢量或是其法矢量。

原型

Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中,使用Sobel的算子的函数原型如下:

dst = cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

 函数返回其处理结果。

前四个是必须的参数:

  • 第一个参数是需要处理的图像;
  • 第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
  • dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。

使用

在OpenCV-Python中,Sobel函数的使用如下:

import cv2
import numpy as np

img = cv2.imread("D:/gui.jpg", 0)

x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(img, cv2.CV_16S, 0, 1)

absX = cv2.convertScaleAbs(x) # 转回unit8
absY = cv2.convertScaleAbs(y)

dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

cv2.imshow("absX", absX)
cv2.imshow("absY", absY)

cv2.imshow("Result", dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:

OpenCV-Python (Sobel算子)[通俗易懂]OpenCV-Python (Sobel算子)[通俗易懂]

OpenCV-Python (Sobel算子)[通俗易懂]OpenCV-Python (Sobel算子)[通俗易懂]

解释

在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍中有这么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。

在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像,而只是一副灰色的窗口。convertScaleAbs()的原型为:

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]])

其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回uint8类型的图片。

由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted(…)函数将其组合起来。其函数原型为:

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])

其中alpha是第一幅图片中元素的权重,beta是第二个的权重,gamma是加到最后结果上的一个值。

参考资料:

1、《Opencv2 Computer Vision Application Programming Cookbook》

2、《OpenCV References Manule》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158993.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • TCP拥塞控制算法(Tahoe/Reno/Newreno)

    TCP拥塞控制算法(Tahoe/Reno/Newreno)TCP拥塞控制算法(Tahoe/Reno/Newreno)前言TCP(TransmissionControlProtocol),传输控制协议,是目前__Internet__上最重要的一个通信协议之一,其作用是对数据的传输进行一定的控制;而拥塞控制算法又是TCP中最重要的一个算法之一,接下来我们先来了解一下基本概念,再来详细介绍3个协议中的拥塞控制算法以及他们之间的区别。前期知识储备及名词…

  • Python:类的定义与使用

    Python:类的定义与使用类的定义与使用cball=Projectile(angle,vel,h0)中,cball传入给self一个炮弹从某个倾角射出计算水平位移和大致飞行时间的程序#projectile.p

  • Socket 非阻塞模式下connect 返回EINPROGRESS(115)错误[通俗易懂]

    Socket 非阻塞模式下connect 返回EINPROGRESS(115)错误[通俗易懂]今天再测试socket的时候,发现一个很奇怪的问题,就是客户端再connect的时候第一次connect总是会返回-1,errno是115,往往第二次连接就可以成功了。但是对于服务端来说,第一次连接已经成功返回了。后来想想可能跟自己的设置socket是非阻塞的有关系,后来吧socket设置成阻塞的,问题确实就没有了。后来有反复尝试了非阻塞的。我先把服务器关闭,让客户端连接,可以发现从打出来的e…

  • CAN 接口测试[通俗易懂]

    CAN 接口测试[通俗易懂]CAN测试收发程序can发送测试#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<net/if.h>#include<sys/ioctl.h>#include<sys/socket…

  • goLand 2022.01激活码-激活码分享

    (goLand 2022.01激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • Android下基于Iptables的一种app网络访问控制方案(二)

    Android下基于Iptables的一种app网络访问控制方案(二)3.如何在Android系统中集成?以上通过adb shell命令行在Android设备上将方案调通之后,接下来考虑如何集成在Android系统中。作为一个整体解决方案,需要至少解决两部分功能:(1)网络访问规则。包括规则定义、存储、对外接口、对内转化成Iptables命令。(2)Iptables命令执行。第一部分比较简单,在此不详述。主要看第二部分。对于某一个垂直功能,And

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号