自学内容网 自学内容网

OpenCV特征检测(2)边缘检测函数Canny()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

使用 Canny 算法 48在图像中查找边缘。
该函数使用 Canny 算法在输入图像中查找边缘,并在输出地图 edges 中标记它们。在 threshold1 和 threshold2 之间使用较小的值进行边缘链接。较大的值用于查找强烈的边缘的初始段。参见 http://en.wikipedia.org/wiki/Canny_edge_detector

cv::Canny() 是 OpenCV 库中用于边缘检测的一个非常流行的函数。它使用 Canny 边缘检测算法来找出图像中的边缘。

函数原型

void cv::Canny
(
InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool L2gradient = false 
)

参数

  • 参数image:8 位输入图像。
  • 参数edges:输出的边缘图;单通道 8 位图像,其大小与 image 相同。
  • 参数threshold1:滞后阈值程序的第一个阈值。
  • 参数threshold2:滞后阈值程序的第二个阈值。
  • 参数apertureSize:Sobel 操作符的孔径大小。
  • 参数L2gradient:一个标志,指示是否应使用更准确的 L2 范数 N O M = ( d I / d x ) 2 + ( d I / d y ) 2 NOM=\sqrt{(dI/dx)^2 + (dI/dy)^2} NOM=(dI/dx)2+(dI/dy)2 来计算图像梯度大小(L2gradient=true)如果为 false,则使用默认的 L1 范数 = ∣ d I / d x ∣ + ∣ d I / d y ∣ =|dI/dx|+|dI/dy| =dI/dx+dI/dy

函数原型2

void cv::Canny
(I
nputArray dx,
InputArray dy,
OutputArray edges,
double threshold1,
double threshold2,
bool L2gradient = false 
)

参数2

  • 参数dx:输入图像的 16 位 X 方向导数(CV_16SC1 或 CV_16SC3 类型)。
  • 参数dy:输入图像的 16 位 Y 方向导数(与 dx 类型相同)。
  • 参数edges:输出的边缘图;单通道 8 位图像,其大小与 image 相同。
  • 参数threshold1:滞后阈值程序的第一个阈值。
  • 参数threshold2:滞后阈值程序的第二个阈值。
  • 参数L2gradient:一个标志,指示是否应使用更准确的 L2 范数 $nom=\sqrt{(dI/dx)^2 + (dI/dy)^2}
    来计算图像梯度大小(L2gradient=true),或者是否使用默认的 L1 范数 n o m = ∣ d I / d x ∣ + ∣ d I / d y ∣ nom=|dI/dx|+|dI/dy| nom=dI/dx+dI/dy
    即可(L2gradient=false)。

代码示例

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

int main()
{
    // 加载图像
    cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_GRAYSCALE );
    if ( img.empty() )
    {
        std::cout << "Error opening image" << std::endl;
        return -1;
    }

   // 使用 Canny 边缘检测算法
    cv::Mat edges;
    int threshold1 = 50; // 第一个阈值
    int threshold2 = 150; // 第二个阈值

    // 调用 Canny 函数
    cv::Canny(img, edges, threshold1, threshold2); // 使用 Canny 算法检测边缘

    // 显示原始图像和边缘图像
    cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
    cv::imshow("Original Image", img);

    cv::namedWindow("Edges", cv::WINDOW_NORMAL);
    cv::imshow("Edges", edges);

    cv::waitKey(0);


    return 0;
}

运行结果

在这里插入图片描述


原文地址:https://blog.csdn.net/jndingxin/article/details/142375714

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!