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,表示输出图像与输入图像的深度相同。
  • dx和dy: 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 // 是否输出梯度方向的角度(默认为弧度)
);
  • x和y: 输入的水平和垂直梯度图像,通常来自梯度算子(如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;
}
相关推荐
码农小河664 小时前
基于PHP的电商后台蜜罐系统
开发语言·php
starzy19904 小时前
深入理解Scala柯里化函数:函数链式变换
开发语言·scala
ShineWinsu5 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
总要学点什么6 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
starzy199010 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克60510 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师10 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可12311 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言
晴天的雨.99212 小时前
【C++】继承篇
java·开发语言·c++