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

2024-03-24 07:04

本文主要是介绍OpenCV学习笔记(十一)——利用Sobel算子计算梯度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

Sobel算子包括检验水平方向的算子G_{x}和检测竖直方向的算子G_{y}

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

  1. G_{x}算子在图像上进行卷积操作检测水平边缘。公式为:G_{x}=A*g_{x}
  2. G_{y}算子在图像上进行卷积操作检测垂直边缘。 公式为:G_{y}=A*g_{y}
  3. 结合水平方向和垂直方向计算每一个梯度点的数值,公式为:G=|G_{x}|+|C_{y}|

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

下面有这么一张图像:

(1)水平方向梯度计算

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

import cv2
import matplotlib.pyplot as plt
import numpy as npimage=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,因此我们需要添加一处操作:

sobelx_image=cv2.convertScaleAbs(sobelx_image)
#取绝对值操作

完整代码为:

import cv2
import matplotlib.pyplot as plt
import numpy as npimage=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)竖直方向梯度计算

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

import cv2
import matplotlib.pyplot as plt
import numpy as npimage=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:

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的话,那么可能会添加重影,叠加效果不是很好,因此不建议。

这篇关于OpenCV学习笔记(十一)——利用Sobel算子计算梯度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840803

相关文章

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操