图像梯度-Sobel算子、scharrx算子和lapkacian算子

文章目录

    • 一、认识什么是图像梯度和Sobel算子
    • 二、Sobel算子的具体使用
    • 三、scharrx算子与lapkacian(拉普拉斯)算子

一、认识什么是图像梯度和Sobel算子

图像的梯度是指图像亮度变化的空间导数,它描述了图像在不同方向上的强度变化。在图像处理和计算机视觉中,梯度通常用来检测边缘,因为边缘往往是亮度变化最显著的地方。图像梯度可以用多种方式来计算,常见的方法包括:一阶导数(Sobel算子)、二阶导数(Laplacian算子)、Prewitt算子、Canny算子。

Sobel算子是一种在图像处理和计算机视觉领域广泛使用的边缘检测算子。Sobel算子使用两个3x3的核(kernel)来分别计算图像在水平和垂直方向上的梯度。这两个核通常被称为Sobel核。水平方向(Gx)的Sobel核与垂直方向(Gy)的Sobel核的具体如下:

在这里插入图片描述

dst = cv2.Sobel(src, ddepth, dx, dy, ksize) 是 OpenCV 库中用于计算图像的 Sobel 导数的函数。这个函数实现了 Sobel 算子,用于边缘检测。其中:
src:输入图像,可以是灰度图像或彩色图像。
ddepth:输出图像的深度。通常使用 cv2.CV_64F 表示64位浮点数,这可以避免计算过程中的溢出。
dx:指定求导的阶数,用于x方向。如果为1,则计算一阶导数;如果为2,则计算二阶导数。
dy:指定求导的阶数,用于y方向。如果为1,则计算一阶导数;如果为2,则计算二阶导数。
ksize:Sobel 核的大小。默认值为3,但也可以使用5或7。

二、Sobel算子的具体使用

  • x轴方向

在水平方向上,Sobel算子一般都是右边减去左边得到梯度值,并且如果求得的梯度值是负数的话,会进行截取为0的操作,也可以通过绝对值来进行修正参数。
拿下面这个圆来做例子,计算边缘的梯度(就例如红点位置的梯度):
在这里插入图片描述

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")

# 定义一个函数cv_show,用于显示图像
def cv_show(name, img):
    # 使用cv2.imshow()函数显示图像,名称为name
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.Sobel()函数计算图像的Sobel算子
# cv2.CV_64F指定输出图像的深度为64位浮点数
# 第三个参数1表示对x方向求导,第四个参数0表示对y方向不求导
# ksize=3指定Sobel算子的大小为3x3
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)

# 调用cv_show函数显示Sobel算子处理后的图像
cv_show("sobelx", sobelx)

运行结果:
在这里插入图片描述
可以看到上面只是显示了半圆的值。这是因为右减去左的原因,当白减去黑为正数,所以显示出了边界值。当右边是黑,左边是白的时候,右减去左的结果为负数,截取为0,所以显示黑色。(具体参考下图)

在这里插入图片描述

通过sobelx = cv2.convertScaleAbs(sobelx)可计算绝对值。cv2.convertScaleAbs:这个函数用于将输入数组的元素类型转换为 8 位无符号整数(uint8)。它首先将输入数组的每个元素乘以一个比例因子(默认为 1),然后加上一个偏移量(默认为 0)。最后,它计算结果的绝对值,并将其转换为 8 位无符号整数。

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show("sobelx", sobelx)

运行结果:
在这里插入图片描述

  • y轴方向
    在竖直方向上,是用下面减去上面来得到所求值。
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show("sobely", sobely)

运行结果:
在这里插入图片描述

通常突出图片的边缘检测,一般使用分别计算x和y的sobel算子,再通过sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) cv2.addWeighted 函数将两个图像 sobelx 和 sobely 按照指定的权重进行加权融合。

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv_show("sobelxy", sobelxy)

运行结果:
在这里插入图片描述
可以看到边边上缺失的地方有一条浅浅的线条连在一起。

