c++视觉处理---cv::Sobel()`算子

cv::Sobel()算子

cv::Sobel()是OpenCV库中的函数之一,用于计算图像的Sobel梯度。Sobel梯度是一种常用的图像处理技术,用于检测图像中的边缘和轮廓。

以下是cv::Sobel()函数的一般用法和参数:

void cv::Sobel(
    cv::InputArray src,       // 输入图像
    cv::OutputArray dst,      // 输出的梯度图像
    int ddepth,               // 输出图像的深度(通常为-1,表示与输入图像相同)
    int dx, int dy,           // x和y方向的导数阶数(通常为1)
    int ksize = 3,            // Sobel核的大小
    double scale = 1,         // 缩放因子
    double delta = 0,         // 可选的增量
    int borderType = cv::BORDER_DEFAULT // 边界填充类型
);
  • src: 输入图像,通常是灰度图像。
  • dst: 输出的梯度图像,包含了计算的梯度信息。
  • ddepth: 输出图像的深度,通常设置为-1,表示输出图像与输入图像的深度相同。
  • dxdy: x和y方向的导数阶数,通常都设置为1,表示计算一阶导数。
  • ksize: Sobel核的大小,通常为3,表示使用3x3的Sobel核。
  • scale: 缩放因子,可以用于调整梯度值的幅度。
  • delta: 可选的增量,可以用于进一步微调梯度值。
  • borderType: 边界填充类型,通常使用默认值cv::BORDER_DEFAULT

cv::Sobel()函数根据指定的参数计算输入图像的梯度信息。你可以选择计算x方向、y方向或两者方向的梯度。梯度图像的像素值表示了在图像中的每个位置上的梯度强度。

使用cv::Sobel()函数,你可以实现各种基于梯度的图像处理任务,如边缘检测、轮廓提取等。参数的不同设置可以影响计算的梯度效果,可以根据具体需求进行调整。

cv::cartToPolar:将直角坐标系中的两个图像转换为极坐标系中的梯度幅值和方向

cv::cartToPolar是OpenCV中的一个函数,用于将直角坐标系中的两个图像转换为极坐标系中的梯度幅值和方向。通常,它用于处理Sobel、Scharr等梯度算子的输出结果,将水平和垂直梯度转换为梯度幅值和方向。

以下是cv::cartToPolar函数的一般用法和参数:

void cv::cartToPolar(
    cv::InputArray x,           // 输入的x坐标图像(水平梯度)
    cv::InputArray y,           // 输入的y坐标图像(垂直梯度)
    cv::OutputArray magnitude,  // 输出的梯度幅值图像
    cv::OutputArray angle,      // 输出的梯度方向图像
    bool angleInDegrees = false // 是否输出梯度方向的角度(默认为弧度)
);
  • xy: 输入的水平和垂直梯度图像,通常来自梯度算子(如Sobel)的输出。
  • magnitude: 输出的梯度幅值图像,表示每个位置的梯度强度。
  • angle: 输出的梯度方向图像,表示每个位置的梯度方向。
  • angleInDegrees: 一个布尔值,用于指定是否输出梯度方向的角度(如果设置为true,则以度为单位;如果设置为false,则以弧度为单位)。

cv::cartToPolar函数执行以下计算:

  • 对于每个输入位置 (x, y),计算 (magnitude, angle),其中 magnitude(x, y) 的模长(梯度幅值),angle(x, y) 的极坐标角度(梯度方向)。

使用cv::cartToPolar函数可以方便地将梯度信息从直角坐标系转换为极坐标系,以便进一步处理和分析图像的梯度。通常,这在边缘检测和特征提取等图像处理任务中非常有用。

案例

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取输入图像
    cv::Mat inputImage = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);

    if (inputImage.empty()) {
        std::cerr << "Error: Could not read the input image." << std::endl;
        return -1;
    }

    // 创建输出的水平和垂直梯度图像
    cv::Mat gradientX, gradientY;

    // 计算水平梯度(x方向)
    cv::Sobel(inputImage, gradientX, CV_32F, 1, 0);

    // 计算垂直梯度(y方向)
    cv::Sobel(inputImage, gradientY, CV_32F, 0, 1);

    // 计算梯度幅值和方向
    cv::Mat gradientMagnitude, gradientDirection;
    cv::cartToPolar(gradientX, gradientY, gradientMagnitude, gradientDirection, true);

    // 显示原始图像和梯度图像
    cv::imshow("Original Image", inputImage);
    cv::imshow("计算水平梯度(x方向)", gradientX);
    cv::imshow("计算水平梯度(y方向)", gradientY);
    cv::imshow("计算梯度幅值梯度强度", gradientMagnitude);
    cv::imshow("计算梯度方向", gradientDirection);

    cv::waitKey(0);

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枭玉龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值