cv2.Sobel()

article/2025/9/22 15:35:21

参考cv2.Sobel() - 云+社区 - 腾讯云

函数cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])

概述:利用Sobel算子进行图像梯度计算

参数

  • src:输入图像
  • ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
  • dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
  • ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3。求X方向和Y方向一阶导数时,卷积核分别为:

  • scale:(可选参数)将梯度计算得到的数值放大的比例系数,效果通常使梯度图更亮,默认为1
  • delta:(可选参数)在将目标图像存储进多维数组前,可以将每个像素值增加delta,默认为0
  • borderType:(可选参数)决定图像在进行滤波操作(卷积)时边沿像素的处理方式,默认为BORDER_DEFAULT

返回值

梯度图

细节讲解:

1. 图像深度

图像深度是指存储每个像素值所用的位数,例如cv2.CV_8U,指的是8位无符号数,取值范围为0~255,超出范围则会被截断(截断指的是,当数值大于255保留为255,当数值小于0保留为0,其余不变)。

具体还有:CV_16S(16位无符号数),CV_16U(16位有符号数),CV_32F(32位浮点数),CV_64F(64位浮点数)

e.g.

import cv2#载入原图,图像深度为CV_8Uimg_original=cv2.imread('E:\ShannonT\\notebook workspace\\images\\4.28.9.jpg',0)#求X方向梯度,并且输出图像一个为CV_8U,一个为CV_64Fimg_gradient_X_8U=cv2.Sobel(img_original,-1,1,0)img_gradient_X_64F=cv2.Sobel(img_original,cv2.CV_64F,1,0)#将图像深度改为CV_8Uimg_gradient_X_64Fto8U=cv2.convertScaleAbs(img_gradient_X_64F)#图像显示cv2.imshow('X_gradient_8U',img_gradient_X)cv2.imshow('X_gradient_64Fto8U',img_gradient_X_64Fto8U)cv2.waitKey()cv2.destroyAllWindows()

效果如下:

当输出图像深度采用CV_8U,由于Sobel算子在计算X方向梯度时,如果某像素点右侧像素值大于左侧像素值,则梯度大小为正保留,相反梯度大小为负被截断,梯度大小保存为0。从案例上看就表现一条线和两条线的区别。

2. 函数cv2.convertScaleAbs()的使用

在上述案例案例中,我们使用了函数cv2.convertScaleAbs()将图像深度为CV_64F的梯度图像重新转化为CV_8U,这是由于函数cv2.imshow()的默认显示为8位无符号数,即[0,255]。先来看一下两者显示的差别(左图为8U,右图为64F):

可以发现当图像深度为CV_64F时,显示时有明显缺陷,具体原因可以参考:有关函数cv2.imshow()处理不同图像深度时的数据转化问题_ShannonT的博客-CSDN博客

下面具体介绍函数cv2.convertScaleAbs()

函数cv2.convertScaleAbs(src[,alpha[,beta]])

概述:

先计算数组绝对值,后转化为8位无符号数

参数:

  • src:输入图像(多维数组)
  • alpha:比例因子
  • beta:保存新图像(数组)前可以增加的值

e.g.

将一个numpy数组通过cv2.convertScaleAbs()转化

import numpy as nptest=np.array([[100,56.4,300],[-200,-280,-34.6]])result=cv2.convertScaleAbs(test)result

结果显示如下:

3. 原图归一化

防止梯度大小被截断最简单的方法就是先将输入图像归一化(实际归一化的过程就已经实现了图像深度的转变),通过下面的例子实际说明

