【计算机视觉(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…

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

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

浅谈RC4

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

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 自动管理标准库中数据类…

PID控制算法学习笔记分享

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

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

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

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

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

Spring MVC学习记录(基础)

目录 1.SpringMVC概述1.1 MVC介绍1.2 Spring MVC介绍1.3 Spring MVC 的核心组件1.4 SpringMVC 工作原理 2.Spring MVC入门2.1 入门案例2.2 总结 3.RequestMapping注解4.controller方法返回值4.1 返回ModelAndView4.2 返回字符串4.2.1 逻辑视图名4.2.2 Redirect重定向4.2.3 forw…

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策,自2024年6月10日起,允许买家在商品仍在运输途中申请退货与退款,此即“在途退货/退款”功能,主要的目的是为了提升买家的购物体验,增强市场竞争力。 图源:Shopee菲律…

一年前 LLM AGI 碎片化思考与回顾系列⑤ · 探索SystemⅡ复杂推理的未知之境

阅读提示: 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成,在内容上,与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想,探寻世界模型…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时,前期已经在Controller类加上CrossOrigin(origins "*"),发送get和post请求都没问题,但遇到delete请求时,又报出跨域问题 一.前端添加proxy代理服务器(未能解决) 在vue.config.js中使…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果,然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误,本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下: import datasets import nu…

Linux screen命令使用

文章目录 1. 前言2. screen是什么?3. screen使用场景描述3. screen常用命令4. 小结5. 参考 1. 前言 实际开发中用到的云服务器,如果项目使用的是python,需要利用项目运行一些时间较长的项目程序脚本的话,由于我们通过ssh连接远端服务器&…