opencv中Canny的高低阈值参数简析

这篇具有很好参考价值的文章主要介绍了opencv中Canny的高低阈值参数简析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

void Canny( InputArray _src, OutputArray _dst,
                double low_thresh, double high_thresh,
                int aperture_size, bool L2gradient )

相信很多同学在使用Canny函数的时候只知道高阈值和低阈值调高或者调低有什么用,就像下面的总结一样:

  1. 低于阈值1的像素点会被认为不是边缘;
  2. 高于阈值2的像素点会被认为是边缘;
  3. 在阈值1和阈值2之间的像素点,若与第2步得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘。

但其实 并没有真正理解高低阈值是怎样来的,并且不知道怎么调整参数来改变Canny的效果,只能一个一个值的试。那下面我就会带着大家从Canny源码一步一步解析,并且教大家怎么使用高低阈值。

    Sobel(src, dx, CV_16S, 1, 0, aperture_size, 1, 0, cv::BORDER_REPLICATE); 

    Sobel(src, dy, CV_16S, 0, 1, aperture_size, 1, 0, cv::BORDER_REPLICATE); 

源码中有这两段代码,通过sobel算子计算当前点的水平和垂直方向的梯度值,并存放在dx和dy中

canny高低阈值,源码说话,opencv,计算机视觉,c++,图像处理

 文章来源地址https://www.toymoban.com/news/detail-737231.html

gif.latex?%5Ctiny%20Gx%20%3D%20%5Bf%28x+1%2Cy-1%29%20+%202f%28x+1%2Cy%29%20+%20f%28x+1%2Cy+1%29%5D%20-%20%5Bf%28x-1%2Cy-1%29%20+%202f%28x-1%2Cy%29%20+%20f%28x-1%2Cy+1%29%5D

gif.latex?%5Ctiny%20Gy%20%3D%20%5Bf%28x-1%2Cy-1%29+%202f%28x%2Cy-1%29%20+%20f%28x+1%2Cy-1%29%5D%20-%20%5Bf%28x-1%2C%20y+1%29%20+%202f%28x%2Cy+1%29%20+%20f%28x+1%2Cy+1%29%5D

for (int i = 0; i <= src.rows; i++) // i 表示第i行
    {
 
	// i == 0 时,_norm 指向 mag_buf[1]
	// i > 0 时, _norm 指向 mag_buf[2]
	// +1 表示跳过每行的第一个元素,因为是后扩展的边,不可能是边缘
	int* _norm = mag_buf[(i > 0) + 1] + 1; 
        
            short* _dx = dx.ptr<short>(i); // _dx指向dx矩阵的第i行
            short* _dy = dy.ptr<short>(i); // _dy指向dy矩阵的第i行
 
            if (!L2gradient) // 如果 L2gradient为false
            {
                for (int j = 0; j < src.cols*cn; j++) // 对第i行里的每一个值都进行计算
                    _norm[j] = std::abs(int(_dx[j])) + std::abs(int(_dy[j])); 
                    // 用||+||计算
            }
            else
            {
                for (int j = 0; j < src.cols*cn; j++)
		    //用平方计算,当 L2gradient为 true时高低阈值都被平方了,所以此处_norm[j]无需开平方
                    _norm[j] = int(_dx[j])*_dx[j] + int(_dy[j])*_dy[j]; //
            }
 
            _norm[-1] = _norm[src.cols] = 0; // 最后一列和第一列的梯度幅值设置为0
        
}

上一段源码,通过sobel算子计算出来的方向梯度值来计算当前点的梯度值。

最后当然就是该知道使用canny函数时的高低阈值参数怎么用了!

int m = _mag[j];//m为计算出来该点的梯度值
 
            if (m > low) // 如果大于低阈值
            {
                int xs = _x[j];    // dx中 第i-1行 第j列
                int ys = _y[j];    // dy中 第i-1行 第j列
                int x = std::abs(xs);
                int y = std::abs(ys) << CANNY_SHIFT;
            }
	      //比当前的梯度幅值低阈值还低,直接被确定为非边缘
            prev_flag = 0;
            _map[j] = uchar(1); // 1 表示不属于边缘