import cv2import numpy as np#载入灰度原图,图像深度为CV_8Uimg_original=cv2.imread('E:\ShannonT\\notebook workspace\\images\\4.28.9.jpg',0)#原图归一化,实际图像深度已经变为CV_64Fimg_standard=img_original/255#采用灰度原图求X方向梯度original_gradient_X_64F=cv2.Sobel(img_original,cv2.CV_64F,1,0)original_gradient_X_64Fto8U=cv2.convertScaleAbs(original_gradient_X_64F)#采用归一化的图像求X方向梯度standard_gradient_X=cv2.Sobel(img_standard,-1,1,0)#图像显示cv2.imshow('original',img_original)cv2.imshow('original_X',original_gradient_X_64Fto8U)cv2.imshow('standard_X',standard_gradient_X)cv2.waitKey()cv2.destroyAllWindows()

效果如下,可以看出,两种方法作用相同,而归一化的方法更方便

4. 梯度图像的计算

通过cv2.Sobel()我们可以轻松计算出X,Y方向的梯度大小,根据公式

G=\sqrt{(Gx)^{2}+(Gy)^{2}}

可以求出梯度图像,实际操作时,为了简化运算,我们使用公式

G=\left | Gx \right |+\left | Gy \right |

求梯度图像,以下是代码实现,利用的函数为cv2.addWeighted(),有关函数更多信息可以参考:Python-OpenCV 图像叠加or图像混合加权(cv2.addWeighted)_zh_jessica的博客-CSDN博客
 

import cv2import numpy as np#载入灰度原图,并且归一化img_original=cv2.imread('E:\ShannonT\\notebook workspace\\images\\4.28.9.jpg',0)/255#分别求X,Y方向的梯度grad_X=cv2.Sobel(img_original,-1,1,0)grad_Y=cv2.Sobel(img_original,-1,0,1)#求梯度图像grad=cv2.addWeighted(grad_X,0.5,grad_Y,0.5,0)cv2.imshow('gradient',grad)cv2.waitKey()cv2.destroyAllWindows()

结果如下:


http://chatgpt.dhexx.cn/article/fu6cSQb4.shtml

相关文章

python opencv cv2.rectangle 参数含义

