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

news2024/10/19 22:15:15

文章目录

    • 一、认识什么是图像梯度和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算子是搭配其他工具一块使用的。

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

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

相关文章

CUDA error: out of memory问题

加载模型时,模型也不大,GPU内存也完全够,但就是出现这个CUDA内存溢出问题。 究其原因,在于model.load_state_dict(torch.load(‘pretrain-model.pth’, map_locationdevice))这个代码省略了map_locationdevice 通过torch.load加载…

YOLOv11来了 | 自定义目标检测

概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布:https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本,结合了尖端的准确性、速度和效率,用于目标检测、分割、分类、定向边界框和…

问题清除指南|alimama-creative/FLUX-Controlnet-Inpainting 运行注意事项

前言:近日验证想法需要用到inpainting技术,选择了https://github.com/alimama-creative/FLUX-Controlnet-Inpainting进行测试,在实现过程中遇到几个小问题,在此分享一下解决经验。 1. 下载预训练模型到本地 由于在huggingface官网…

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写,挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…

WordPress监控用户行为回放插件

在数字营销的世界里,了解用户行为是提升用户体验和转化率的关键。nicen-replay 插件,它能够让您轻松回放用户在网站上的每一步操作,从点击到滚动,再到表单填写,每一个细节都清晰可见 nicen-replay,是一款可…

C#从零开始学习(类型和引用)(4)

类型 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 整型 byte: 0~255sbyte: -128~127short: -32768~32767int: -2147483648~2147483647long: -9223372036854775808~9223372036854775807 以u开头的无符号整数 ushort,uint,ulong 浮点 float: (6~9…

RHCE【远程连接服务器】

目录 一、远程连接服务器简介 二、加密技术简介 SSH工作过程: (1)版本协商阶段 (2)密钥和算法协商阶段 (3)认证阶段 (4)会话请求阶段 (5&#xff0…

KUKA外部自动配置(上)

通过外部PLC对机器人自动运行进程进行控制,其控制原理是:外部PLC通过外部自动运行接口向机器人控制系统发出机器人进程的相关信号(如:运行许可、故障确认、程序启动等),机器人控制系统向外部PLC系统发送有关…

STM32 I2C通信协议详解

文章目录 STM32 I2C通信协议详解一、I2C协议概述二、物理层特性总线结构:引脚定义:电平特性:地址机制: 三、协议层机制起始信号:停止信号:数据有效性:应答信号(ACK)&…

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 电脑系统:Windows11 显卡型号:NVIDIA Quadro P620 语言环境:python 3.9.7 编译器&#x…

【Python】selenium遇到“InvalidArgumentException”的解决方法

在使用try……except 的时候捕获到这个错误: InvalidArgumentException: invalid argument (Session info: chrome112.0.5614.0) 这个错误代表的是,当传入的参数不符合期望时,就会抛出这个异常: InvalidArgumentException: invali…

常见TCP/IP协议基础——计算机网络

目录 前言常见协议基础常见协议-基于TCP的应用层协议常见协议-基于UDP的应用层协议常见协议-网络层协议习题自测1.邮件发送协议2.接收邮件协议端口3.建立连接4.层次对应关系5.FTP服务器端口 前言 本笔记为备考软件设计师时的重点知识点笔记,关于常见TCP/IP协议基础…

Java【多线程】wait和notify

目录 wait / notify 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. wait / notify 等待/通知 协调线程之间的执行逻辑的顺序的 可以让后执行的逻辑等待先执行的逻辑 虽然无法直接…

缓存框架JetCache源码解析-缓存定时刷新

作为一个缓存框架,JetCache支持多级缓存,也就是本地缓存和远程缓存,但是不管是使用着两者中的哪一个或者两者都进行使用,缓存的实时性一直都是我们需要考虑的问题,通常我们为了尽可能地保证缓存的实时性,都…

word取消自动单词首字母大写

情况说明:在word输入单词后首字母会自动变成大写 (1)点击菜单栏文件 (2)点击“更多”——>“选项” (3)点击“校对”——>“自动更正选项” (4)取消“句首字母大写…

WPF样式详解:行内样式、模板样式和页面样式的全方位分析

Windows Presentation Foundation (WPF) 是微软推出的一种用于构建桌面应用程序的UI框架。WPF 提供了强大的样式和模板机制,允许开发人员以声明的方式定义和复用UI元素的视觉外观。本文将深入探讨WPF的行内样式、模板样式和页面样式,帮助您在实际开发中更…

大数据linux操作系统

第一关:Linux的初体验 答案: cd / ls -a / (里面有空格要注意) 第二关:Linux的常用命令 答案: touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关:Linux查询命令帮助语句…

我在自动化测试方面犯过的3个大错误

每个人都会犯错误,但不管错误看起来有多糟糕,你都可以恢复过来,更重要的是,从错误中学习。 在软件开发过程的任何领域,从编码到测试,我们都会时不时地犯一些错误。通常,这些错误都很小&#xf…

Linux kernel 堆溢出利用方法

前言 本文还是用一道例题来讲解几种内核堆利用方法,内核堆利用手段比较多,可能会分三期左右写。进行内核堆利用前,可以先了解一下内核堆的基本概念,当然更好去找一些详细的内核堆的基础知识。 概述 Linux kernel 将内存分为 页…

Leetcode 字符串解码

该代码的算法思想可以分为以下几个步骤: 1. 使用栈来处理嵌套结构: 我们需要处理像 k[encoded_string] 这种格式,其中的 encoded_string 可能是嵌套的,即像 3[a2[c]] 这样的输入。因此,我们可以借助 栈(S…