OpenCV学习笔记(十一)——利用Sobel算子计算梯度

Sobel算子是基于一阶导数的离散差分算子,其中Sobel对于像素值的变化是十分敏感的,在进行边缘检测的时候,Sobel算子常用于对周围像素的重要性进行检测。

Sobel算子包括检验水平方向的算子和检测竖直方向的算子

计算机梯度值的操作如下:

  1. 算子在图像上进行卷积操作检测水平边缘。公式为:
  2. 算子在图像上进行卷积操作检测垂直边缘。 公式为:
  3. 结合水平方向和垂直方向计算每一个梯度点的数值,公式为:

在OpenCV中可以cv2.Sobel()来计算图像梯度值,其中格式为cv2.Sobel(src,depth,dx,dy,size),其中第一个参数src表示的是需要处理的图像;第二个参数depth表示的是图像的深度;第三个参数dx和第四个参数dy分别选择水平和竖直方向;size表示的是Sobel算子的大小。

下面有这么一张图像:

(1)水平方向梯度计算

对上图计算进行卷积操作检测水平方向边缘:

python 复制代码
import cv2
import matplotlib.pyplot as plt
import numpy as np

image=cv2.imread(r'D:/Photo/3.png')
sobelx_image=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv2.imshow('sobelx',sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

在上图中会把负值截断为0,因此我们需要添加一处操作:

python 复制代码
sobelx_image=cv2.convertScaleAbs(sobelx_image)
#取绝对值操作

完整代码为:

python 复制代码
import cv2
import matplotlib.pyplot as plt
import numpy as np

image=cv2.imread(r'D:/Photo/3.png')
sobelx_image=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx_image=cv2.convertScaleAbs(sobelx_image)
cv2.imshow('sobelx',sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

对于存在梯度的像素来说,如果两个图像存在差异,那么右边减去左边的不为0,则有可能会正数或者有可能为负数,因此需要取绝对值操作,此时像素点为一个大于0的正数,像素点部位不是纯黑色。

(2)竖直方向梯度计算

同理可以对竖直方向进行梯度计算,代码为:

python 复制代码
import cv2
import matplotlib.pyplot as plt
import numpy as np

image=cv2.imread(r'D:/Photo/3.png')
sobelx_image=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
cv2.imshow('sobelx',sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

(3)完整的梯度计算

完整的梯度计算需要分别将水平方向和垂直方向分别乘上各自权值再求和,例如将权值设置为0.5:

python 复制代码
sobel=cv2.addWeighted(sobelx_image,0.5,sobely_image,0.5,0)
cv2.imshow('sobel',sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

为什么不直接使用 sobel_image=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)呢?因为在OpenCV中如果直接设置dx和dy的方向均为1的话,那么可能会添加重影,叠加效果不是很好,因此不建议。

相关推荐
测试员周周19 分钟前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
largecode1 小时前
打电话时,怎么让号码显示自己的品牌名称?办理号码认证服务流程
笔记·百度·微信·课程设计·微信公众平台·facebook·新浪微博
2301_783848651 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
CLX05052 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
米罗篮2 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程
老纪2 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
噜噜噜阿鲁~3 小时前
python学习笔记 | 10.0、面向对象编程
笔记·python·学习
weixin199701080163 小时前
[特殊字符] RESTful API 接口规范详解:构建高效、可扩展的 Web 服务(附 Python 源码)
前端·python·restful
hssfscv3 小时前
软件设计师下午题训练1-3题+2019上上午题错题解析 练习真题训练13
笔记·设计模式·uml
2301_781571423 小时前
mysql数据库响应缓慢如何排查_使用EXPLAIN分析执行计划
jvm·数据库·python