OpenCV(四)之图像梯度处理

OpenCV图像梯度边缘轮廓处理 功能:用于计算图像梯度(gradient)的函数参数:src: 输入图像,它应该是灰度图像。ddepth: 输出图像的所需深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用如 cv2.CV_64F 等来指定特定的深度。由于梯度计算可能产生负值,因此建议使用能够包含负数的数据类型。dx: x 方向上的导数阶数。如果你想要计算 x 方向上的梯度,设置这个参数为 1;如果你不关心 x 方向上的梯度,设置这个参数为 0。dy: y 方向上的导数阶数。 阅读详情

Gradient processing系列

在这一节中,我分析了关于图像梯度处理的几个方法,分析原理,代码实现,并观察有何差异。


Gradient processing-Sobel算子

function:
def Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None):
	使用扩展的Sobel算子计算第一,第二,第三或混合图像导数。
	在除1之外的所有情况下,使用?????×?????可分内核来计算导数。
	当?????=?时,使用3×1或1×3内核(即不进行高斯平滑),ksize = 1时只能用于第一个或第二个x或y衍生物。
	还有特殊值ksize = CV_SCHARR(-1),它对应于3×3 Scharr滤波器,可以提供比3×3 Sobel更准确的结果。
	Scharr aperture 是:

Scharr aperture

	对于x-导数,或对y-导数进行转置。
	该函数通过将图像与适当的内核进行卷积来计算图像导数:

dst

	Sobel算子结合了高斯平滑和微分,因此结果或多或少地抵抗噪声。 
	大多数情况下,使用(xorder = 1,yorder = 0,ksize = 3)或(xorder = 0,yorder = 1,ksize = 3),
	调用函数以计算第一个x或y图像导数。 
	第一种情况对应于以下内核:

kernel

	第二种情况对应于以下内核:

kernel

	参数
	SRC	输入图像。
	DST	输出与src相同大小和相同通道数的图像。
	ddepth	输出图像深度,见#combinations ; 在8位输入图像的情况下,它将导致截断的导数。
	DX	导数x的顺序。
	DY	导数y的顺序。
	ksize	扩展的Sobel内核的大小; 它必须是1,3,5或7。
	scale	计算导数值的可选比例因子; 默认情况下,不应用缩放(有关详细信息,请参阅# getDerivKernels)。
	delta	在将结果存储在dst之前添加到结果中的可选delta值。
	borderType	像素外推法,参见#BorderTypes

function:
def convertScaleAbs(src, dst=None, alpha=None, beta=None):
	缩放,计算绝对值,并将结果转换为8位。
	在输入数组的每个元素上,函数convertScaleAbs按顺序执行三个操作:缩放,取绝对值,转换为无符号8位类型:

d s t i = s a t u r a t e u c h a r ( ∣ α ∗ s r c i + β ∣ ) dst_i = saturate_{uchar}(|\alpha*src_i+\beta|) dsti​=saturateuchar​(∣α∗srci​+β∣)

在多通道阵列的情况下,该功能独立处理每个通道。 
当输出不是8位时,可以通过调用convertTo方法(或使用矩阵表达式)然后通过计算结果的绝对值来模拟操作。 

	参数
	SRC	输入数组。
	DST	输出数组。
	alpha	可选的比例因子。
	beta	可选delta添加到缩放值。

Eg.

#导入图像
img = cv2.imread('car.png')

car

#用sobel算子计算梯度,分别求X,Y方向的梯度
sobelX = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelY = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
#封装在plt中
plt.subplot(121)
plt.imshow(sobelX)
plt.title('sobelX')
plt.subplot(122)
plt.imshow(sobelY)
plt.title('sobelY')
#显示图片
plt.show()

Result.1
sobelx&sobely

#白色到黑色的差值应该为正数,黑色到白色的差值,应该为负数,在sobel中所有的负数会被截断为0,所以要取绝对值
sobelX = cv2.convertScaleAbs(sobelX)
sobelY = cv2.convertScaleAbs(sobelY)
#分别计算x和y,再求和
sobelXY = cv2.addWeighted(sobelX,0.5,sobelY,0.5,0)
cv_show('sobelXY',sobelXY)

Result.2
sobel_xy

#如过直接在sobel函数中计算梯度,效果并不理想
# sobelXY = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
# sobelXY = cv2.convertScaleAbs(sobelXY)
# cv_show('sobelXY',sobelXY)

Result.3
sobel(x,y)

#使用其他图片测试,导入
lena = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
#分别计算sobelX和sobelY
lena_sobelX = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
lena_sobelY = cv2.Sobel(lena,cv2.CV_64F,0,1,ksize=3)
#将其中负值都绝对值化
lena_sobelX = cv2.convertScaleAbs(lena_sobelX)
lena_sobelY = cv2.convertScaleAbs(lena_sobelY)
#将sobelX,Y融合
lena_sobelXY = cv2.addWeighted(lena_sobelX,0.5,lena_sobelY,0.5,0)
#显示图像
res = np.hstack((lena,lena_sobelXY))
cv_show('lenas',res)

Result.4
lena-compare
Note.

1.建议不直接通过sobel函数实现X和Y方向上的梯度运算,因为这样计算的结果通常不准确且会有重叠。


Gradient processing-Scharr算子

function:
def Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None):
	使用Scharr算子计算第一个x或y图像导数。
	该函数使用Scharr算子计算第一个x或y空间图像导数。 函数方法为:

