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;
}
相关推荐
小陈phd几秒前
Vscode LinuxC++环境配置
linux·c++·vscode
华清远见IT开放实验室2 分钟前
【每天学点AI】实战图像增强技术在人工智能图像处理中的应用
图像处理·人工智能·python·opencv·计算机视觉
界面开发小八哥6 分钟前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具
火山口车神丶15 分钟前
某车企ASW面试笔试题
c++·matlab
只怕自己不够好15 分钟前
《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》
人工智能·opencv·计算机视觉
qystca34 分钟前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱35 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子39 分钟前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
是阿建吖!40 分钟前
【优选算法】二分查找
c++·算法
努力进修44 分钟前
“探索Java List的无限可能:从基础到高级应用“
java·开发语言·list