首页 > 其他分享 >Sobel算子详解及例程

Sobel算子详解及例程

时间:2023-10-22 11:01:04浏览次数:31  
标签:Sobel 边缘 例程 梯度 cv2 gradient 算子


Sobel算子是一种经典的边缘检测算子,被广泛应用于图像处理领域。它基于图像亮度的变化率来检测边缘的位置,主要通过计算图像中像素点的梯度来实现。

Sobel算子分为水平和垂直两个方向的算子,记作Gx和Gy。它们分别对图像进行水平和垂直方向的卷积运算,得到对应方向上的梯度值。

具体而言,Sobel算子使用一个3x3的卷积核对图像进行卷积操作,如下所示:

Gx = | -1 0 1 | | -2 0 2 | | -1 0 1 |

Gy = | -1 -2 -1 | | 0 0 0 | | 1 2 1 |

卷积操作后,可以通过以下公式计算图像的梯度幅值和方向:

梯度幅值 G = sqrt(Gx^2 + Gy^2)

梯度方向 θ = arctan(Gy / Gx)

其中,G表示梯度幅值,θ表示梯度方向。

Sobel算子的工作原理是,当图像中存在边缘时,像素点的亮度会发生明显的变化,从而导致梯度值较大。在边缘的两侧,梯度方向会垂直于边缘线,可以通过梯度的方向来判断边缘的方向。

Sobel算子具有以下特点:

  1. 简单且易于实现。
  2. 对噪声具有一定的平滑效果,能够抑制细小的波动。
  3. 在边缘检测中不仅考虑了水平方向的边缘,还考虑了垂直方向的边缘,提供了更全面的信息。

在实际应用中,常将水平和垂直方向上的梯度幅值进行组合,得到综合的边缘强度。这可以通过计算梯度幅值的平方根来实现,即 G = sqrt(Gx^2 + Gy^2)。

总结起来,Sobel算子是一种用于图像边缘检测的经典算子,通过计算图像的梯度来寻找边缘的位置。它简单而有效,是许多图像处理任务的基础。

以下是一个简单的Python例程,演示了如何使用Sobel算子进行边缘检测:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('input.jpg', 0)  # 以灰度模式读取图像

# 对图像进行Sobel边缘检测
gradient_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)

# 计算梯度幅值和方向
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
gradient_direction = np.arctan2(gradient_y, gradient_x)

# 将梯度幅值和方向转换为0-255之间的整数
gradient_magnitude = cv2.normalize(gradient_magnitude, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
gradient_direction = cv2.normalize(gradient_direction, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

# 显示结果
cv2.imshow('Sobel Magnitude', gradient_magnitude)
cv2.imshow('Sobel Direction', gradient_direction)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例程中,首先使用OpenCV的cv2.imread函数读取输入图像,并以灰度模式读取。然后,通过cv2.Sobel函数分别对图像在水平和垂直方向进行卷积操作,得到梯度值。接下来,使用NumPy库计算梯度幅值和方向,并将其归一化到0-255的范围。最后,使用cv2.imshow函数显示边缘检测结果。

希望这个例程能够帮助你理解和运用Sobel算子进行边缘检测。


标签:Sobel,边缘,例程,梯度,cv2,gradient,算子
From: https://blog.51cto.com/u_15903730/7974755

相关文章

  • 2023年CANN训练营第二季——叭一叭几款AscendC算子支持芯片的运算单元以及AscendC提供
    前言:    我们知道昇腾AI芯片,有1个或多个AiCore,AiCore上有Cube和Vector运算单元提供给算子进行运算,有的AiCore是Cube和Vector一体的,有的Cube和Vector是分开,各自独立的。我们还记得例程中的例子一般都指定核心数BLOCK_DIM=8,这又是为什么,有啥道理呢?本文就来叭一叭,昇腾芯片的运......
  • 4、网络的算子(P17、P18、P19、P20、P21)
    1、卷积 2、池化 池化是缩小高、长方向上的空间的运算。比如,如图所示,进行将2×2的区域集约成1个元素的处理,缩小空间大小。最大池化除了Max池化之外,还有Average池化等。相对于Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值。 ......
  • pyspark 常用action 算子
    frompysparkimportSparkConf,SparkContextconf=SparkConf().setAppName("test_SamShare").setMaster("local[4]")sc=SparkContext(conf=conf)#1.collect指的是把数据汇集到driver端,便于后续操作rdd=sc.parallelize(range(0,5))rdd_collect=rdd.......
  • pyspark 常用Transform算子
    frompysparkimportSparkConf,SparkContextconf=SparkConf().setAppName("test_SamShare").setMaster("local[4]")sc=SparkContext(conf=conf)#1.map对每一个元素进行一个映射rdd=sc.parallelize(range(1,11),4)rdd_map=rdd.map(lambdax:x*2......
  • 转载WIFI小车APP远程控制,无线智能小车之ESP8266例程
    WIFI小车APP远程控制,无线智能小车之ESP8266例程  第一、原理讲解原理简述:利用发布订阅模式,即:利用ESP8266订阅了一个主题,再利用appinventor编写的app往这个主题发布消息,由于ESP8266订阅了这个消息,所以就可以收到app发布得消息,从而执行相应得动作,比如前进\后退\左转\右......
  • 下载的PC游戏启动后报错:无法加载 DLL“steam_api64”: 动态链接库(DLL)初始化例程失败
    无法加载DLL“steam_api64”:动态链接库(DLL)初始化例程失败。(异常来自HRESU解决方式:将文件夹拷贝到Steam-->steamapps文件夹下面还好是忍者神龟抛了个异常,才找到了问题所在,论抛异常的重要性!!!忍者神龟如龙......
  • BLE_HID例程增加报表描述符使用
    我们一般hid类设备都是键鼠设备居多,在此还是以CH582的Hid_keyboard程序为例,修改其中的hidkeyboardservice.c文件,增加了:16bit全键盘、多媒体键(如音量+,音量-,静音等)、系统控制键(电脑休眠、电脑关机),由于蓝牙在部分电脑中休眠期间蓝牙驱动是关闭的,因此无法通过蓝牙唤醒电脑,鼠标数......
  • 手敲,Ascend算子开发入门笔记分享
    本文分享自华为云社区《Ascend算子开发入门笔记》,作者:JeffDing。基础概念什么是AscendCAscendC是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者......
  • DMA是什么?结构和例程详解?
    DMA(DirectMemoryAccess)是一种技术,它的主要功能是允许数据直接在内存和外部设备之间传输,而不需要通过CPU或其它芯片外设的干预。这使得CPU可以继续处理其它任务,而不需要等待数据传输完成。DMA控制器通常由硬件实现,它包括多个通道,每个通道都可以被配置为从不同的源地址传输到不同的......
  • Lempel-Ziv (LZ) 算法及例程
    Lempel-Ziv(LZ)算法是一系列无损数据压缩算法,包括LZ77、LZ78和LZW等。这些算法通过利用字典来存储已经遇到的字符串,并用相应的索引来代替重复出现的字符串,从而实现压缩效果。下面是一个简单的例程,展示了如何使用LZ77算法来压缩和解压缩文本数据。压缩过程:初始化一个空的字典和输......