【计算机视觉(11)】

基于Python的OpenCV基础入门——图像梯度变换

  • 图像梯度变换
    • Sobel算子
    • Scharr算子
    • Laplacian算子
  • 图像梯度变换的代码实现以及效果图

图像梯度变换

图像梯度变换可以用于边缘检测、特征提取、增强图像和压缩图像等多种任务。图图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。像梯度计算的是图像变化的速度,一般情况下,图像的梯度计算是图像的边缘信息。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。

Sobel算子

Sobel算子是一种边缘检测算子,用于检测图像中的边缘。它是基于图像中的灰度变化来实现边缘检测的。具体来说,Sobel算子应用一个小型卷积核(3x3或5x5),通过计算图像的水平和垂直方向的灰度变化来确定边缘的强度和方向。Sobel算子对噪声比较敏感,但它能够有效地检测出水平和垂直方向的边缘。
image = cv2.Sobel(src, ddepth, dx, dy, ksize)
参数:
src: 输入原图像
ddepth: 图像的深度
常用ddepth参数选择CV_32F,但是在运算过程中会产生负数,为了保证负数也能参与运算,后面利convertScaleAbs绝对值进行转换
dx 和 dy:分别表示沿 x 和 y 方向上的导数阶数。为了计算梯度幅度,通常 dx 和 dy 分别设置为 1 和 0,或者 0 和 1,然后计算两个方向的梯度,最后通过组合这两个方向的梯度来得到最终的梯度幅度。
ksize:Sobel算子的大小,必须为1、3、5、7(常用3*3)

如果想要得到两个方向的梯度变化的组合图,应分别进行x和y方向上的梯度运算,然后使用组合函数进行组合,这是因为直接进行image = cv.Sobel(image, cv.CV_32F, 1, 1)的效果并没有分别进行x和y方向上的梯度运算二者融合的好。这里所涉及的融合函数为addWeighted()
image = addWeighted(src1, alpha, src2, beta, gamma)
参数:
src1, src2:需要融合相加的两副大小和通道数相等的图像
alpha:src1 融合的权重
beta:src2 融合的权重
gamma:gamma 修正系数,不需要修正设置为 0,具体请参考《图像处理 gamma 修正(伽马 γ 校正)的原理和实现算法》

Scharr算子

Scharr算子是Sobel算子的改进版,它也是一种边缘检测算子,但相对于Sobel算子来说,Scharr算子对于边缘的检测更加准确。Scharr算子使用了一个较大的卷积核(通常是3x3),并且在计算垂直和水平方向的灰度变化时使用了更精确的权重值。由于这些改进,Scharr算子能够在边缘检测中产生更细致的结果,而且对噪声也有一定的抵抗能力。
image = addWeighted(src1, alpha, src2, beta, gamma)
参数:
src1, src2:需要融合相加的两副大小和通道数相等的图像
alpha:src1 融合的权重
beta:src2 融合的权重
gamma:gamma 修正系数,不需要修正设置为 0,具体请参考《图像处理 gamma 修正(伽马 γ 校正)的原理和实现算法》

Laplacian算子

Laplacian算子是一种二阶微分算子,用于检测图像中的边缘和纹理。它通过计算图像中像素点的二阶导数来确定边缘的位置和强度。Laplacian算子可以使用不同的卷积核来计算边缘,常见的有3x3和5x5的卷积核。Laplacian算子对噪声比较敏感,但它能够检测出纹理和边缘的高频细节信息。在边缘检测中,Laplacian算子通常与高斯滤波器一起使用,以减少噪声的干扰。
image = cv2.Scharr(src, ddepth, dx, dy)
参数:
src: 输入的原图像
ddepth: 图像的深度
dx 和 dy 分别表示水平和竖直方向的梯度

图像梯度变换的代码实现以及效果图

