openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读 ?????OpenCV实战系列总目录

这篇具有很好参考价值的文章主要介绍了openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读 ?????OpenCV实战系列总目录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🧡💛💚💙💜OpenCV实战系列总目录

打印一个图片可以做出一个函数:

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

1、Canny边缘检测流程

Canny是一个科学家在1986年写了一篇论文,所以用自己的名字来命名这个检测算法,Canny边缘检测算法这里写了5步流程,会用到之前《openCV实战-系列教程》的内容。 

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。

滤波:Canny检测算法使用的滤波器是高斯滤波器,通过滤波器可以对图像进行平滑处理。所以第一步需要过滤噪声,当进行检测的时候,肯定需要计算梯度,当遇到噪音点也会发生梯度的变化,所以为了更好的做到边缘检测,第一步需要去噪。

梯度:之前我们计算梯度的时候,只需要计算大小就行了,但是现在需要计算一下方向,所以梯度计算包括强度和方向。

非极大值抑制:计算的梯度大小有不同,比如在一个3*3的卷积核中,有些梯度比较小,相对大的就会保留下来,小的梯度就不会保留,只留下最明显的。 比如在人脸检测中,需要把人脸部分打出一个框的标识,计算的时候会计算出多个框,每个框都有一个概率值,最后只保留概率最大的那个框,而其他的框就会被抑制掉。

双阈值:计算边界的时候,会计算出多个候选值,在候选值中会再进行计算,只保留最接近真实的那个候选值边界。

完成边缘检测:将前面的结果都组合起来,完成边缘检测。

2、高斯滤波器

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

在前面的内容中已经讲解过,中间点比较大,越边缘的点越小,图中的H对高斯滤波器的滤波核进行归一化处理,然后再将滤波核H框住的区域A对应位置相乘再求和得到一个结果e。

3、梯度方向

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

Canny计算梯度使用的是Sobel算子(前面已经讲过这个内容), Sobel算子中需要分别计算水平和竖直两个方向的Gx和Gy(Gx和Gy的计算如上图),将这个结果融合到一起G计算方法如上图

梯度方向就是θ值,通过Gx和Gy计算得到,计算方法如上图。

4、非极大值抑制

4.1 方法A

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

如图所示,C点是目标像素点,需要判断C是不是一个极大值点,然后红色方框是它的周围的8个像素,蓝色线是C点的梯度方向,梯度方向和边界方向应该是垂直的关系。

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

如图所示,g1、g2、g3、g4、c都是一个像素点,而Q、Z是梯度方向与方框的交点,Q和Z不是一个像素是一个亚像素,使用线性插值法计算这个亚像素。 

首先g1、g2、g3、g4的梯度(梯度幅值,上一节讲到的梯度计算)都能够计算出来, Q就是g1和g2之间的,用M(dtmp1)表示Q点梯度(梯度幅值),它的计算方法在上图的公式已经给出,w和(1-w)都是代表的是一个权重,是Q点到g1、g2点的距离比上g1到g2的距离。得到权重乘上g1和g2的梯度就得到了Q点的梯度。

通过比较C、Q、Z的梯度值,如果C比Q、Z都要大,则说明C点是一个极大值,就可以将C点保留下来。

4.2 方法B

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

由于方法A太复杂了,将它简化成方法B,将一个像素周围的8个像素分解成8个方向。在方法1中如果过了g1和g4就不需要做插值了。方法B就是判断当前的方向和这8个方向那个最近就是哪个方向。然后这个方向上除了目标像素值之外还有两个点,如图所示假如分别是A、B、C,如果目标点A比B、C的梯度都要小那么A点就是极大值点。

5、双阈值检测 

 openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

maxVal即max value,意思是如果算出来的梯度值比maxVal(假如是100)大,那就是边界。

所以A点是边界,如果红色线下方还有一个D点,那么就舍弃这个点,这个点的梯度值比minVal小。

如果是在minval和maxval之间,就要分开讨论了,比如C点和边界点A连接在了一起,那么C点就可以判断为一个边界点,否则比如B点就不是了

6、边缘检测效果实现

这里的80和150就是minVal和maxVal

img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)

res = np.hstack((v1,v2))
cv_show(res,'res')

打印结果:

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python

 所以minVal和maxVal的设定是比较重要的,第5节中如果对minval进行调整,那么提到的D点就有可能判定为边界点,因此会提取出更多的细节。

再导入一张图片,将两个参数设置的更大一些来对比:

img=cv2.imread("car.png",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,120,250)
v2=cv2.Canny(img,50,100)

res = np.hstack((v1,v2))
cv_show(res,'res')

打印结果:

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读,openCV实战,源码解读,计算机视觉,计算机视觉,opencv,python文章来源地址https://www.toymoban.com/news/detail-678828.html

到了这里,关于openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读 ?????OpenCV实战系列总目录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【OpenCV】第十章: Canny边缘检测

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

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

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

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

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

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

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

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

     

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

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

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

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

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

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

    2024年02月03日
    浏览(45)
  • Python实现:高斯滤波 均值滤波 中值滤波 Canny(边缘检测)PCA主成分分析 直方图规定化 Mean_Shift

    左侧为原图右侧为高斯滤波后的图 左图为带有噪声的输入原图,右图为经过均值滤波后的图片 左图为带有噪声的输入原图,右图为经过中值滤波后的图 上图为输入原图,下图为经过Canny边缘检测后的图 上图为原图 中图为规定目标图 下图为原图经过规定化后的图 左图为原输

    2024年02月07日
    浏览(31)
  • OpenCV(7):边缘检测之Sobel算子,Scharr算子,Laplacian算子和Canny算子边缘检测

    Sobel算子、Scharr算子、Laplacian算子和Canny算子都是常用的图像边缘检测算法。它们可以用来识别图像中物体之间的边界,从而对物体进行定位、跟踪、分割、识别等处理。 Sobel算子和Scharr算子都是基于卷积运算实现的边缘检测算法。Sobel算子使用两个3×3的矩阵对原始图像进行卷

    2024年02月05日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包