Functiron_Scharr

相当于:

等价函数sobel

	参数
	SRC	输入图像。
	DST	输出与src相同大小和相同通道数的图像。
	ddepth	输出图像深度,请参阅#combinations
	DX	导数x的方向。
	DY	导数y的方向。
	scale	计算导数值的可选比例因子; 默认情况下,不应用缩放(有关详细信息,请参阅getDerivKernels)。
	delta	在将结果存储在dst之前添加到结果中的可选delta值。
	borderType	像素外推法,参见cv :: BorderTypes

Eg.

#与sobel算子相比,Scharr中的核中数值会大一点
#分别计算ScharrX和ScharrY
lena_scharrX = cv2.Scharr(lena,cv2.CV_64F,1,0)
lena_scharrY = cv2.Scharr(lena,cv2.CV_64F,0,1)
#将其中负值都绝对值化
lena_scharrX = cv2.convertScaleAbs(lena_scharrX)
lena_scharrY = cv2.convertScaleAbs(lena_scharrY)
#将sobelX,Y融合
lena_scharrXY = cv2.addWeighted(lena_scharrX,0.5,lena_scharrY,0.5,0)
#显示图像
res = np.hstack((lena,lena_scharrXY))
cv_show('lenas',res)

Result.1
lena_scharr

Note.

1.Scharr算子其实本质上应该与Sobel算子的原理一致,不过Scharr算子核中的数值会比Sobel算子的数值大,这将会使得,与锚点相近的像素点权重都变得更大,差异更大,也就能够把一些Sobel算子中没有计算出来的微小梯度放大。


Gradient processing-Laplacian算子

function:
def Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None):
	计算图像的拉普拉斯算子。
	当ksize> 1时,该函数通过将使用Sobel运算符来计算X和Y的二阶导,进而相加来计算源图像的拉普拉斯算子:

laplacian

当ksize == 1时,通过使用以下3×3过滤器过滤图像来计算拉普拉斯算子:

ksize==1

	参数
	SRC	来源图片。
	DST	与src相同大小和相同通道数的目标图像。
	ddepth	目标图像的所需深度。
	ksize	用于计算二阶导数滤波器的过滤器大小。有关详细信息,请参阅getDerivKernels。大小必须是正数且为奇数。
	scale	计算的拉普拉斯算子值的可选比例因子。默认情况下,不应用缩放。有关详细信息,请参阅getDerivKernels。
	delta	在将结果存储在dst之前添加到结果中的可选增量值。
	borderType	像素外推方法,请参阅cv :: BorderTypes

Eg.

