首页 > 其他分享 >OpenCV(cv::Sobel())

OpenCV(cv::Sobel())

时间:2024-09-19 16:39:16浏览次数:8  
标签:Sobel 梯度 像素 OpenCV 计算 图像 方向 cv

目录



cv::Sobel() 是 OpenCV 中用于计算图像的梯度(边缘)的常用函数之一。它实现了 Sobel 滤波器,这是一种常见的边缘检测技术。Sobel 滤波器是一种基于一阶导数的边缘检测算子,它通过对图像应用离散差分来计算梯度。



1. 函数定义

void cv::Sobel(
    InputArray src,
    OutputArray dst,
    int ddepth,
    int dx,
    int dy,
    int ksize = 3,
    double scale = 1,
    double delta = 0,
    int borderType = BORDER_DEFAULT
);

参数解析:

  1. src (InputArray):输入图像。通常是一个灰度图像(单通道),但也可以是彩色图像(多通道)。它的数据类型可以是 CV_8U, CV_16U, CV_16S, CV_32F, 或 CV_64F

  2. dst (OutputArray):输出图像,用来存储 Sobel 滤波的结果。其大小与输入图像相同,数据类型由 ddepth 参数决定。

  3. ddepth (int):输出图像的深度(即像素的位深度)。常用的深度包括:

    • CV_8U:8-bit unsigned integer
    • CV_16U:16-bit unsigned integer
    • CV_16S:16-bit signed integer
    • CV_32F:32-bit floating point
    • CV_64F:64-bit floating point

    通常情况下会设置为 CV_16SCV_32F,以保证梯度信息不会丢失。

  4. dx (int):计算 x 方向导数的阶数。通常为 1 表示一阶导数(即沿 x 方向的梯度),为 0 表示不计算 x 方向的导数。

  5. dy (int):计算 y 方向导数的阶数。类似 dx,通常为 1 表示沿 y 方向的梯度,为 0 表示不计算 y 方向的导数。

  6. ksize (int):Sobel 核的大小,必须是奇数(如 1, 3, 5, 7)。常用的值是 3,它决定了 Sobel 滤波器的卷积核的大小。如果设置为 1,则使用 Scharr 滤波器,该滤波器比 Sobel 更适合处理细节。

  7. scale (double):可选参数,用于缩放导数的结果。默认值为 1,即不缩放。如果需要缩放梯度值,可以调整这个参数。

  8. delta (double):在计算完导数后,给结果加上的一个偏移值。通常为 0,即不进行偏移调整。

  9. borderType (int):边界扩展类型,指定如何处理边界像素。常用选项包括:

    • BORDER_CONSTANT:用常数填充边界
    • BORDER_REPLICATE:复制最近的边缘像素
    • BORDER_REFLECT:边缘像素按镜像方式填充
    • BORDER_REFLECT_101:类似 BORDER_REFLECT,但边缘像素不会重复


2. 工作原理

Sobel 算子的具体计算过程就是在图像的每个像素及其邻域上进行卷积操作,分别计算出水平方向和垂直方向的梯度。通过合并这两个方向的梯度,可以得到图像中边缘的强度和方向。



2.1 Sobel 核

Sobel 核有两个,一个用于计算水平方向(x 方向)的梯度,另一个用于计算垂直方向(y 方向)的梯度。常用的 Sobel 核是 3x3 的矩阵。

  • X 方向的 Sobel 核(用于计算水平方向的梯度):

    -1  0  +1
    -2  0  +2
    -1  0  +1
    
  • Y 方向的 Sobel 核(用于计算垂直方向的梯度):

    -1  -2  -1
     0   0   0
    +1  +2  +1
    


2.2 计算过程

对于图像中的每个像素,Sobel 算子通过将 \(3\times3\) 的 Sobel 核应用到该像素及其邻域像素上,计算水平方向和垂直方向的梯度。这个过程实际上是卷积,即核与图像的局部区域逐元素相乘,然后相加。

假设图像中的某个像素位于坐标 (i, j),它周围的 3x3 区域像素值如下:

A B C
D E F
G H I

(1) x 方向的 Sobel 卷积计算

使用 X 方向的 Sobel 核进行卷积,具体的计算公式是:

Gx = (-1 * A) + (0 * B) + (1 * C)
   + (-2 * D) + (0 * E) + (2 * F)
   + (-1 * G) + (0 * H) + (1 * I)

