iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中的opencv图像梯度实例分析
  • 555
分享到

python中的opencv图像梯度实例分析

2023-06-30 17:06:35 555人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本文小编为大家详细介绍“python中的OpenCV图像梯度实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中的opencv图像梯度实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。图像梯

本文小编为大家详细介绍“python中的OpenCV图像梯度实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中的opencv图像梯度实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

图像梯度

图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。图像梯度计算需要求导数,但是图像梯度一般通过计算像素值的差来得到梯度的近似值(近似导数值)。(差分,离散)

Sobel算子、Scharr算子和Laplacian算子的使用。

Sobel理论基础

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

python中的opencv图像梯度实例分析

滤波器通常是指由一幅图像根据像素点(x, y)临近的区域计算得到另外一幅新图像的算法

滤波器是由邻域及预定义的操作构成的,滤波器规定了滤波时所采用的形状以及该区域内像素值的组成规律。滤波器也被称为“掩模”、“核”、“模板”、“窗口”、“算子”等。一般信号领域将其称为“滤波器”,数学领域将其称为“核”。

线性滤波器: 滤波的目标像素点的值等于原始像素值及其周围像素值的加权和。这种基于线性核的滤波,就是所熟悉的卷积。

计算水平方向偏导数的近似值

将Sobel算子与原始图像src进行卷积计算,可以计算水平方向上的像素值变化情况。

例如,当Sobel算子的大小为3×3时,水平方向偏导数Gx的计算方式为:

python中的opencv图像梯度实例分析

计算垂直方向偏导数的近似值

当Sobel算子的大小为3×3时,垂直方向偏导数Gy的计算方式为:

python中的opencv图像梯度实例分析

Sobel算子及函数使用

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

dst = cv2.Sobel( src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]] )
  • dst代表目标图像

  • src代表原始图像

  • ddepth代表输出图像的深度

python中的opencv图像梯度实例分析

  • dx代表x方向上的求导阶数。

  • dy代表y方向上的求导阶数。

  • ksize代表Sobel核的大小。该值为-1时,则会使用Scharr算子进行运算。

  • scale代表计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。

  • delta代表加在目标图像dst上的值,该值是可选的,默认为0。

  • borderType代表边界样式。

python中的opencv图像梯度实例分析

注意点:参数ddepth

在函数cv2.Sobel()的语法中规定,可以将函数cv2.Sobel()内ddepth参数的值设置为-1,让处理结果与原始图像保持一致。但是,如果直接将参数ddepth的值设置为-1,在计算时得到的结果可能是错误的。

在实际操作中,计算梯度值可能会出现负数。如果处理的图像是8位图类型,则在ddepth的参数值为-1时,意味着指定运算结果也是8位图类型,那么所有负数会自动截断为0,发生信息丢失。为了避免信息丢失,在计算时要先使用更高的数据类型cv2.CV_64F,再通过取绝对值将其映射为cv2.CV_8U(8位图)类型。

通常要将函数cv2.Sobel()内参数ddepth的值设置为“cv2.CV_64F”。

要将偏导数取绝对值,以保证偏导数总能正确地显示出来。

在OpenCV中,使用函数cv2.convertScaleAbs()对参数取绝对值,该函数的语法格式为:

dst = cv2.convertScaleAbs( src [, alpha[, beta]] )
  • dst代表处理结果。

  • src代表原始图像。

  • alpha代表调节系数,该值是可选值,默认为1。

  • beta代表调节亮度值,该值是默认值,默认为0。

该函数的作用是将原始图像src转换为256色位图,其可以表示为:

dst=saturate(src*alpha+beta)

式中,saturate()表示计算结果的最大值是饱和值,例如: 当“src*alpha+beta”的值超过255时,其取值为255。

**例子:**使用函数cv2.convertScaleAbs()对一个随机数组取绝对值。

import cv2import numpy as np img=np.random.randint(-256,256, size=[4,5], dtype=np.int16)rst=cv2.convertScaleAbs(img)print("img=\n", img)print("rst=\n", rst)

方向