#laplacian算子只需要调用一次,不必分别指定X,Y方向导数
lena_laplacian = cv2.Laplacian(lena,cv2.CV_64F)
#将其中负值都绝对值化
lena_laplacian = cv2.convertScaleAbs(lena_laplacian)
# #显示图像
res = np.hstack((lena,lena_laplacian))
cv_show('lenas',res)

Result.1
laplacian

Note.

1.laplacian算子是计算二阶导。


Gradient processing-计算梯度计算的对比

Code.

#显示原图以及各种算子计算梯度的效果图
res = np.hstack((lena,lena_sobelXY,lena_scharrXY,lena_laplacian))
cv_show("all",res)

Result.

all
Note.

1.Sobel算子能大致计算出图像的梯度变化,Scharr算子计算较之更加细化,能把更细小的梯度变化计算出来。
2.Laplacian算子计算的梯度,略显模糊,但各个算子,应该都有在不同场合下必要的应用。


END

【opencv2】生成图像的梯度图 先看代码: #include #include #include #include using namespace cv; using namespace std; typedef unsigned char byte; void gradientGray(Mat &src, Mat &mag); int main(){ Mat src = imread("1.jpg", 阅读详情

相关推荐

在OpenCV里实现正规化变换2

上面学习了L1范数,还有L2范数,那么什么是范数的分类呢?其实要从数学上一条公式来分析出来,这个公式如下: Lp=|x|p=(i|xi|p)1p 在这条公式里,根据p值来取不同的值来分类, P=1-范数:║x║1=│x1│+│x2│+…+│xn│ (曼哈顿距离) P=2-范数:║x║2=(│x1│2+│x2│2+…+│xn│2)1/2...

大坡3D软件开发 807

Opencv学习笔记五(图像卷积 图像模糊、噪声 图像去噪)

图像卷积操作 图像卷积可以看成是一个窗口区域在另外一个大的图像上移动,对每个窗口覆盖的区域都进行点乘得到的值作为中心像素点的输出值。窗口的移动是从左到右,从上到下。窗口可以理解成一个指定大小的二维矩阵,里面有预先指定的值。 dst=cv.blur(src,(15,15)) 图像均值与高斯模糊 本质上是不同的卷积核对图像进行图像卷积 均值模糊是卷积核的系数完全一致, 高斯模糊考虑了中心像...

qq_42319367的博客 1372

嵌入式开发实战:如何用cJSON库在STM32上实现轻量级JSON通信(附完整代码)

本文详细介绍了如何在STM32嵌入式系统中使用cJSON库实现高效的JSON通信方案。针对嵌入式环境的内存限制,提供了内存优化策略、cJSON库的深度定制方法以及完整的通信流程实现代码,帮助开发者解决JSON解析效率低下和跨平台兼容性等核心挑战。

star5的专栏 475

4.opencv——图像变换2(图像模糊-均值滤波,高斯滤波,中值滤波,方框,双边滤波,2D卷积)

图像变换2(图像模糊,阈值处理)图像模糊均值滤波高斯滤波方框滤波中值滤波双边滤波2D卷积阈值处理全局阈值处理二值化阈值处理反二值化阈值处理截断阈值处理超阈值零处理低阈值零处理Otsu算法阈值处理三角算法阈值处理自适应阈值处理 图像模糊 均值滤波 高斯滤波 方框滤波 中值滤波 双边滤波 2D卷积 阈值处理 全局阈值处理 二值化阈值处理 反二值化阈值处理 截断阈值处理 超阈值零处理 低阈值零处理 Otsu算法阈值处理 三角算法阈值处理 自适应阈值处理 ...

weixin_47166032的博客 1437

学习笔记9--智能驾驶的功能安全设计之功能安全设计

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。此专栏是关于《自动驾驶系统设计及应用》书籍的笔记.

FUXI_Willard 1798

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1430

OpenCV-python学习笔记(九)——图像梯度

OpenCV-python学习笔记(九)——图像梯度

weixin_56321457的博客 1892

SEED-VIG数据集实战:5步搞定驾驶员疲劳检测模型(附Python代码)