因为做程序图像剪切一直不太明白是怎么切片的,这里就用 cv2.rectangle 这个函数来看一下 opencv 是怎么计量图像的坐标轴的。 cv2.rectangle 这个函数的作用是在图像上绘制一个简单的矩形。 opencv 官网上给出的 cv2.rectangle 函数定义 如下: Python: cv2.rectangle(img,…

OpenCV的cv2.minAreaRect解析

在这个文章中,我们将学习如何在感兴趣区域周围画最小面积矩形框。 1.最小面积矩形框 下图显示了两个矩形框,绿色的是普通矩形框,红色的是最小面积矩形框。可以发现,红色的是旋转矩形。 OpenCV提供了一个函数cv2.minAreaRect来寻…

python cv2.HoughCircles 霍夫圆检测

HoughCircles使用与说明 1. HoughCircles说明2. 代码3.结果 cv2提供了一种圆检测的方法:HoughCircles。该函数的返回结果与参数设置有很大的关系。 检测的图像时9枚钱币,分别使用了阈值(大津法和三角法)、均值偏移滤波以及未处理图…

cv2.minAreaRect函数详解

一、cv2.minAreaRect函数作⽤:返回不规则四边形的最⼩外接矩形 二、opencv4.2版本: 1、输入:多边形轮廓形点 2、输出:最⼩外接矩形的中⼼点坐标x,y,宽⾼w,h,⾓度anlge 三、angle角度解释: x轴…

cv2 imread()函数

Reason 这两天学习OpenCV-Python时,也就是cv2库,读取图像时不时出现和预料之外的结果。于是作者从源头来考究一下cv2.imread(filename, flags) Result 这里参考文章cv2.imread(filename, flags) cv2.imread(filename, flags) 参数: filepat…

cv2.drawContours

参考cv2.drawContours - 云社区 - 腾讯云 1.1什么是轮廓 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 为了准确,要使用二值化图像。需要进行阀值…

python cv2模块安装,python cv2模块怎么安装

安装方法:1、配置python环境;2、打开cmd命令窗口,执行“python”命令检查环境是否配置好;3、如果配置成功,则执行“exit()”命令;4、执行“pip install opencv-python”命令来安装cv2模块。 本教程操作环境…

python 安装 cv2 - 已解决

我的网站已上线 http://javapub.net.cn/ 建议收藏 提供多种操作,一定有一种适合你的 文章目录 1. 传统方式12. 第一阶段 终极办法013. 第二阶段 终极办法024. 终极办法3附加 情况就这么个情况,就是装不上。本文没一句废话,仔细阅读。 1. 传…

图像处理——Image和cv2

1、打开图像 # 路径可带汉字,图像数据RGB image Image.open(test.jpg)# 路径不可带汉字,图像数据BGR cv2image cv2.imread(test.jpg) # 路径可带汉字,图像数据BGR # cv2.IMREAD_COLOR:默认参数,读入彩色图像&#…

cv2.contourArea函数详解

问题:cv2.findContours找到所有的轮廓之后,想取出包含面积最大的轮廓,用cv2.contourArea算一下,但是得到的结果跟实际差别相当大,最大轮廓面积的计算成很小的一个值,而其中一个不太起眼的区域被计算得倒最大…

计算机视觉 – Computer Vision | CV

计算机视觉(Computer Vision)是人工智能领域的一个重要分支。它的目的是:看懂图片里的内容。 本文将介绍计算机视觉的基本概念、实现原理、8 个任务和 4 个生活中常见的应用场景。 计算机视觉为什么重要? 人的大脑皮层&#xff0…

Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略

关于OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等语言的接…

Python第三方cv2库介绍

Python第三方cv2库介绍 CV2指的是OpenCV2(Open Source Computer Vision Library),是一个开源的库平台计算机视觉库。有很强大的图片处理功能,可实现图像处理和计算机视觉方面的很多通用算法。 OpenCV官网文档 https://docs.open…

cv2安装与基本函数

简介 cv2是一个python的图像处理库,依赖c的opencv库处理图像。 安装 使用 pip install numpy pip install opencv-python 即可安装cv2及numpy 输入 >>> import cv2 >>> import numpy as np#cv2读取的图片都是numpy数组 >>> cv2.__…

Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略

Py之cv2:cv2(OpenCV,opencv-python)库的简介、安装、使用方法(常见函数、图像基本运算等)最强详细攻略 目录 cv2(OpenCV,opencv-python)库的简介 1、OpenCV应用领域 1.1、计算机视觉领域方向 1.2、计算机操作底层技术 cv2(OpenCV&#x…

常用的SQL语句

删除数据库中表的某些相同的某些记录 OR 查找数据库的表中的相同记录 一、删除数据库中表的某些相同的某些记录 delete from tablename where only_Id not in(select min(only_id) from tablename group by sameName) 二、选出相同记录的SQL语句 AND 删除相同记录的SQL语句…

数据库基础(常用SQL语句)

一、数据库级及SQL语言简介 1、目前主流数据库 微软:sql server、access 瑞典:mysql ibm: db2 sybase:sybase ibm: informix oracle: oracle 2、SQL语言 DQL-------------数据查询语言 select … From … Where DML-------------数据操纵语言 insert、…

SQL基本语句(整理)

一、DDL(Data Definition Language) 数据定义语言,用来定义数据库对象(数据库,表,字段) ①查询 查询所有数据库 show databases; 查询当前数据库 select database(); ②创建 create database [if not exists] 数…

SQL常用语句(基础篇)

SQL常用语句(基础篇) 说明:创建数据库 CREATE DATABASE database-name 说明:删除数据库 drop database dbname 说明:备份sql server —创建备份数据的device USE master EXEC sp_addumpdevice ‘disk’,‘testBac…

SQL最常用的语句

语法: 一步步由浅到深,这里用的都是mysql做的。 基础: 连接数据库: mysql -h10.20.66.32 -uroot -p123456 1 -h后面是mysqlServer所在地址,-u后面是用户名,-p后面是密码。 查看数据库 show database…