import cv2                       #导入OpenCV模块    
import matplotlib.pyplot as plt # 导入matplotlib库    image = cv2.imread("./img/bird.jpg") # 导入图片   image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # opencv是BGR格式的需要转成RGB在matplotlib上进行演示  
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # opencv是BGR格式的需要转成RGB在matplotlib上进行演示  
grad_x = cv2.Sobel(image, cv2.CV_32F, 1, 0)  # sobel对x方向求一阶导数  
grad_y = cv2.Sobel(image, cv2.CV_32F, 0, 1)  # sobel对y方向求一阶导数  
grad_xy = cv2.Sobel(image, cv2.CV_32F, 1, 1)  # sobel同时对x和y方向求一阶导数  gradx = cv2.convertScaleAbs(grad_x) # 利用convertScaleAbs绝对值进行转换  因为cv2.CV_32F会出现负数  
grady = cv2.convertScaleAbs(grad_y)  
gradxy = cv2.addWeighted(gradx, 0.5, grady, 0.5, 0) # 将sobel对x方向求一阶导数和sobel对y方向求一阶导数进行融合  titles = ["original", "gray", "gradient_x", "gradient_y", "gradientxy", "gradientaddxy"]  
images = [image_rgb, gray, gradx, grady, grad_xy, gradxy]  for i in range(6):  plt.subplot(2, 3, i + 1), plt.imshow(images[i], "gray")  plt.title(titles[i])  
plt.show()  

在这里插入图片描述

import cv2                       #导入OpenCV模块    
import matplotlib.pyplot as plt # 导入matplotlib库    image = cv2.imread("./img/bird.jpg") # 导入图片   grad_x = cv2.Scharr(image, cv2.CV_32F, 1, 0)  # Scharr对x方向求一阶导数  
grad_y = cv2.Scharr(image, cv2.CV_32F, 0, 1)  # Scharr对y方向求一阶导数  gradx = cv2.convertScaleAbs(grad_x) # 利用convertScaleAbs绝对值进行转换  因为cv2.CV_32F会出现负数  
grady = cv2.convertScaleAbs(grad_y)  
gradxy = cv2.addWeighted(gradx, 0.5, grady, 0.5, 0) # 将Scharr对x方向求一阶导数和Scharr对y方向求一阶导数处理的图像按照各自0.5的占比进行融合   titles = ["original", "gradient_x", "gradient_y", "gradientaddxy"]  
images = [image, gradx, grady, gradxy]  for i in range(4):  plt.subplot(2, 2, i + 1), plt.imshow(images[i], "gray")  plt.title(titles[i])  
plt.show() 

在这里插入图片描述

import cv2                       #导入OpenCV模块    
import numpy as np  image = cv2.imread("./img/bird.jpg") # 导入图片   la_image = cv2.Laplacian(image, cv2.CV_32F) # 拉普拉斯操作  
lpls_image = cv2.convertScaleAbs(la_image) # 转绝对值处理 cv2.CV_32F会产生负数  res = np.hstack((image, lpls_image))  cv2.imshow("res", res)  
cv2.waitKey(0)  
cv2.destroyAllWindows() 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是进程?

目录 进程 进程的特征, 概念 我们下面先简单介绍一下什么是进程 接下来看看一个程序的运行过程 进程的组成 进程的状态和转换 进程的状态 进程状态的转换 ​编辑 进程的组织方式 进程控制 如何实现进程控制 为什么进程控制的过程需要一气呵成? 进程控制的实现…

前端初学java

目录 java术语 JDK Javac Java Jdb Jhat JVM JRE JAR JDK下载 运行java文件 字面量 隐式转换 强制转换 注意 运算符 &&、||、&、| Switch 程序入口 String[] args 数组 静态初始化 动态初始化 变量初始化 Java内存 方法 重载 Final 包 …

智警杯数据库学习(1)

CentOS中安装MySQL数据库 检测系统是否自带安装 MySQL 首先检查是否自带mysql rpm -qa | grep mysql 如果有删除 rpm -e mysq 未安装,开始安装 进入software目录,解压安装包mysql5.7.25 cd /root/software tar -xvf mysql-5.7.25-1.el7.x86_64.rp…

【决战欧洲杯巅峰】欧洲杯含金量比世界杯高吗?有走地数据分析软件吗?

关于欧洲杯和世界杯的含金量对比,这是一个相当主观的问题,因为两者的价值和重要性很大程度上取决于个人的喜好和观点。但我可以从一些关键方面来为你提供比较的视角。 首先,从参赛队伍和竞技水平来看,世界杯无疑是全球范围内最具…

[渗透测试学习] SolarLab-HackTheBox

SolarLab-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.16扫描结果如下 PORT STATE SERVICE VERSION 80/tcp open http nginx 1.24.0 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows n…

JAVA:Stream流式编程,解放你的生产力