本文提供了一份基于SEED-VIG数据集的驾驶员疲劳检测模型实战指南。通过五个核心步骤——数据准备、特征提取、模型训练、优化评估及部署思路,详细讲解了如何利用脑电信号构建分类器,并附有完整的Python代码,帮助开发者快速上手这一智能座舱关键技术。

w1x2y3的博客 263

Python OpenCV 之图像梯度,Sobel 算子、Scharr 算子和 laplacian 算子

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。 OpenCV 提供三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr 和 Laplacian

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

thermal系列(5)-DTSI中配置Thermal

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录thermal系列目录DTSI中配置ThermalDTSI节点类型描述CPU0的配置举例CPU核hot-plugging举例修改热缓解阈值DTSI的node中带有tracks-lowDTSI中关闭某个Thermal Zones thermal系列目录 thermal系列(1)-引言部分 thermal.

fulinux的博客 1232

windows 10 等保3级配置核查与加固(附自动化加固脚本)

关闭注册表编辑器,然后重新启动计算机。\\r\\n 对于OPC通讯站(server\\\\client),【密码最长存留期】需要设置为0,即密码不过期。‌445端口‌:修改注册表禁用。打开命令提示符,运行命令“gpedit.msc”打开组策略编辑器,浏览到路径“本地计算机策略\\\\计算机配置\\\\Windows设置\\\\安全设置\\\\本地策略\\\\安全选项”,在右边窗格中找到“Microsoft网络客户端:将未加密的密码发送到第三方SMB服务器”,双击,配置为“已禁用”,确定。

悦分享 160

opencv之图像梯度处理和边缘检测(四)

是因为经过第二步得到的边缘不经过处理是没办法使用的,因为高斯滤波的原因,边缘会变得模糊,导致经过第二步后得到的边缘像素点非常多,因此我们需要对其进行一些过滤操作,而非极大值抑制就是一个很好的方法,它会对得到的边缘像素进行一个排除,使边缘尽可能细一点。如果你还记得高数中用一阶导数来求极值的话,就很容易理解了:把图片想象成连续函数,因为边缘部分的像素值是与旁边像素明显有区别的,所以对图片局部求极值,就可以得到整幅图片的边缘信息了。不过图片是二维的离散函数,导数就变成了差分,这个差分就称为图像的梯度。

Hao_diedie的博客 2424

Sigrity Power DC Package Multi-Resistor Compact ET Model Extraction模式提取封装基板电热阻模型

DIE(定义DIE的参数):material设置为silicon(硅),Attach material(贴片的材料,设置为Die Attach),Attach thickness(贴片的材料的厚度,厚度设置为0.001mm,点击ok。Cap为覆盖材料,Material定义材料类型,thickness定义厚度,length和width定义长宽,Adhesive Material为胶的材料,Adhesive Material为胶的厚度,本例不定义,跳过即可。

weixin_54787054的博客 440

OpenCV-Python图像处理学习笔记(四)——形态学操作、图像梯度

形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。 1 形态学操作 形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。就像土壤侵蚀一样,这个操作会

weixin_57726558的博客 783

当C#遇见声音魔法:从麦克风到文字的0.1秒奇幻漂流

为什么选300Hz?因为人声基频通常在85-255Hz,但清脆的“啊”可能到2kHz,所以300Hz是安全区!(参考知识库[1])

墨夶的博客 366

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于python的opencv项目实战笔记(四)—— 图像梯度处理

import cv2 as cv import matplotlib.pyplot as plt import numpy as np def cv_show(name,img): cv.imshow(name,img) cv.waitKey(0) cv.destroyAllWindows() #Sobel算子:右-左,下-上 def cv_soble(img): #第二个参数为图像的深度,第三个和第四个分别表示dx,dy水平和竖直方向,ksize是Sobel算子的大小(一.

m0_53257476的博客 1666

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机视觉OpenCV(四):图像梯度处理和边缘检测

计算机视觉OpenCV:图像梯度处理和边缘检测,包括Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测

Aiolei的博客 977

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OpenCV中的图像处理3.4-3.6(四)平滑化、形态学、图像梯度

翻译及二次校对:cvtutorials.com编辑者:廿瓶鲸(和鲸社区Siby团队成员)

weixin_64215932的博客 1014

OpenCV四) —— 图像形态学处理(腐蚀操作 & 膨胀操作 & 开运算与闭运算 & 梯度运算 & 礼貌与黑帽)