一般不建议直接计算sobelxy = cv2.Sobel(img,cv2.CV_64F, 1, 1,ksize=3),这种方法确实可以得到图像的梯度信息,但在某些应用中,分别计算水平和垂直梯度然后再组合它们可能会更有利。例如分别计算梯度可以帮助你确定边缘的方向。这对于某些应用,如形状分析或纹理分类,可能是有用的。

直接计算:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

sobelxy = cv2.Sobel(img,cv2.CV_64F, 1, 1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show("sobelxy", sobelxy)

运行结果:
在这里插入图片描述

由上图和x,y分别计算再组合在一起的对比,也可以效果没有分开计算的好。

用下图的照片来更直观观察分开计算和合起来计算的区别:

在这里插入图片描述

合起来计算:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\5.jpg")

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

sobelxy = cv2.Sobel(img,cv2.CV_64F, 1, 1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show("sobelxy", sobelxy)

运行结果:

在这里插入图片描述

分别计算x,y方向的sobel算子再组合在一起:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\5.jpg")


def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv_show("sobelxy", sobelxy)

运行结果:

在这里插入图片描述

通过两种方法对比,明显分开计算x,y的边缘检测效果要更加的好!

三、scharrx算子与lapkacian(拉普拉斯)算子

scharrx算子

Scharr算子是一种用于边缘检测的图像处理算子,它是Sobel算子的改进版本。Scharr算子在计算图像梯度时,提供了更高的精度,尤其是在使用3x3的核时。这使得Scharr算子在检测图像边缘时更为敏感,能够捕捉到更细小的边缘特征。Scharr算子的卷积核与Sobel算子不同,它在平滑部分给予了中心元素更大的权重,相当于使用了标准差更小的高斯函数,从而使得算子更加敏感。

Scharr算子能更加细致地描绘出细节,能够注意到更多细节。

Scharr算子的卷积核如下:
在这里插入图片描述

lapkacian(拉普拉斯)算子

拉普拉斯算子(Laplacian),在图像处理中通常称为Laplacian算子,是一种用于边缘检测的二阶导数算子。它用于增强图像中的快速强度变化,这些变化通常对应于图像中的边缘。拉普拉斯算子可以用于检测图像中的边缘和纹理。

拉普拉斯算子对于一些噪音点会更加敏感,该算子显示的细节相对较少,但是拉普拉斯算子一般都是配合其他工具一块使用的。

在这里插入图片描述

通过以下照片来更直观观察三种算子之间的差距:

在这里插入图片描述

#不同算子的差异
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\5.jpg")

def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

scharrx = cv2.Scharr(img,cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img,cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx , 0.5,scharry,0.5,0)

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show("res", res)

运行结果:

在这里插入图片描述

其中第一幅是sobel算子,第二幅是scharrx算子,第三幅是lapkacian算子。

可以看到scharrx算子能够更加细腻的展示出照片的细节,是sobel算子的升级版。而lapkacian算子描绘的细节就更加的少,一般lapkacian算子是搭配其他工具一块使用的。

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

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

相关文章

Unity使用Git及GitHub进行项目管理

git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…

2025秋招八股文--网络原理篇

前言 1.本系列面试八股文的题目及答案均来自于网络平台的内容整理,对其进行了归类整理,在格式和内容上或许会存在一定错误,大家自行理解。内容涵盖部分若有侵权部分,请后台联系,及时删除。 2.本系列发布内容分为12篇…

《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优

1. 题记 有关Linux关键内核参数的调整,我前面的调优文章其实就有涉及到,只是比较零散,本篇集中深入介绍Linux常用关键内核参数及其调优,Linux调优80%以上都涉及到内核的这些参数的调整。 2. 文件系统相关参数 fs.file-max 参数…

VMware虚拟机的下载安装与使用

目录 一、下载VMware虚拟机 步骤1---找到需要的虚拟机下载位置 步骤2---找到下载的安装包安装程序 二、删除干净VMware虚拟机 步骤1--进去服务里面关闭虚拟机服务 步骤2---控制面板里面删除 步骤3---注册表删除HKEY_CURRENT_USER\Software\VMware, Inc. 步骤4---安装在…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全…

【C语言】文件操作(1)(文件打开关闭和顺序读写函数的万字笔记)

文章目录 一、什么是文件1.程序文件2.数据文件 二、数据文件1.文件名2.数据文件的分类文本文件二进制文件 三、文件的打开和关闭1.流和标准流流标准流 2.文件指针3.文件的打开和关闭文件的打开文件的关闭 四、文件的顺序读写1.fgetc函数2.fputc函数3.fgets函数4.fputs函数5.fsc…

AI开发-三方库-Hugging Face-Pipelines

1 需求 需求1:pipeline支持的任务类型 需求2:推理加速使用CPU还是GPU 需求3:基于pipeline的文本分类示例 需求4:pipeline实现原理 模型使用步骤(Raw text -》Input IDs -》Logits -》Predictions)&…

k8s 1.28.2 集群部署 harbor v2.11.1 接入 MinIO 对象存储

文章目录 [toc]提前准备什么是 HarborHarbor 架构描述Harbor 安装的先决条件硬件资源软件依赖端口依赖 Harbor 在 k8s 的高可用Harbor 部署Helm 编排YAML 编排创建 namespace导入镜像部署 Redis部署 PostgreSQL部署 Harbor core部署 Harbor trivy部署 Harbor jobservice部署 Ha…

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

VSCODE 导入cubeide工程

1.下载vscode及插件STM32 VS Code Ectersion 版本号1.0.0,之后这个有导入功能。 2.等待自动安装对应插件,提示缺少什么就补什么 3.在左侧出现stm32图标。点击Import a local project导入本地项目。 4.报错 [{"resource": "/f:V11/cmak…

前端html,css 样式巩固1

想做这样 一个效果 点击图片切换 当前的选中图片 我们使用 原生的js html 来开发这个 直接粘贴代码 相信大家 都能看懂的 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" …

抖音视频制作怎么暂停画面,抖音视频怎么让它有暂停的效果

千万别滥用视频特效&#xff0c;不然它能毁掉你的抖音作品。在创作过程中&#xff0c;应尽量使用类似暂停画面、隐形字幕这样的视觉特效&#xff0c;可以显著提高作品的视觉体验。增强视频表现力的同时&#xff0c;也不会让画面看起来过于夸张。有关抖音视频制作怎么暂停画面的…

Springboot 整合 Java DL4J 实现文物保护系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

2011年国赛高教杯数学建模A题城市表层土壤重金属污染分析解题全过程文档及程序

2011年国赛高教杯数学建模 A题 城市表层土壤重金属污染分析 随着城市经济的快速发展和城市人口的不断增加&#xff0c;人类活动对城市环境质量的影响日显突出。对城市土壤地质环境异常的查证&#xff0c;以及如何应用查证获得的海量数据资料开展城市环境质量评价&#xff0c;研…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…

【Pycharm默认解释器配置文件】怎样删除配置解释器的无效历史记录?

有时候我们希望删除无效的解释器路径&#xff0c;可以找到这个文件&#xff0c;进行删除修改。 C:\Users\你的用户名\AppData\Roaming\JetBrains\PyCharm2022.3\options\jdk.table.xml直接删除解释器名称对应的一整个<jdk version"2">节点即可&#xff01; …

2023年ICPC亚洲合肥赛区赛 C. Cyclic Substrings

题目 题解 #include<bits/stdc.h> using namespace std; // #define int long long #define ll long long const int maxn 6e6 5; const int mod 998244353; int fail[maxn];//fail[i]表示i结点代表的回文串的最大回文后缀的编号 int len[maxn]; //len[i]表示结点i代…

大模型涌现判定

什么是大模型&#xff1f; 大模型&#xff1a;是“规模足够大&#xff0c;训练足够充分&#xff0c;出现了涌现”的深度学习系统&#xff1b; 大模型技术的革命性&#xff1a;延申了人的器官的功能&#xff0c;带来了生产效率量级提升&#xff0c;展现了AGI的可行路径&#x…

UDP/TCP协议

网络层只负责将数据包送达至目标主机&#xff0c;并不负责将数据包上交给上层的哪一个应用程序&#xff0c;这是传输层需要干的事&#xff0c;传输层通过端口来区分不同的应用程序。传输层协议主要分为UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…