一、函数式编程 函数式编程(Functional Programming,简称 FP)是一种编程范式,它强调将计算视为数学函数的评估,避免改变状态以及可变数据。与过程式编程和面向对象编程不同,函数式编程强调函数的纯洁性&…

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构(Client-Server Architecture)是一种分布式计算模型,其中客户端和服务器之间通过网络进行通信。在这种架构中,客户端负责向服务器发送请求,并接收服务器返回的响应。服务器则负责处理客户端的…

浅谈RC4

一、什么叫RC4?优点和缺点 RC4是对称密码(加密解密使用同一个密钥)算法中的流密码(一个字节一个字节的进行加密)加密算法。 优点:简单、灵活、作用范围广,速度快 缺点:安全性能较差&…

网络图用什么软件绘制

1.亿图图示 2.Microsoft Visio2019 3.CAD看图 4.Draw.io 5.processOn 引用 [1]网络绘图软件 [2]https://zhuanlan.zhihu.com/p/663733462

torchvision笔记 torchvision.ops.sigmoid_focal_loss

理论部分:机器学习笔记:focal loss-CSDN博客 torchvision.ops.sigmoid_focal_loss(inputs: Tensor, targets: Tensor, alpha: float 0.25, gamma: float 2, reduction: str none) inputs每个样本的预测值targets 与 inputs 形状相同的浮点张量 存…

Pytorch编写Transformer

本文参考自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 在学习了图解Transformer以后,需要用Pytorch编写Transformer,下面是写代码的过程中的总结,结构根据图解Transformer进行说明。 import numpy as …

前字节员工自爆:我原腾讯一哥们,跳槽去小公司做小领导,就签了竞业,又从小公司离职去了对手公司,结果被发现了,小公司要他赔80万

“世界那么大,我想去看看”,这句曾经火遍网络的辞职宣言,说出了多少职场人心中的渴望。然而,当我们真的迈出跳槽那一步时,才发现,现实远比想象中残酷得多。 最近,一起前字节跳动员工爆料的事件…

年终奖发放没几天,提离职领导指责我不厚道,我该怎么办?

“年终奖都发了,你还跳槽?太不厚道了吧!” “拿完年终奖就走人,这不是典型的‘骑驴找马’吗?” 每到岁末年初,关于“拿到年终奖后是否应该立即辞职”的话题总会引发热议。支持者认为,这是个人…

如何验证Rust中的字符串变量在超出作用域时自动释放内存?

讲动人的故事,写懂人的代码 在公司内部的Rust培训课上,讲师贾克强比较了 Rust、Java 和 C++ 三种编程语言在变量越过作用域时自动释放堆内存的不同特性。 Rust 通过所有权系统和借用检查,实现了内存安全和自动管理,从而避免了大部分内存泄漏。Rust 自动管理标准库中数据类…

【python实战】-- 计算所有csv文件指定数据并保存到新文件更新1

系列文章目录 文章目录 系列文章目录前言一、需求二、使用步骤1.源码 总结 前言 一、需求 判断所有指定文件是否重复,是否存在数据造假; 所有指定excel文件指定列求和,求最大值,保存到新excel 二、使用步骤 1.源码 代码如下&…

PID控制算法学习笔记分享

目录 一、参数设定 二、PID计算公式 三、位置式PID代码实现 四、增量式PID代码实现 五、两种控制算法的优缺点 六、PID算法的改进 一、参数设定 比例系数(kp):P项的作用是根据当前误差的大小来产生一个控制量。它直接与误差成正比&#…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字,作为一种高度抽象化的符号系统,承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字,科学家们不断探索各种方法,以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

大模型 Scaling Law 的本质是工业化思维,Token 工厂,Token 生意

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 1. Scaling Law 的本质是工业化思维 我认为很多人对 Scaling Law 的理解还不够深入,他们仍然只是简单地认为:效果与参数规模成等比增长,目前的瓶颈应该是数据问题。…

军事人工智能的3个流派

在军事领域应用人工智能的态度大致分为三类:激进者、否认者、实用主义者。激进者认为,人工智能将彻底改变战争,改变战争的进行方式,有时甚至改变战争的性质及战争发生的原因。实用主义者认为,人工智能将越来越多地进入…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码!启动! [LitCTF 2023]Flag点击就送! 相关知识点 1.intval 绕过 绕过的方式: 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息,所以想到使用dis…