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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入二进制安全:全面解析Protobuf

前言 近两年,Protobuf结构体与Pwn结合的题目越来越多。 23年和24年Ciscn都出现了Protobuf题目,24年甚至还出现了2道。 与常规的Pwn题利用相比,只是多套了一层Protobuf的Unpack操作。 本文包含Protobuf环境安装、相关语法、编译运行以及pb…

【吊打面试官系列-Mysql面试题】Myql 中的事务回滚机制概述 ?

大家好,我是锋哥。今天分享关于 【Myql 中的事务回滚机制概述 ?】面试题,希望对大家有帮助; Myql 中的事务回滚机制概述 ? 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位…

keil MDK自动生成带版本bin文件

作为嵌入式单片机开发,在Keil MDK(Microcontroller Development Kit)中开发完编译完后,经常需要手动进行版本号添加用于发版,非常麻烦,如果是对外发行的话,更容易搞错,特此码哥提供一…

汉化版PSAI全面测评,探索国产AI绘画软件的创新力量

引言 随着AI技术的飞速发展,图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主,今天我们测评的是一款国产AI绘画软件——StartAI,一句话总结:它不仅在技术上毫不逊色于国际大牌,更在用户体验和本地化服务上做到…

自研一套带双向认证的Android通用网络库

当前,许多网络库基于Retrofit或OkHttp开发,但实际项目中常需要定制化,并且需要添加类似双向认证等安全功能。这意味着每个项目都可能需要二次开发。那么,有没有一种通用的封装方式,可以满足大多数项目需求?…

ABAP-03基础数据类型

基本数据类型 数据类型默认大小(byte)有效大小初始值说明示例C11-65535SPACE文本字符(串)‘Name’N11-65535‘00…0’数字文本‘0123’T66‘000000’时间(HHMMSS)‘123010’D88‘00000000’日期(yyyymmdd)‘20090901’I4-231~232…

win 打包java项目为exe一键部署,包括mysql和redis

需求:打包springboot项目在win系统下执行,并且要一键部署和开机启动 把所需的程序放在同一个文件夹 1.jdk文件夹:自己去下载,jdk8的话拿jre目录好了 2.mysql文件夹:是8.0.36版,270M精简版了 3.redis文件夹…

第58章SOCKET:TCP/IP网络基础

58.1 互联网 互联网会将不同的计算机网络连接起来并允许位于网络中的主机相互之间进行通信。互联网的目标是隐藏不同物理网络的细节以便向互联网中的所有主机呈现一个统一的网络架构,TCP/IP已经成了使用最为广泛的协议套件了, 术语Internet被用来指将全球…

智能语音新革命:有道与Azure的API服务对决

在当今技术飞速发展的时代,API(应用程序接口)已经成为连接不同软件和服务的桥梁。无论是开发移动应用、构建网页服务,还是实现物联网设备的互联互通,API都在其中扮演着不可或缺的角色。随着市场上各种API接口的涌现&am…

【Linux】—MySQL安装

文章目录 前言一、下载官方MySQL包二、下载完成后,通过xftp6上传到Linux服务器上三、解压MySQL安装包四、在安装目录下执行rpm安装,请按顺序依次执行。五、配置MySQL六、启动MySQL数据库七、退出,重新登录数据库 前言 本文主要介绍在Linux环境…

Linux系统编程——网络编程

目录 一、对于Socket、TCP/UDP、端口号的认知: 1.1 什么是Socket: 1.2 TCP/UDP对比: 1.3 端口号的作用: 二、字节序 2.1 字节序相关概念: 2.2 为什么会有字节序: 2.3 主机字节序转换成网络字节序函数…

Kantana和The Sandbox联手打造元宇宙娱乐的未来

The Sandbox 是一个开创性的元宇宙、游戏和创作平台,泰国领先的娱乐公司 Kantana 很高兴地宣布双方将建立合作关系,共同打造元宇宙娱乐的未来。 此次合作结合了 Kantana 引以为傲的故事讲述专长和The Sandbox 的用户生成内容 (UGC) 工具,创建…

若依框架自定义开发使用学习笔记(1)

因为我是跳着学的,原理那些都没咋看。 代码自动生成,依赖sql表 在ruoyi数据库中,创建你想要的表,这里我创建了个购物车表,由于空间有限,只能拍到这么多。 然后就可以在前端自动生成代码 点击导入按钮 …

家庭财务新助手,记录收支明细,一键导出表格,让您的家庭财务一目了然!

在繁忙的现代生活中,家庭财务管理常常成为一项令人头疼的任务。如何记录每一笔收支,如何清晰地掌握家庭财务状况,如何合理规划未来开支,这些都是我们需要面对的问题。然而,有了这款家庭财务助手——晨曦记账本&#xf…

入侵检测系统(IDS)

入侵检测 入侵检测(Intrusion Detection)是指发现或确定入侵行为存在或出现的动作,也就是发现、跟踪并记录计算机系统或计算机网络中的非授权行为,或发现并调查系统中可能为视图入侵或病毒感染所带来的异常活动。 入侵检测系统 …

【案例分析】一文讲清楚SaaS产品运营的六大杠杆是什么?具体怎么运用?

在SaaS(软件即服务)行业,如何快速获取用户并实现持续增长一直是企业关注的重点。近年来,分销裂变策略因其高效性和低成本特性,成为许多SaaS企业实现快速增长的秘诀。下面,我们将通过一个具体的案例来剖析成…

大语言模型的昨天、今天和明天

引言 近年来,人工智能(AI)技术突飞猛进,其中大语言模型(LLM)无疑是最引人瞩目的技术之一。从OpenAI的GPT系列到Meta的Llama模型,大语言模型的发展不仅改变了人们对AI的认知,也在各行…

智慧体育场馆:视频孪生引领体育场馆智能化

随着数字经济时代的发展,技术的迭代跃迁加速了体育场馆运营革新的步调,在技术赋能理念的驱动下,体育场馆逐步由复合化发展姿态,升级为物联感知式的智能场馆,并迈向了智慧体育场馆的发展之路。《“十四五”时期全民健身…

怎么移除pdf文件编辑限制,有哪些方法?

PDF是我们在学习或工作中常常应用到的一种文件格式,因为它的跨平台性和文档保真度而备受欢迎。但是,有时我们会遇到PDF编辑权限被限制了,那么pdf解除编辑限制可以用什么方法呢?别急,接下来,本文将深入探讨如…

头歌资源库(12)找第K小数

一、 问题描述 二、算法思想 可以使用快速排序算法来解决这个问题。 首先,选择一个基准元素,通常选择序列的第一个元素。 然后,将序列中小于等于基准元素的元素放在基准元素的左边,大于基准元素的元素放在基准元素的右边。 接着…