这一步计算出了 x 方向的梯度 Gx,它表示该像素在水平方向上的强度变化。


(2) y 方向的 Sobel 卷积计算

使用 Y 方向的 Sobel 核进行卷积,具体的计算公式是:

Gy = (-1 * A) + (-2 * B) + (-1 * C)
   + ( 0 * D) + ( 0 * E) + ( 0 * F)
   + ( 1 * G) + ( 2 * H) + ( 1 * I)

这一步计算出了 y 方向的梯度 Gy,它表示该像素在垂直方向上的强度变化。


(3) 合并 x 和 y 方向的梯度

在得到了 x 方向和 y 方向的梯度后,通常使用以下公式来计算该像素的梯度大小(即边缘强度):

G = sqrt(Gx^2 + Gy^2)

其中 G 是该像素的梯度幅度,代表该像素的边缘强度。为了节省计算资源,也可以使用绝对值的近似公式:

G ≈ |Gx| + |Gy|

通过这种方式,Sobel 算子可以同时计算图像中水平和垂直方向的边缘。



2.3 示例

让我们用一个简单的例子来详细展示每个像素的计算过程。

假设我们有一个 3x3 区域的像素值如下:

10 10 10
20 20 20
30 30 30

使用 X 方向的 Sobel 核进行卷积:

Gx = (-1 * 10) + (0 * 10) + (1 * 10) 
   + (-2 * 20) + (0 * 20) + (2 * 20) 
   + (-1 * 30) + (0 * 30) + (1 * 30)
   = (-10) + 0 + 10 + (-40) + 0 + 40 + (-30) + 0 + 30
   = 0

使用 Y 方向的 Sobel 核进行卷积:

Gy = (-1 * 10) + (-2 * 10) + (-1 * 10)
   + ( 0 * 20) + ( 0 * 20) + ( 0 * 20)
   + ( 1 * 30) + ( 2 * 30) + ( 1 * 30)
   = (-10) + (-20) + (-10) + 0 + 0 + 0 + 30 + 60 + 30
   = 80

这意味着,对于这个 3x3 区域中的中心像素,其水平方向的梯度为 Gx = 0,垂直方向的梯度为 Gy = 80。可以计算出该像素的梯度幅度:

G = sqrt(0^2 + 80^2) = 80

因此,该像素在 y 方向有较强的边缘,而在 x 方向没有显著变化。



3. 示例

以下示例演示了如何使用 cv::Sobel() 来计算图像的 x 和 y 方向的梯度。

#include <opencv2/opencv.hpp>

int main() {
    // 读取灰度图像
    cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
    
    if (src.empty()) {
        std::cerr << "Could not open or find the image" << std::endl;
        return -1;
    }

    cv::Mat grad_x, grad_y;
    cv::Mat abs_grad_x, abs_grad_y;

    // 计算 x 方向的梯度
    cv::Sobel(src, grad_x, CV_16S, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
    // 计算 y 方向的梯度
    cv::Sobel(src, grad_y, CV_16S, 0, 1, 3, 1, 0, cv::BORDER_DEFAULT);

    // 计算梯度的绝对值,并将其转换为 CV_8U
    cv::convertScaleAbs(grad_x, abs_grad_x);
    cv::convertScaleAbs(grad_y, abs_grad_y);

    // 合并 x 和 y 方向的梯度
    cv::Mat grad;
    cv::addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);

    // 显示结果
    cv::imshow("Original Image", src);
    cv::imshow("Sobel Gradient", grad);

    cv::waitKey(0);
    return 0;
}

输出:

  • grad_x:x 方向的梯度图像
  • grad_y:y 方向的梯度图像
  • grad:组合后的梯度图像,显示了图像中的边缘


4. 使用场景

  • 边缘检测:Sobel 滤波器是一种常用的边缘检测算法,它可以提取图像中的边缘和轮廓。
  • 特征提取:在图像处理和计算机视觉中,梯度信息常用于特征提取,例如用于检测物体的轮廓或局部变化。
  • 图像增强:Sobel 滤波器也可用于增强图像的细节部分。


总结

cv::Sobel() 函数通过计算图像的 x 和 y 方向的梯度,帮助提取图像中的边缘和轮廓信息。在许多计算机视觉和图像处理任务中,梯度信息是非常重要的,因此 cv::Sobel() 是一个常用的工具。



