Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenCV图像处理(十一)---图像梯度

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

作者头像
用户5410712
发布于 2022-06-01 11:12:06
发布于 2022-06-01 11:12:06
56800
代码可运行
举报
文章被收录于专栏:居士说AI居士说AI
运行总次数:0
代码可运行

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

前言

不知不觉,四月的第一个周已经故去了,国外感染新冠病毒的人口越来越多,庆幸我们出生于伟大的中国,愿人类世界尽快战胜病毒,恢复和谐社会。在上期的文章中,我们学习了图像的形态学技术,知道了开运算和闭运算,今天我们来学习图像的梯度知识,这对以后的图像边缘检测尤为重要,涉及到一部分数学知识,但是很简单,最后我会用一句话来概括,接着往下看。

图像梯度

图像梯度可以把图像看成二维离散函数,图像梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(横向、纵向等等)。

1.1 数学推导

首先,我们来看一下传统微积分里面的求导公式(对x的一阶微分):

然而,图像是二维函数f(x,y),这时候的微分就是偏微分了:

对 x方向的偏微分:

对y方向的偏微分:

现在考虑一个问题,ϵ这个值如何选取呢?上高数的时候,我们都是连续函数,因此这个值可以取得很小,ϵ可以理解为x的最小前进步伐,但是图像是一个离散的二维函数,ϵ不能取得很小,图像中像素来离散的,而像素之间最小的距离是1,ϵ取为1,所以,上面的公式变为:

由此,我们得到了图像在x方向和y方向的梯度公式了,值得注意的是,如果我们仔细观察公式就可发现,所谓x方向和y方向的梯度公式不就是相邻连个像素值之间的差值吗?是的,你没看错,当然,我们很多时候都会将两个方向的梯度进行合成:

由于上面的合成方式在数学计算上有点麻烦,因为直接采用绝对值计算:

我们总结一句话:图像梯度的本质:当前方向上相邻像素的差值。

1.2 原始图片

一座城市的高楼大厦

1.3 代码实践

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding:utf-8
import cv2 
import numpy as np

# Scharr算子实现梯度计算
def Scharr_demo(image):
    # x 方向梯度
    image_grad_x = cv2.Scharr(image, cv2.CV_32F, 1, 0)
    # y 方向梯度
    image_grad_y = cv2.Scharr(image, cv2.CV_32F, 0, 1)
    # 分别求绝对值并转化为8位的图像上,这样做方便显示
    image_gradx = cv2.convertScaleAbs(image_grad_x) 
    image_grady = cv2.convertScaleAbs(image_grad_y)
    # 显示两个方向图像
    cv2.imshow("image_gradient-x", image_gradx)
    cv2.imshow("image_gradient-y", image_grady)

    #两个方向梯度的叠加,权重各自一半
    image_gradxy = cv2.addWeighted(image_gradx, 0.5, image_grady, 0.5, 0)
    cv2.imshow("image_gradient", image_gradxy)



