【计算机视觉(11)】

news2024/11/17 7:40:42

基于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.coloradmin.cn/o/1839262.html

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

相关文章

帝国CMS二次开发H5手游如何让同一个url 不同的模板

帝国CMS在二次开发《72游戏网》的时候,H5手游如何让同一个url 不同的模板 比如:www.72yy.com/you/11935.html 是H5游戏宣传页 由于很多H5游戏和网页游戏都是需要使用iframe来嵌套使用的 利于自己网站SEO收录优化 那么就再复制一套程序 用二级目录或者二…

vue3 页面左右滑动钩子封装

// useSwiper.js文件 import { ref, onMounted, onUnmounted } from "vue"; export function useSwiper({tabList, //tab数据curTabId,// 当前tab idcurTabIndex,// 当前tab 索引tabChange,// tab改变事件animation,// 动画animationData,// 动画 }) {let minOffset …

具备人工智能标记的书签应用Hoarder

什么是 Hoarder ? Hoarder 是一款可自托管的书签应用程序(链接、笔记和图像),具有基于人工智能的自动标记和全文搜索功能。适合数据囤积者使用。 软件特点: 🔗 为链接添加书签、做简单的笔记并存储图像。⬇…

Redis学习|Redis 是什么、Redis 能干嘛、Window安装Redis、Linux下安装Redis、Redis测试性能

Redis 是什么? Redis(Remote Dictionary Server),即远程字典服务! 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API. redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记…

DLP数据防泄密系统有什么功能?四款特别好用的DLP仿泄密系统

DLP(Data Loss Prevention,数据丢失防护)系统是一类专门用于保护组织内部数据不被非法访问、泄露或误用的安全解决方案。 这类系统通常具备以下关键功能: 1.数据识别与分类:自动发现并分类存储在网络、终端和云环境中…

vue3-openlayers 点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式

本篇介绍一下使用vue3-openlayers点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式 1 需求 加载天地图,polygon传递自定义属性标悬浮在polygon上,根据自定义属性,动态修改鼠标…

【Unity】Animator动画倒播,与StartRecording动画录制

一、Animator动画倒播 正常我们修改速度,只需要修改Animator.speed即可,但如果设置为负值,Animator系统会自动将其改为0值。 1.创建动画速度参数 (1)设置动画 我们需要创建表示速度的动画参数Speed,将其付给需要倒播的动画片段…

现货白银买卖分析:如何对买卖时机进行分析

现货白银交易是一种保证金交易品种,而且白银日常的市场波动比较大,所以笔者建议投资者在入场之前要对现货白银买卖进行分析,那具体怎么分析呢?实际上就是对买卖的机会进行分析,下面我们就来介绍具体的分析方法。 看K线…

leetcode:2848. 与车相交的点(python3解法)

难度:简单 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。 返回数轴上被车 任意部分 覆盖的整数点的…

移植案例与原理 - HDF驱动框架-OSAL

为了提升驱动代码在不同内核子系统间的可复用能力,OpenHarmony HDF(Hardware Driver Foundation)驱动框架提供了OSAL(Operating System Abstraction Layer)操作系统抽象层接口。OSAL为驱动程序提供了任务、定时器、互斥锁、信号量等基础库相关…

MFC扩展库BCGControlBar Pro v35.0

LINK : fatal error LNK1104: 无法打开文件“BCGCBPRO2800U140.lib” BCGControlBar v25.0版本 环境VS2015,在运行程序时出现提示错误 :LINK : fatal error LNK1104: 无法打开文件“BCGCBPRO2800U140.lib” 1、需要编译一下BGCControlBar,在…

全国第四轮软件工程学科评估结果

#计算机专业好吗##高考填志愿选择专业##计算机专业还能不能报# 又到了让各位家长头疼的高考填志愿时刻。 前几天的头条,张雪峰直播卖卡3小时入账2亿,为了孩子的前途,家长们确实是不惜重金。 作为毕业如今18个年头一直从事软件领域的老码农&am…

生鲜大单品营销的七项核心工作

生鲜大单品,是指通过选品、采购、营销、门店售卖等环节,达到高销量的单一产品或产品组合。从数据层面上来看,生鲜大单品是指能在该品类中创造20%到50%价值的商品,也就是常说的TOP商品。 做好生鲜大单品,我们需要做到以…

ArcGIS常用操作技巧,快快学起来

ArcGIS 常用操作技巧 快快学起来~ 一、影像格式的转换 例如把jpg格式转换为tiff格式,可以在arctoolbox中的转换工具-->到光栅-->光栅到其他多种格式 (conversiontools-->to Raster-->Raster to Other Format multiple)。 二、矢量化设置捕捉功能 在…

最新版首发 | 手把手教你安装 Vivado2024.1(附安装包)

Q:Vivado出2024版了!不知迪普微有没有对应的安装包呢? A:有的!回复“Vivado2024.1”即可获得相应安装包哦~ Q:好哒~但是我不会安装,可否安排一期安装教程? A:立马安排&…

Nginx之文件下载服务器

1.概述 在对外分享文件时,利用Nginx搭建一个简单的下 载文件管理服务器,文件分享就会变得非常方便。利 用Nginx的诸多内置指令可实现自动生成下载文件列表 页、限制下载带宽等功能。配置样例如下: server {listen 8080;server_name localhos…

微型导轨的摩擦系数分析!

微型导轨的摩擦力主要包括滑动摩擦力和滚动摩擦力,摩擦系数是一个关键参数,它决定了滑块在导轨上运动时所受到的摩擦力大小,摩擦系数越低,系统的运动效率和精度就越高,而微型导轨的摩擦系数是受多个因素影响的。 微型导…

空间复杂度的相关概念

1. 空间复杂度 空间复杂度(space complexity)用于衡量算法占用内存空间随着数据量变大时的增长趋势。 统计哪些空间: ● 暂存数据:用于保存算法运行过程中的各种常量、变量、对象等。 ● 栈帧空间:用于保存调用函数…

python学习笔记-08

面向对象基础(OOP)-上 1. 面向对象概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象(object oriented programming):将数据与函数绑定到一起…

数据结构---二叉树的性质总结

第i层上的节点数 证明: 二叉树的最大节点数 证明: 第一层对应2^0个节点, 累加得到 这是一个等比数列 求和公式: 那么这里的n指的是一共有多少个相加 根据从b到a一共有b-a1个可推出 有(k-1)-01个相加 那么结果为: 叶节点与度为2的节点关系 证明: 假设二叉树的总节点数为 NNN…