图像形态学处理 腐蚀操作 用腐蚀操作就能够去掉这些毛刺 毛刺都没有了,线条变细了 iteration改成2、3就更细了 膨胀操作 膨胀操作可以让变细的线条变粗,和腐蚀操作是互为逆操作的 腐蚀是在这种混合的情况下都变黑,而膨胀是在这种情况下都变白 开运算与闭运算 开:先腐蚀再膨胀 闭:先膨胀再腐蚀 梯度运算 梯度=膨胀-腐蚀 提取轮廓 礼貌与黑帽 礼帽 = 原始输入-开运算结果 提取出刺来 黑帽 ...

hxxjxw的博客 2198

《OpenCV3编程入门》学习笔记6 图像处理(四)形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽

6.4 形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽 高级形态学变换,基于腐蚀与膨胀,利用morphologyEx函数实现 6.4.1 开运算 1.腐蚀后膨胀的过程,数学表达式:dst=open(src,element)=dilate(erode(src,element)) 2.作用:消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积 6.4.2 闭运算 1...

ccchenxi的博客 752

从棋盘格到真实照片:用OpenCV Sobel算子实战图像边缘检测,对比Scharr与Canny效果

本文深入探讨了OpenCV中的Sobel算子、Scharr算子和Canny算法在图像边缘检测中的应用与效果对比。通过棋盘格和真实照片的实验,展示了不同算法在边缘检测精度、噪声鲁棒性和计算效率上的差异,为计算机视觉项目中的算法选择提供了实用指导。

weixin_30701575的博客 527

OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔 目录OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔1. 图像梯度1.1 Sobel和Scharr算子1.2 Laplacian算子2. Canny边缘检测2.1 多阶段的Canny边缘检测算法2.2 OpenCV中的Canny Edge检测 1. 图像梯度 首先我们来看看什么是图像梯度:图像梯度可以把图像看作二维离散函数,图像梯度就是这个二维函数的求导,图像边缘一般都是通过对图像进行梯度运算来

小菜鸡的小博客 1万+

OpenCV图像处理(十一)---图像梯度

安培定则:也叫右手螺旋定则,是表示电流和电流激发磁场的磁感线方向间关系的定则。通电直导线中的安培定则(安培定则一):用右手握住通电直导线,让大拇指指向电流的方向,那么四指指向就是磁感线...

xyl666666的博客 5013

梯度是什么?图像梯度又怎么理解?

梯度:参考 1.已知Z=F(X,Y),假设它的图像是这样: 2.固定住X,改变Y。在每个点上,函数Z的变化值除以Y的变化值就是此线的斜率。固定住Y,改变X,也是同样的道理 3.在每一点,都可以得到在x方向上变化的斜率大小和正负,可以表示为一个箭头。y方向上也是一样。 4.梯度就是X方向的箭头和Y方向的箭头的和。假设某一点上,x的偏导数为3,y的偏导数为-1,则该点的梯度...

方寸想法,编码宇宙 2万+

Opencv(十五) : 图像梯度处理

机器视觉Opencv中图像梯度处理的内容

Mrliu__的博客 1545

【OpenCV】图像梯度处理

如果你还记得高数中用一阶导数来求极值的话,就很容易理解了:把图片想象成连续函数,因为边缘部分的像素值是与旁边像素明显有区别的,所以对图片局部求极值,就可以得到整幅图片的边缘信息了。不过图片是二维的离散函数,导数就变成了差分,这个差分就称为图像的梯度。

m0_73881415的博客 1187
上一篇: OpenCV(三)之图像形态学处理
下一篇: OpenCV(五)之图像边缘检测
DeepLearningJay
博客等级 码龄7年 3064粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值