if __name__ == '__main__':
    image = cv2.imread("./test01.jpg")
    cv2.imshow("src_image", image)
    Scharr_demo(image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

代码解读:以上代码就是用了Scharr算子实现了图像的梯度计算,因此只需要重点关注cv2.Scharr()这个函数即可,一共三个参数,第一个是需要计算梯度的图像,第二个是图像的数据格式,第三个参数为1,0或者0,1,分别对应x方向与y方向,一般情况下,单独梯度计算出来后都会进行叠加以增强效果,因此叠加函数就排上了用场,由于各自取一半的可信度,因此,权重都为0.5,之前我们讲过这个函数哦。

1.4 效果展示

x 方向梯度图像:

y 方向梯度图像:

x,y梯度叠加图像:

(可以看到,图像的边缘已经被检测出来了,后期我们可能继续深入讲解)

结语

今天的知识分享结束了,虽然涉及到了一定的数学知识,不过不要担心哦,因为我们用一句话总结了梯度的定义哦,并且梯度的实现方式opencv库函数已经帮我们做到了,我们只需要根据参数使用就好了,是不是很简单呢,大家下去好好消化哦,我们下期再见。

编辑:玥怡居士|审核:小圈圈居士

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT进阶之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2020/09/17
1.3K0
Python opencv图像处理基础总结(五)  图像金字塔  图像梯度  Canny算法边缘提取
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低
叶庭云
2022/05/09
7870
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
17张经典动态图带您看懂电动机运行原理
导读:电动机存在于各行各业,如今在制造业转型升级的大环境下,我们也许可以透过微观看本质,了解它的运行原理,也许会让我们对它背后所产生的数据有更深的认识!直流电机的设计中,如果采用两个线圈(两极),在静止状态时,线圈与磁场平衡,线圈产生的转动力矩无法克服磁场的阻力,转动不起来,除非使用外力破坏这种平衡,这些都是物理大神的实践发现。来源:工控网 电动机是一种旋转式电动机器,它将电能转变为机械能,它主要包括一个用以产生磁场的电磁铁绕组或分布的定子绕组和一个旋转电枢或转子。在定子绕组旋转磁场的作用下,其在电枢鼠笼式
钱塘数据
2018/03/01
2.1K0
17张经典动态图带您看懂电动机运行原理
基于OpenCV的图像梯度与边缘检测!
严格的说,梯度计算需要求导数。但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值。图像梯度表示的是图像变化的速度,反映了图像的边缘信息。
Datawhale
2020/07/09
4.7K0
基于OpenCV的图像梯度与边缘检测!
OpenCV从零基础---检测及分割图像的目标区域
作者:王抒伟 编辑:王抒伟 算了 爱看多久看多久 零 参考目录: 1.获取图片 2.转换灰度并去噪声 3.提取图像的梯度 4.我们继续去噪声 5.图像形态学(牛逼吧、唬人的) 6.细节刻画 7.找出昆虫区域的轮廓 8.画出轮廓 9.裁剪出来就完成啦 一 第一天: 老师:你知道么,今天有人问了我一个问题。 ~.我:什么? 老师:他说很难。 ~.我:关于什么的? 老师:图像处理。 ~.我:喔,你说说看,我确实做了不少图像处理的东西(心里默念,你不知知道你给过我多少图像吗?) 老师:好嘞!在用深度学习的时候,
机器学习算法工程师
2018/03/06
13.1K1
OpenCV从零基础---检测及分割图像的目标区域
opencv(4.5.3)-python(十五)--图像梯度
OpenCV提供了三种类型的梯度滤波器或高通滤波器,Sobel, Scharr和Laplacian。
用户9875047
2022/12/07
4150
opencv(4.5.3)-python(十五)--图像梯度
番外篇: 图像梯度
还记得前面平滑图像中提到的滤波与模糊的区别吗?我们说低通滤波器是模糊,高通滤波器是锐化,这节我们就来看看高通滤波器。
CodecWang
2021/12/07
7020
番外篇: 图像梯度
图像梯度的基本原理
https://blog.csdn.net/saltriver/article/details/78987096
公众号机器学习与AI生成创作
2021/11/16
9310
Python opencv图像处理基础总结(六) 直线检测 圆检测 轮廓发现
我还有改变的可能性 一想起这一点 我就心潮澎湃 文章目录 一、直线检测 使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成 # 标准霍夫线变换 cv2.HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None) image:经过边缘检测的输出图像,8位,单通道二进制源图像 rho:距离步长 theta:角度步长 threshold:阈值,只有
叶庭云
2020/09/17
9.1K0
Python opencv图像处理基础总结(六) 直线检测 圆检测 轮廓发现
[图像处理] Python+OpenCV实现车牌区域识别
这里原理推荐我以前C++图像处理的文章,如下:https://blog.csdn.net/column/details/eastmount-mfc.html
Ai学习的老章
2019/04/23
4.8K0
[图像处理] Python+OpenCV实现车牌区域识别
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/09/01
9660
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
OpenCV图像处理(十四)---边缘检测
热力学第二定律(second law of thermodynamics),热力学基本定律之一,克劳修斯表述为:热量不能自发地从低温物体转移到高温物体。开尔文表述为:不可能从单一热源取热使之完全转换为有用的功而不产生其他影响。熵增原理:不可逆热力过程中熵的微增量总是大于零。在自然过程中,一个孤立系统的总混乱度(即“熵”)不会减小。
用户5410712
2022/06/01
5690
OpenCV图像处理(十四)---边缘检测
opencv学习笔记 python实现 图像梯度与图像边缘
        图像梯度即求导数,导数能反映出图像变化最大的地方,图像变化最大的地方也就是图像的边缘。
用户2965768
2018/09/29
1.2K0
opencv学习笔记 python实现 图像梯度与图像边缘
OpenCV与图像处理(二)
以下代码均在python3.6,opencv4.2.0环境下试了跑一遍,可直接运行。
Must
2020/07/28
7360
OpenCV与图像处理(二)
【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
效果图看完,我们来唠唠嗑。 首先,需要说明的是,浅墨这篇文章最后的示例代码是采用两周前刚刚发布的2.4.9来书写的。里面的lib都已经改成了2.4.9版本的。如果大家需要运行的话,要么配置好2.4.9.要么把浅墨在工程中包含的末尾数字为249的各种lib改成之前的248或者你对应的OpenCV版本。 不然会提示: LINK : fatal error LNK1181: 无法打开输入文件“opencv_calib3d248.lib”之类的错误。 OpenCV 2.4.9的配置和之前的2.4.8差不多,如果还是不太清楚,具体可以参考浅墨修改过的对应2.4.9版的配置文章: 【OpenCV入门教程之一】 安装OpenCV:OpenCV 2.4.8或2.4.9 +VS 开发环境配置 第二,给大家分享一个OpenCV中写代码时节约时间的小常识。其实OpenCV中,不用namedWindow,直接imshow就可以显示出窗口。大家看下文的示例代码就可以发现,浅墨在写代码的时候并没有用namedWindow,遇到想显示出来的Mat变量直接imshow。我们一般是为了规范,才先用namedWindow创建窗口,再imshow出它来,因为我们还有需要用到指定窗口名称的地方,比如用到trackbar的时候。而一般情况想显示一个Mat变量的图片的话,直接imshow就可以啦。 OK,开始正文吧~ 一、关于边缘检测 在具体介绍之前,先来一起看看边缘检测的一般步骤吧。 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核(具体见“高斯滤波原理及其编程离散化实现方法”一文),然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(具体程序实现见下文)。 2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。 3)检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。 另外,需要注意,下文中讲到的Laplace算子,sobel算子和Scharr算子都是带方向的,所以,示例中我们分别写了X方向,Y方向和最终合成的的效果图。 OK,正餐开始,召唤canny算子。:) 二、canny算子篇 2.1 canny算子相关理论与概念讲解
全栈程序员站长
2022/09/02
1.1K0
【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
OpenCV图像处理专栏十九 | 手动实现基于Canny算子的边缘检测
接着昨天手动构造Sobel算子实现检测,今天来讲讲如何手动实现Canny边缘检测。由于要实现这个算法的需要的先验知识比较多,所以在学习这个算法的实现之前我们先来学习一下用于图像二值化的OSTU大津法。
BBuf
2020/03/19
1.5K0
基于Opencv的抠图
step2:用Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域。
狼啸风云
2020/02/13
5.8K0
基于Opencv的抠图
工业机器人伺服结构和原理
伺服的结构是怎样的?一个最简易的伺服控制单元,就是一个伺服电机加伺服控制器,今天就来解析下伺服电机与伺服控制器。 电机动作的原理 右手螺旋法则(安培定则)——通电生磁   安培定则,也叫右手螺旋定则,
机器人网
2018/04/19
1.3K0
工业机器人伺服结构和原理
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
HSV 的色相范围为 [0,179],饱和度范围为 [0,255],值范围为 [0,255]。不同的软件使用不同的规模。
机器视觉CV
2019/07/15
3.2K0
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
Sobel算子
算法:Sobel算子是离散的微分算子,结合了高斯平滑和微分求导运算,利用局部差分寻找边缘,计算所得的值是一个梯度的近似值。
裴来凡
2022/05/28
3300
Sobel算子
推荐阅读
相关推荐
Python opencv图像处理基础总结(五) 图像金字塔 图像梯度 Canny算法边缘提取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验