当前位置: 首页 > news >正文

opencv - py_imgproc - py_canny Canny边缘检测

文章目录

  • Canny 边缘检测
    • 目标
    • 理论
    • OpenCV 中的 Canny 边缘检测
    • 其他资源

Canny 边缘检测

目标

在本章中,我们将学习

  • Canny 边缘检测的概念
  • 用于该目的的 OpenCV 函数:cv.Canny()

理论

Canny 边缘检测是一种流行的边缘检测算法。它由 John F. Canny 于1986 年开发。它是一种多阶段算法,我们将介绍每个阶段。

  • 降噪

由于边缘检测容易受到图像中噪声的影响,因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们已经在前面的章节中看到过这一点。

  • 查找图像的强度梯度

然后用 Sobel 核在水平和垂直方向上对平滑的图像进行过滤,以获得水平方向 ( G x G_x Gx) 和垂直方向 ( G y G_y Gy) 的一阶导数。从这两个图像中,我们可以找到每个像素的边缘梯度和方向,如下所示:

[ E d g e _ G r a d i e n t ( G ) = G x 2 + G y 2 A n g l e ( θ ) = tan ⁡ − 1 ( G y G x ) ] [ Edge\_Gradient \; (G) = \sqrt{G_x^2 + G_y^2} \\ Angle \; (\theta) = \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg) ] [Edge_Gradient(G)=Gx2+Gy2 Angle(θ)=tan1(GxGy)]

梯度方向始终垂直于边缘。它被四舍五入为四个角度之一,代表垂直、水平和两个对角线方向。

  • 非最大值抑制

在获得梯度幅度和方向后,对图像进行全面扫描,以移除可能不构成边缘的任何不需要的
像素。为此,在每个像素处,检查像素是否是梯度方向上其邻域中的局部最大值。检查下面的图片:

在这里插入图片描述

点 A 在边缘上(垂直方向)。梯度方向垂直于边缘。点 B和 C 在梯度方向上。因此,检查点 A 与点 B 和 C 是否形成局部最大值。如果是,则将其考虑用于下一阶段,否则,将其抑制(置为零)。

简而言之,您得到的结果是具有“薄边缘”的二值图像。

  • 滞后阈值

此阶段决定哪些边缘是真正的边缘,哪些不是。为此,我们需要两个阈值,minVal 和 maxVal。强度梯度大于 maxVal 的任何边都必定是边,低于 minVal 的边必定是非边,因此被丢弃。介于这两个阈值之间的边根据其连通性被分类为边或非边。如果它们连接到“确定边”像素,则它们被视为边的一部分。否则,它们也会被丢弃。
见下图:

在这里插入图片描述

边 A 高于 maxVal,因此被视为“确定边”。虽然边 C 低于 maxVal,但它连接到边 A,因此也被视为有效边,我们得到了完整的曲线。但是边 B,虽然它高于 minVal 并且与边 C 位于同一区域,但它没有连接到任何“确定边”,因此被丢弃。因此,我们必须相应地选择 minVal 和 maxVal,以获得正确的结果,这一点非常重要。

此阶段还会在假设边缘为长线的情况下消除小像素噪声。

因此,我们最终得到的是图像中的强边缘。

OpenCV 中的 Canny 边缘检测

OpenCV 将上述所有内容放在一个函数 cv.Canny() 中。我们将了解如何使用它。
第一个参数是我们的输入图像。
第二个和第三个参数分别是我们的 minVal 和 maxVal。
第四个参数是aperture_size。它是用于查找图像梯度的 Sobel 核的大小。默认情况下为 3。
最后一个参数是 L2gradient,它指定用于查找梯度幅度的方程。如果它为 True,则使用上面提到的更准确的方程,否则它使用此函数: E d g e _ G r a d i e n t ( G ) = ∣ G x ∣ + ∣ G y ∣ Edge\_Gradient \; (G) = |G_x| + |G_y| Edge_Gradient(G)=Gx+Gy。默认情况下,它是False。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])plt.show()

请参阅以下结果:

在这里插入图片描述

其他资源

  • 维基百科 上的 Canny 边缘检测器
  • Canny 边缘检测教程,作者:Bill Green,2002 年。
http://www.lryc.cn/news/476158.html

相关文章:

  • Spring Boot 创建项目详细介绍
  • 70B的模型需要多少张A10的卡可以部署成功,如果使用vLLM
  • clickhouse配置用户角色与权限
  • 面试题整理 4
  • React基础大全
  • 51c大模型~合集10
  • 【已解决】element-plus配置主题色后,sass兼容问题。set-color-mix-level() is...in Dart Sass 3
  • JavaWeb——Web入门(4/9)-HTTP协议:请求协议(请求行、请求头、请求体、演示 )
  • 软考:数据库考点总结
  • Flash的语音ic型号有哪些?
  • 10天进阶webpack---(1)为什么要有webpack
  • HTML CSS
  • 第03章 MySQL的简单使用命令
  • 【C++动态规划】2435. 矩阵中和能被 K 整除的路径|1951
  • 三、Kafka集群
  • [数据结构]堆
  • UDP-鼠李糖合成酶基因的克隆与鉴定-文献精读76
  • 【H2O2|全栈】JS进阶知识(四)Ajax
  • Spring IOC的工作流程
  • 从新手到专家:7款电脑平面设计软件评测
  • 【C++】如何让C++字符串更快、C++的小字符串优化
  • C++《list》
  • strongswan中METHOD定义
  • Rive 动画框架竟然支持响应式布局,全平台动画框架开启全新 UI 交互能力
  • MQ的详细大全知识点
  • AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2
  • 【tomcat系列漏洞利用】
  • 前端学习-盒子模型(十八)
  • 【C++】类和对象(十二):实现日期类
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《提升系统频率支撑能力的“车-氢”柔性可控负荷协同构网控制》