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

cv::Sobel()算子

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

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

cpp 复制代码
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函数的一般用法和参数:

cpp 复制代码
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函数可以方便地将梯度信息从直角坐标系转换为极坐标系,以便进一步处理和分析图像的梯度。通常,这在边缘检测和特征提取等图像处理任务中非常有用。

案例

cpp 复制代码
#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;
}
相关推荐
CodeWithMe33 分钟前
【C++】线程池
开发语言·c++
专注API从业者1 小时前
《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
开发语言·后端·爬虫·golang
wuqingshun3141591 小时前
蓝桥杯 2. 确定字符串是否是另一个的排列
数据结构·c++·算法·职场和发展·蓝桥杯
欧先生^_^2 小时前
Scala语法基础
开发语言·后端·scala
hu_yuchen2 小时前
C++:BST、AVL、红黑树
开发语言·c++
炯哈哈2 小时前
【上位机——MFC】视图
开发语言·c++·mfc·上位机
我也不曾来过12 小时前
继承(c++版 非常详细版)
开发语言·c++
purrrew2 小时前
【JAVA ee初阶】多线程(3)
java·开发语言
jndingxin3 小时前
OpenCV 图形API(69)图像与通道拼接函数------将一个 GMat 类型的对象转换为另一个具有不同深度GMat对象函数convertTo()
人工智能·opencv·计算机视觉
CoovallyAIHub3 小时前
Vision Transformers与卷积神经网络详细训练对比(附代码)
深度学习·算法·计算机视觉