- 操作系统: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;
}