在函数cv2.Sobel()中,参数dx表示x轴方向的求导阶数,参数dy表示y轴方向的求导阶数。参数dx和dy通常的值为0或者1,最大值为2。

如果是0,表示在该方向上没有求导。当然,参数dx和参数dy的值不能同时为0。

参数dx和参数dy可以有多种形式的组合,主要包含:

  • 计算x方向边缘(梯度):dx=0, dy=1。

  • 计算y方向边缘(梯度):dx=1, dy=0。

  • 参数dx与参数dy的值均为1:dx=1, dy=1。

  • 计算x方向和y方向的边缘叠加:通过组合方式实现。

例子

“dx=1, dy=0”。当然,也可以设置为“dx=2, dy=0”。此时,会仅仅获取垂直方向的边缘信息,此时的语法格式为:

dst = cv2.Sobel( src , ddepth , 1 , 0 )

“dx=0, dy=1”。当然,也可以设置为“dx=0, dy=2”。此时,会仅仅获取水平方向的边缘信息,此时的语法格式为:

dst = cv2.Sobel( src , ddepth , 0 , 1 )

“dx=1, dy=1”,也可以设置为“dx=2, dy=2”,或者两个参数都不为零的其他情况。此时,会获取两个方向的边缘信息,此时的语法格式为:

dst = cv2.Sobel( src , ddepth , 1 , 1 )

计算x方向和y方向的边缘叠加

如果想获取x方向和y方向的边缘叠加,需要分别获取水平方向、垂直方向两个方向的边缘图,然后将二者相加。

dx= cv2.Sobel( src , ddepth , 1 , 0 )dy= cv2.Sobel( src , ddepth , 0 , 1 )dst=cv2.addWeighted( src1 , alpha , src2 , beta , gamma )

例子:

使用函数cv2.Sobel()获取图像水平方向的完整边缘信息

将参数ddepth的值设置为cv2.CV_64F,并使用函数cv2.convertScaleAbs()对cv2.Sobel()的计算结果取绝对值。

import cv2o = cv2.imread('Sobel4.bmp', cv2.IMREAD_GRAYSCALE)Sobelx = cv2.Sobel(o, cv2.CV_64F,0,1)Sobelx = cv2.convertScaleAbs(Sobelx)cv2.imshow("original", o)cv2.imshow("x", Sobelx)cv2.waiTKEy()cv2.destroyAllwindows()

计算函数cv2.Sobel()在水平、垂直两个方向叠加的边缘信息。

import cv2o = cv2.imread('Sobel4.bmp', cv2.IMREAD_GRAYSCALE)Sobelx = cv2.Sobel(o, cv2.CV_64F,1,0)Sobely = cv2.Sobel(o, cv2.CV_64F,0,1)Sobelx = cv2.convertScaleAbs(Sobelx)Sobely = cv2.convertScaleAbs(Sobely)Sobelxy =  cv2.addWeighted(Sobelx,0.5, Sobely,0.5,0)cv2.imshow("original", o)cv2.imshow("xy", Sobelxy)cv2.waitKey()cv2.destroyAllWindows()

Scharr算子及函数使用

在离散的空间上,有很多方法可以用来计算近似导数,在使用3×3的Sobel算子时,可能计算结果并不太精准。

OpenCV提供了Scharr算子,该算子具有和Sobel算子同样的速度,且精度更高。

可以将Scharr算子看作对Sobel算子的改进,其核通常为:

python中的opencv图像梯度实例分析

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代表边界样式。

在函数cv2.Sobel()中,如果ksize=-1,则会使用Scharr滤波器。

如下语句:

dst=cv2.Scharr(src, ddepth, dx, dy)

dst=cv2.Sobel(src, ddepth, dx, dy, -1)

是等价的。函数cv2.Scharr()和函数cv2.Sobel()的使用方式基本一致。参数ddepth的值应该设置为“cv2.CV_64F”,并对函数cv2.Scharr()的计算结果取绝对值,才能保证得到正确的处理结果。

具体语句为:

dst=Scharr(src, cv2.CV_64F, dx, dy)dst= cv2.convertScaleAbs(dst)

