OpenCV入门(十三)快速学会OpenCV 12 图像梯度
迪丽瓦拉
2025-05-28 14:19:43
0

OpenCV入门(十三)快速学会OpenCV 12 图像梯度

  • 1.Sobel算子
    • 1.1 计算x
    • 1.2 计算y
    • 1.3 计算x+y
  • 2.Scharr算子
    • 2.1 计算x
    • 2.2 计算y
    • 2.3 计算x+y
  • 3.Laplacian算子
  • 4.总结

图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。一般情况下,图像梯度计算的是图像的边缘信息。

作者:Xiou

测试原图:

在这里插入图片描述

1.Sobel算子

Sobel算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。

Sobel 算子 (Sobel operator) 是边缘检测中非常重要的一个算子.。Sobel 算子是一类离散性差分算子, 用来运算图像高亮度函数的灰度之近似值。

OpenCV内,使用函数cv2.Sobel()实现Sobel算子运算,其语法形式为:

cv2.Sobel(src, ddepth, dx, dy, ksize)

参数:

src: 原图
ddepth: 图片深度
dx: 水平方向
dy: 竖直方向
ksize: 算子大小

1.1 计算x

代码实例:

import cv2
# 读取图片
img = cv2.imread("test.jpg")# Sobel算子
sobelx = cv2.Sobel(img, -1, 1, 0, ksize=3)# 展示图片
cv2.imshow("sobelx", sobelx)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

1.2 计算y

代码实例:

import cv2
# 读取图片
img = cv2.imread("test.jpg")# Sobel算子
sobely = cv2.Sobel(img, -1, 0, 1, ksize=3)# 展示图片
cv2.imshow("sobely", sobely)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

1.3 计算x+y

代码实例:

import cv2
# 读取图片
img = cv2.imread("test.jpg")# Sobel算子
sobel = cv2.Sobel(img, -1, 1, 1, ksize=3)# 展示图片
cv2.imshow("sobel", sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

2.Scharr算子

在离散的空间上,有很多方法可以用来计算近似导数,在使用3×3的Sobel算子时,可能计算结果并不太精准。OpenCV提供了Scharr算子,该算子具有和Sobel算子同样的速度,且精度更高。可以将Scharr算子看作对Sobel算子的改进。

OpenCV提供了函数cv2.Scharr()来计算Scharr算子,其语法格式如下:

        dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )

式中:
● dst代表输出图像。
● src代表原始图像。
● ddepth代表输出图像深度。该值与函数cv2.Sobel()中的参数ddepth的含义相同。
● dx代表x方向上的导数阶数。
● dy代表y方向上的导数阶数。
● scale代表计算导数值时的缩放因子,该项是可选项,默认值是1,表示没有缩放。● delta代表加到目标图像上的亮度值,该项是可选项,默认值为0。
● borderType代表边界样式。

2.1 计算x

代码实例:

import cv2
# 读取图片
img = cv2.imread("test.jpg")# Scharr 算子
Scharrx = cv2.Sobel(img, -1, 1, 0, ksize=-1)# 展示图片
cv2.imshow("Scharrx",Scharrx)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:
在这里插入图片描述

2.2 计算y

代码实例:

import cv2
# 读取图片
img = cv2.imread("test.jpg")# Scharr 算子
Scharry = cv2.Sobel(img, -1, 0, 1, ksize=-1)# 展示图片
cv2.imshow("Scharry",Scharry)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:
在这里插入图片描述

2.3 计算x+y

需要注意的是,参数dx和dy的值不能都为1。

代码实例:

import cv2
# 读取图片
o = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(o, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(o, cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
cv2.imshow("original", o)
cv2.imshow("xy", scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果:
在这里插入图片描述

3.Laplacian算子

Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。

OpenCV内使用函数cv2.Laplacian()实现Laplacian算子的计算,该函数的语法格式为:

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

式中:
● dst代表目标图像。
● src代表原始图像。
● ddepth代表目标图像的深度。
● ksize代表用于计算二阶导数的核尺寸大小。该值必须是正的奇数。
● scale代表计算Laplacian值的缩放比例因子,该参数是可选的。默认情况下,该值为1,表示不进行缩放。
● delta代表加到目标图像上的可选值,默认为0。
● borderType代表边界样式。

代码实例:

import cv2
# 灰度读取图片
o = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
#拉普拉斯算子
Laplacian = cv2.Laplacian(o, cv2.CV_64F)
Laplacian = cv2.convertScaleAbs(Laplacian)
cv2.imshow("original", o)
cv2.imshow("Laplacian", Laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

4.总结

Sobel算子、Scharr算子、Laplacian算子都可以用作边缘检测,它们的核如图所示。

在这里插入图片描述
Sobel算子和Scharr算子计算的都是一阶近似导数的值。通常情况下,可以将它们表示为:

在这里插入图片描述
式中“|左-右|”表示左侧像素值减右侧像素值的结果的绝对值,“|下-上|”表示下方像素值减上方像素值的结果的绝对值。Laplacian算子计算的是二阶近似导数值,可以将它表示为:

在这里插入图片描述
通过公式可以发现,Sobel算子和Scharr算子各计算了一次“|左-右|”和“|下-上|”的值,而Laplacian算子分别计算了两次“|左-右|”和“|下-上|”的值。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...