本文共 2197 字,大约阅读时间需要 7 分钟。
边缘检测是根据灰度突变来分割图像的一种常用方法。边缘模型通常分为台阶模型和斜坡模型。在实际图像中,斜坡边缘模型更为常见。在使用二阶梯度获取图像边缘时,二阶导数会产生一个局部极大正值和一个局部极小负值,这在图像上表现为双线性效应。
Canny边缘检测算法由John F. Canny在1986年提出,主要包括以下步骤:
OpenCV 提供了 cv::Canny 函数来实现上述算法。函数参数说明如下:
image:单通道灰度图像。edges:存储边缘像素的输出图像。threshold1 和 threshold2:滞后阈值处理的超参数。apertureSize:使用 Sobel 算子时的卷积核大小,默认为 3。L2gradient:计算梯度幅值时是否使用 L2 范数,默认为 false。函数调用示例:
void cv::Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
以下是一个使用 OpenCV 实现 Canny 边缘检测的示例代码:
#include#include #include #include using namespace std;using namespace cv;static void CannyThreshold(int, void*) { // 对图像进行高斯滤波 blur(src_gray, detected_edges, Size(3, 3)); // 应用 Canny 算法 Canny(detected_edges, detected_edges, low_threshold, low_threshold * ratio, ks); // 初始化结果图像 dst.create(src.size(), src.type()); // 复制原始图像到结果图像 src.copyTo(dst, detected_edges); // 显示结果图像 imshow("Canny Edge Map", dst); // 保存结果图像 imwrite("seg_res.png", dst);}int main(int argc, char **argv) { CommandLineParser parser(argc, argv, "{@input | fruits.jpg | input image}"); src = imread(samples::findFile(parser.get ("@input")), IMREAD_COLOR); if (src.empty()) { cout << "Could not open or find the image!" << endl << "Usage: " << argv[0] << " " << endl; return -1; } // 初始化结果图像 dst.create(src.size(), src.type()); cvtColor(src, src_gray, COLOR_BGR2GRAY); namedWindow("Canny Edge Map", WINDOW_AUTOSIZE); createTrackbar("Min Threshold:", "Canny Edge Map", &low_threshold, max_low_threshold, CannyThreshold); CannyThreshold(0, 0); waitKey(0); return 0;}
上述代码首先读取输入图像,进行灰度转换后调用 Canny 函数进行边缘检测,并将结果显示和保存。
转载地址:http://gahfk.baihongyu.com/