标签:Sobel,梯度,像素,OpenCV,计算,图像,方向,cv
From: https://www.cnblogs.com/keye/p/18420873

相关文章

  • OpenCV(cv::magnitude())
    目录1.函数定义2.使用场景3.示例4.注意事项cv::magnitude()是OpenCV中用于计算向量的大小(模)的函数。它可以处理二维向量的模,也可以用于计算图像中每个像素点的梯度大小,通常在处理图像梯度或傅里叶变换时使用。1.函数定义voidcv::magnitude(InputArrayx,......
  • 什么是轻量应用服务器?与云服务器CVM对比有哪些区别?
    对比云服务器CVM,轻量应用服务器TencentCloudLighthouse更聚焦于中小企业、开发者、云计算入门者、学生等用户群体。相比云服务器CVM更加简单易用,精简了云服务器CVM的高阶概念及功能,提供高带宽流量包并以高性价比的套餐形式整体售卖基础云资源,将热门开源软件融合打包实现一......
  • 9月京东云云服务器CVM价格配置表汇总-金秋上云!
    轻量云主机是面向中小企业、开发者打造的预装精选软件、开箱即用的主机产品,快速搭建网站、电商、企业低代码工具箱,云盘、共享文档、知识库、开发测试环境等,相对普通云主机,按套餐购买更优惠、控制台可视化管理,运维更简单,提供更便捷上云体验。轻量云主机这个专区是本次活动的主要专区......
  • 护目镜佩戴检测系统 Opencv
    护目镜佩戴检测系统利用摄像头和图像识别技术,护目镜佩戴检测系统实时监测工人的护目镜佩戴情况,护目镜佩戴检测系统通过拍摄工人的面部图像,并使用算法分析图像中的眼睛和护目镜位置,判断是否正确佩戴护目镜。护目镜佩戴检测系统能够实时监测工人的护目镜佩戴情况,护目镜佩戴检测系统及......
  • py3.7+win10的cv2.xfeatures2d_SIFT.create()函数不存在问题
    python3.7环境window1064位cv2包问题。问题做图片处理用opencv-python做模板匹配的时候会用个sift模型,就会用到cv2.xfeatures2d_SIFT.create()这个函数,在我正要用它增加自己知识,巴拉巴啦....的时候,咦?!这是个什么鬼哦,没有这个函数呢。百度发现需要什么卸载原版本,换成opencv-......
  • Log4j2—漏洞分析(CVE-2021-44228)
    目录Log4j2漏洞原理漏洞根因调用链源码分析调用链总结漏洞复现dnsrmiLog4j2漏洞原理前排提醒:本篇文章基于我另外一篇总结的JNDI注入后写的,建议先看该文章进行简单了解JNDI注入:https://blog.csdn.net/weixin_60521036/article/details/142322372提前小结说明:Log4j2(CVE-2021-4......
  • 设计资料保存:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证
      一、板卡概述      基于V7的高性能PCIe信号处理板,板卡选用Xilinx 公司Virtex7系列FPGA XC7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于高性能采集、回放以及相关处理。通过连接不同的FMC子卡的方式,可实现不同形式的数据采集、回放、处理的功能模块。板......
  • CVE-2024-45409 漏洞解决方案
    漏洞描述CVE-2024-45409漏洞是由RubySAML库引起的。RubySAML库是用于实现SAML授权的客户端。12.2及以下的所有版本、1.13.0到1.16.0之间的Ruby-SAML版本都受此影响。这些版本不能够正确验证SAML响应的签名。因此,具有访问任何身份提供者(IdP)签署的SAML文档的未经......
  • SSD-KD:天翼云&清华出品,最新无原始数据的蒸馏研究 | CVPR'24
    无数据知识蒸馏能够利用大型教师网络所学到的知识,来增强较小型学生网络的训练,而无需访问原始训练数据,从而避免在实际应用中的隐私、安全和专有风险。在这方面的研究中,现有的方法通常遵循一种反演蒸馏的范式,在预训练教师网络指导下实时训练生成对抗网络来合成一个大规模的样本集用......
  • 设计方案:372-基于7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台
    基于7VX690T的万兆光纤、双FMC扩展的综合计算平台RISCV芯片验证平台 一、板卡概述      基于V7的高性能PCIe信号处理板,板卡选用Xilinx 公司Virtex7系列FPGA 7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于高性能采集、回放以及相关处理。通过连接不同的FMC......