Canny 边缘检测 您所在的位置:网站首页 canny函数 Canny 边缘检测

Canny 边缘检测

2023-08-16 00:37| 来源: 网络整理| 查看: 265

创建程序中要用到的变量:

Mat src, src_gray; Mat dst, detected_edges; int edgeThresh = 1; int lowThreshold; int const max_lowThreshold = 100; int ratio = 3; int kernel_size = 3; char* window_name = "Edge Map"; 注意: a. 我们首先设定高:低阈值比为 3:1 (通过变量 *ratio* ) b. 设定内核尺寸为 :math:`3` (Canny函数内部调用Sobel操作) c. 将低阈值的上限设定为 :math:`100`.

装载原图像:

/// 装载图像 src = imread( argv[1] ); if( !src.data ) { return -1; }

创建与 src 同类型和大小的矩阵(dst)

dst.create( src.size(), src.type() );

将输入图像转换到灰度空间 (使用函数 cvtColor):

cvtColor( src, src_gray, CV_BGR2GRAY );

创建显示窗口

namedWindow( window_name, CV_WINDOW_AUTOSIZE );

创建trackbar,来获取用户交互输入的低阈值:

createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );

注意:

通过trackbar控制的变量为 lowThreshold ,上限为 max_lowThreshold (我们已经设定为100) 每次用户通过trackbar产生变动,回调函数 CannyThreshold 被调用.

让我们一步一步的来观察 CannyThreshold 函数:

首先, 使用 3x3的内核平滑图像:

blur( src_gray, detected_edges, Size(3,3) );

其次,运用 Canny 寻找边缘:

Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );

输入参数:

detected_edges: 原灰度图像 detected_edges: 输出图像 (支持原地计算,可为输入图像) lowThreshold: 用户通过 trackbar设定的值。 highThreshold: 设定为低阈值的3倍 (根据Canny算法的推荐) kernel_size: 设定为 3 (Sobel内核大小,内部使用)

填充 dst 图像,填充值为0 (图像全黑).

dst = Scalar::all(0);

最后, 使用函数 copyTo 标识被检测到的边缘部分 (背景为黑色).

src.copyTo( dst, detected_edges);

copyTo 将 src 图像拷贝到 dst . 但是,仅仅拷贝掩码不为0的像素。既然Canny边缘检测的输出是镶嵌在黑色背景中的边缘像素,因此其结果 dst 图像除了被检测的边缘像素,其余部分都为黑色。

显示结果:

imshow( window_name, dst );


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有