在函数cv2.Scharr()中,要求参数dx和dy满足条件:

  • dx >= 0 && dy >= 0 && dx+dy == 1

  • 和Sobel 不同, Scharr 的dx+dy 必须为1

参数dx和参数dy的组合形式有:

  • 计算x方向边缘(梯度):dx=0, dy=1。

  • 计算y方向边缘(梯度): dx=1, dy=0。

  • 计算x方向与y方向的边缘叠加:通过组合方式实现。

例子

计算x方向边缘(梯度):dx=1, dy=0

dst=Scharr(src, ddpeth, dx=1, dy=0)

计算y方向边缘(梯度):dx=0, dy=1

dst=Scharr(src, ddpeth, dx=0, dy=1)

计算x方向与y方向的边缘叠加

将两个方向的边缘相加

dx=Scharr(src, ddpeth, dx=1, dy=0) dy=Scharr(src, ddpeth, dx=0, dy=1)Scharrxy=cv2.addWeighted(dx,0.5, dy,0.5,0)

参数dx和dy的值不能都为1

Sobel算子和Scharr算子的比较

Sobel算子的缺点是,当其核结构较小时,精确度不高,而Scharr算子具有更高的精度。

Sobel算子和Scharr算子的核结构:

python中的opencv图像梯度实例分析

Laplacian算子及函数使用

Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。

通常情况下,其算子的系数之和需要为零。

一个3×3大小的Laplacian算子

python中的opencv图像梯度实例分析

Laplacian算子类似二阶Sobel导数,需要计算两个方向的梯度值。

计算结果的值可能为正数,也可能为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。

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

dst = cv2.Laplacian( src, ddepth[, ksize[, scale[, delta[, borderType]]]] )
  • dst代表目标图像。

  • src代表原始图像。

  • ddepth代表目标图像的深度。

  • ksize代表用于计算二阶导数的核尺寸大小。该值必须是正的奇数。

  • scale代表计算Laplacian值的缩放比例因子,该参数是可选的。默认情况下,该值为1,表示不进行缩放。

  • delta代表加到目标图像上的可选值,默认为0。

  • borderType代表边界样式。

该函数分别对x、y方向进行二次求导,具体为:

python中的opencv图像梯度实例分析

上式是当ksize的值大于1时的情况。当ksize的值为1时,Laplacian算子计算时采用的3×3的核如下:

python中的opencv图像梯度实例分析

通过从图像内减去它的Laplacian图像,可以增强图像的对比度,此时其算子为:

python中的opencv图像梯度实例分析

例子: 使用函数cv2.Laplacian()计算图像的边缘信息。