然后就是在源码这个位置,填写的低阈值就有了他的用武之地了,通过计算出来的该点梯度值与低阈值做对比,是否为边缘。高阈值也类似,感兴趣的可以自己看源码

根据自己路径名改一下即可C:\yx\opencv\sources\modules\imgproc\src\canny.cpp

 

到了这里,关于opencv中Canny的高低阈值参数简析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCv之Canny

    目录 一、自适应阈值 二、边缘检测Canny 引入前提:在前面的部分我们使用是全局闻值,整幅图像采用同一个数作为闻值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应闻值。此时的闻值是根据图像上

    2024年02月17日
    浏览(24)
  • OpenCV——Canny边缘检测算法

    图像分割是将数字图像细分为多个子区域的过程,在计算机视觉/机器视觉领域被广泛应用。它的目的是简化或改变图像的表示形式,以便更容易理解和分析。常见的图像分割方法包括阈值处理、聚类法、边缘检测和区域生长等。解决图像分割问题通常需要结合领域知识,以提

    2024年04月17日
    浏览(46)
  • 【OpenCV】第十章: Canny边缘检测

    第十章: Canny边缘检测 canny边缘检测是一种一阶微分算子检测算法,但为什么还要单独拿出来讲呢,因为它几乎是边缘检测算子中最优秀的边缘检测算子,你很难找到一种边缘检测算子能显著地比Canny算子做的更好。 Canny提出了边缘检测算子优劣评判的三条标准: 1、较高的检

    2024年02月03日
    浏览(42)
  • opencv-Canny 边缘检测

    Canny边缘检测是一种经典的图像边缘检测算法,它在图像中找到强度梯度的变化,从而 识别出图像中的边缘 。 Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中, cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下: 参数说明: image : 输入图像,通常为灰度图像。

    2024年02月22日
    浏览(62)
  • 【OpenCV实现图像梯度,Canny边缘检测】

    OpenCV中,可以使用各种函数实现图像梯度和Canny边缘检测,这些操作对于图像处理和分析非常重要。 图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中,可以使用cv2.Sobel()函数计算图像的梯度,该函数可以计算图像在水平和垂直方向上的梯度。梯度的方向和大小可以帮助

    2024年02月07日
    浏览(50)
  • Python Opencv实践 - Canny边缘检测

     

    2024年02月11日
    浏览(50)
  • OpenCV自学笔记十四:Canny边缘检测

    Canny边缘检测是一种经典的图像边缘检测算法,具有以下几个步骤: 1. 噪声抑制:首先对图像进行平滑处理,以去除图像中的噪声。常用的方法是应用高斯滤波器。 2. 计算梯度:通过对平滑后的图像应用Sobel算子(或其他梯度算子),计算图像的梯度幅值和梯度方向。梯度表

    2024年02月08日
    浏览(48)
  • opencv(七)Canny边缘检测和图像轮廓检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、检测步骤 1)使用高斯滤波器,以平滑图像,滤掉噪声。 2)计算图像中每个像素点的梯度强度和方向 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应 4)应用双阈值(

    2024年02月04日
    浏览(55)
  • OpenCV 笔记(12):常用的边缘检测算子—— Canny

    一阶导数、二阶导数的边缘算子虽然简单易用,但存在一些缺点。例如容易受噪声影响,容易产生虚假边缘。 John F. Canny 在 1986 年提出了 Canny 边缘检测算法。它是结合了梯度计算方法和非极大值抑制技术的一种边缘检测算法。该算法克服了之前的边缘检测算法在抑制噪声和保

    2024年02月03日
    浏览(58)
  • opencv 边缘检测 cv2.Canny()详解

    👨‍💻 个人简介: 深度学习图像领域工作者 🎉 总结链接:              链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                     📌 1.工作中常用深度学习脚本                     📌 2.to

    2024年02月03日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包