import cv2o = cv2.imread('Laplacian.bmp', 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()

算子总结

Sobel算子、Scharr算子、Laplacian算子都可以用作边缘检测

python中的opencv图像梯度实例分析

Sobel算子和Scharr算子计算的都是一阶近似导数的值。通常情况下,可以将它们表示为:

  • Sobel算子= |左-右| 或 |下-上|

  • Scharr算子=|左-右| 或 |下-上|

Laplacian算子计算的是二阶近似导数值,可以将它表示为:

  • Laplacian算子=|中-左| + |中-右| + |中-下| + |中-上|

读到这里,这篇“python中的opencv图像梯度实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

--结束END--

本文标题: python中的opencv图像梯度实例分析

本文链接: https://www.lsjlt.com/news/330690.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中的opencv图像梯度实例分析
    本文小编为大家详细介绍“python中的opencv图像梯度实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中的opencv图像梯度实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。图像梯...
    99+
    2023-06-30
  • python中的opencv 图像梯度
    目录图像梯度Sobel理论基础计算水平方向偏导数的近似值计算垂直方向偏导数的近似值Sobel算子及函数使用方向计算x方向和y方向的边缘叠加Scharr算子及函数使用Sobel算子和S...
    99+
    2022-11-11
  • OpenCV 图像梯度的实现方法
    目录概述梯度运算礼帽黑帽Sobel 算子计算 x计算 y计算 x+y融合概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 Op...
    99+
    2022-11-12
  • OpenCV-Python实现图像梯度与Sobel滤波器
    目录图像梯度Sobel滤波器图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度...
    99+
    2022-11-12
  • python OpenCV图像金字塔实例分析
    这篇“python OpenCV图像金字塔实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python&nb...
    99+
    2023-07-02
  • Python OpenCV图像识别的示例分析
    小编给大家分享一下Python OpenCV图像识别的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、人脸识别主要有以下两种实现方法:哈尔(Haar)级联法:专门解决人脸识别而推出的传统算法;实现步骤:...
    99+
    2023-06-29
  • python opencv图像处理基本操作的示例分析
    本篇文章给大家分享的是有关python opencv图像处理基本操作的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。①读取图像②显示图像该函数中,name是显示窗口的名...
    99+
    2023-06-25
  • Python+OpenCV图像处理之直方图统计的示例分析
    这篇文章主要为大家展示了“Python+OpenCV图像处理之直方图统计的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python+OpenCV图像处理之直方图统计的示例分析”这篇文章...
    99+
    2023-06-22
  • Python-OpenCV深度学习的示例分析
    这篇文章将为大家详细讲解有关Python-OpenCV深度学习的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 计算机视觉中的深度学习简介深度学习推动了计算机视觉领域的深刻变革,我们首先解释深...
    99+
    2023-06-22
  • Python中图像灰度非线性变换的示例分析
    这篇文章将为大家详细讲解有关Python中图像灰度非线性变换的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.图像灰度非线性变换原始图像的灰度值按照DB=DA×DA/255的...
    99+
    2023-06-29
  • Python OpenCV 图像平移的实现示例
    每次学习新东西的时候,橡皮擦都是去海量检索,然后找到适合自己理解的部分。 再将其拼凑成一个小的系统,争取对该内容有初步理解。 今天这 1 个小时,核心要学习的是图像的平移,在电脑上随...
    99+
    2022-11-12
  • Python Pytorch图像检索实例分析
    这篇文章主要介绍“Python Pytorch图像检索实例分析”,在日常操作中,相信很多人在Python Pytorch图像检索实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pyt...
    99+
    2023-06-29
  • Python-OpenCV实现图像缺陷检测的实例
    目录1.实现代码2.运行结果在Jupyter Notebook上使用Python+opencv实现如下图像缺陷检测。关于opencv库的安装可以参考:Python下opencv库的安...
    99+
    2022-11-12
  • python中的opencv 图像分割与提取
    目录图像分割与提取用分水岭算法实现图像分割与提取算法原理相关函数介绍分水岭算法图像分割实例交互式前景提取图像分割与提取 图像中将前景对象作为目标图像分割或者提取出来。对背景本身并无兴...
    99+
    2022-11-11
  • python通过opencv调用摄像头操作实例分析
    实例源码: #pip3 install opencv-python import cv2 from datetime import datetime FILENAME = 'myvideo.avi' WIDT...
    99+
    2022-06-02
    python opencv 调用摄像头
  • python中pytorch图像识别的示例分析
    这篇文章将为大家详细讲解有关python中pytorch图像识别的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、数据集爬取现在的深度学习对数据集量的需求越来越大了,也有了许多现成的数据集可供大...
    99+
    2023-06-29
  • Python中图像点运算与灰度化处理的示例分析
    这篇文章主要介绍了Python中图像点运算与灰度化处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.图像点运算概念图像点运算(Point Operation)指...
    99+
    2023-06-29
  • Python OpenCV 彩色与灰度图像的转换实现
    彩色图像转换为灰度图像 第一种方式通过 imread 读取图像的时候直接设置参数为 0 ,自动转换彩色图像为灰度图像 第二种方式,可以通过 split 进行通道分离,或者叫做读取单个...
    99+
    2022-11-12
  • 图像相似度Hash算法的示例分析
    这篇文章主要介绍图像相似度Hash算法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 图像的相似度Hash算法 Hash算法有三种,分别为平均哈希算法(aHash)、感...
    99+
    2022-10-19
  • CSS中图像透明度Hover效果的示例分析
    小编给大家分享一下CSS中图像透明度Hover效果的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 请把鼠标指针移动到...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作