传统CV算法——边缘检测算法Canny算法实战

news2024/11/15 12:04:10

Canny 算法

边缘:我的理解是在图像处理的过程中,针对我们图像处理的过程中,梯度变化以较大的地方能够让我们能够快速辨识,针对一个人脸,脸上有一些平滑的地方(没错我针对美颜的),与头发的接壤处,会让我们清楚的意识到这个人脸的大小形状等特征。通过线条我们能够很清晰的辨认一个人的特征,因此,图像边缘是图像处理之中很简单的任务之一。

Canny 边缘检测算法是一种广泛使用的边缘检测技术,由 John F. Canny 在 1986 年提出。它被认为是最优的边缘检测算法之一,因其在检测边缘时具有较好的准确性和低噪声敏感性。Canny 算法的主要目标是识别图像中的边缘,并提供精确的边缘定位。

Canny 算法的步骤

Canny 边缘检测算法是一种多阶段的边缘检测方法,其数学原理主要包括以下几个步骤:

1. 高斯平滑

在进行边缘检测之前,首先需要对图像进行平滑处理,以减少噪声的影响。Canny 算法使用高斯滤波器来实现这一点。高斯滤波器的数学表达式为:

G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2

其中, σ \sigma σ 是高斯分布的标准差, ( x , y ) (x, y) (x,y) 是相对于滤波器中心的坐标。通过卷积操作,将高斯滤波器应用于输入图像,得到平滑后的图像。

2. 计算梯度

接下来,使用 Sobel 算子或其他梯度算子计算图像中每个像素的梯度强度和方向。Sobel 算子通常有两个方向的卷积核:

  • 水平方向( G x G_x Gx):
    G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] G_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} Gx= 121000121

  • 垂直方向( G y G_y Gy):
    G y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] G_y = \begin{bmatrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{bmatrix} Gy= 101202101

通过卷积操作,计算每个像素的梯度强度 G G G 和方向 θ \theta θ

G = G x 2 + G y 2 G = \sqrt{G_x^2 + G_y^2} G=Gx2+Gy2

θ = arctan ⁡ ( G y G x ) \theta = \arctan\left(\frac{G_y}{G_x}\right) θ=arctan(GxGy)

3. 非极大值抑制

在计算出梯度强度和方向后,Canny 算法会进行非极大值抑制,以细化边缘。对于每个像素,算法会检查其梯度强度是否为局部最大值。具体步骤如下:

  • 根据梯度方向,将像素分为四个方向( 0 ∘ 0^\circ 0 4 5 ∘ 45^\circ 45 9 0 ∘ 90^\circ 90 13 5 ∘ 135^\circ 135)。
  • 对于每个像素,检查其在梯度方向上的前后两个像素的强度值。
  • 如果当前像素的强度值不是局部最大值,则将其强度设为零。

4. 双阈值处理

Canny 算法使用双阈值处理来确定强边缘和弱边缘。设定两个阈值(高阈值和低阈值):

  • 强边缘:梯度强度高于高阈值的像素。
  • 弱边缘:梯度强度介于低阈值和高阈值之间的像素。
  • 非边缘:梯度强度低于低阈值的像素。

5. 边缘连接

最后,Canny 算法通过连接强边缘和弱边缘来形成最终的边缘图。只有与强边缘相连的弱边缘才会被保留,其他的弱边缘将被抑制。这一过程确保了边缘的连续性。

Canny 边缘检测算法的数学原理结合了高斯平滑、梯度计算、非极大值抑制、双阈值处理和边缘连接等多个步骤。通过这些步骤,Canny 算法能够有效地检测图像中的边缘,并提供较高的准确性和鲁棒性。

Canny 算法的优点

  • 高精度:Canny 算法能够准确地检测到边缘,并且对噪声具有较强的鲁棒性。
  • 多级阈值:通过双阈值处理,可以有效地分离强边缘和弱边缘,增强边缘的连通性。
  • 细化边缘:非极大值抑制步骤使得边缘更加细化,减少了边缘的宽度。

Canny 算法的缺点

  • 计算复杂度:相较于其他简单的边缘检测算法(如 Roberts、Sobel),Canny 算法的计算复杂度较高,处理速度较慢。
  • 参数选择:高斯滤波器的标准差和双阈值的选择对结果有较大影响,可能需要根据具体应用进行调整。

应用场景

Canny 边缘检测算法广泛应用于计算机视觉和图像处理领域,包括但不限于:

  • 物体检测与识别
  • 图像分割
  • 特征提取
  • 机器人视觉
  • 医学图像分析

总之,Canny 边缘检测算法因其高效性和准确性,成为了边缘检测领域的经典算法之一。

Canny算法步骤

  • 去燥(常用高斯滤波)

任何边缘检测算法都不可能在未经处理的原始数据上很好地工作,使用高斯滤波可以去除常见的噪声。

g σ ( m , n ) = 1 2 π σ 2 e − m 2 + n 2 2 σ 2 ⋅ f ( m , n ) g_\sigma(m, n)=\frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{m^2+n^2}{2 \sigma^2}} \cdot f(m, n) gσ(m,n)=2πσ2 1e2σ2m2+n2f(m,n)

・计算梯度大小和方向
梯度的大小和方向往往可以反应图像灰度值的变化和方向, 可以通过点乘一个sobel或其它算子得到不同方向的梯度值。
常见的梯度算子:canny算子,sobel算子,拉普拉斯算子
・沿着梯度方向进行非极大值抑制

  • 双边阈值处理
  • 低于低阈值的舍弃, 高于阈值的确定为边缘, 在中间的如果与边缘相连接保留,否则舍去。

cv2.Canny 是 OpenCV 中用于执行 Canny 边缘检测的函数。该函数的主要作用是检测图像中的边缘,并返回一个二值图像,其中边缘像素为白色(255),非边缘像素为黑色(0)。

函数原型

edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)

参数说明

  1. image (numpy.ndarray):

    • 描述:输入图像,通常是一个灰度图像。Canny 边缘检测算法通常在灰度图像上运行,因此如果输入是彩色图像,需要先将其转换为灰度图像。
  2. threshold1 (int):

    • 描述:低阈值,用于边缘连接的第一阈值。该值用于确定强边缘和弱边缘的分界。梯度强度低于此值的像素被认为是非边缘。
  3. threshold2 (int):

    • 描述:高阈值,用于边缘连接的第二阈值。该值用于确定强边缘的分界。梯度强度高于此值的像素被认为是强边缘。
  4. apertureSize (int, 可选):

    • 描述:Sobel 算子的大小,默认为 3。该参数决定了用于计算图像梯度的 Sobel 算子的大小。可以设置为 1、3、5 或 7。较大的值会导致更平滑的边缘,但可能会丢失一些细节。
  5. L2gradient (bool, 可选):

    • 描述:是否使用更精确的 L2 范数来计算梯度。默认为 False,表示使用 L1 范数。如果设置为 True,则使用 L2 范数,这样可以获得更精确的边缘检测结果。

返回值

  • edges (numpy.ndarray):
    • 返回一个二值图像,其中边缘像素为白色(255),非边缘像素为黑色(0)。

cv2.Canny 函数是实现 Canny 边缘检测的主要工具,通过合理设置阈值和其他参数,可以有效地检测图像中的边缘特征。选择合适的阈值和参数对于获得最佳的边缘检测效果至关重要。

import cv2

img = cv2.imread("./images/25.jpg",cv2.IMREAD_COLOR)

cv2.imshow("canny",img)

img = cv2.convertScaleAbs(img,alpha=6,beta=0)

cv2.imshow("abs",img)
# 高斯滤波
img = cv2.GaussianBlur(img,(5,5),1)

canny = cv2.Canny(img,100,150)

canny = cv2.resize(canny,(500,500))
cv2.imshow("Canny",canny)
cv2.waitKey(0)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 条件分支语句if...else

if 语句 只有当指定条件为 true 时&#xff0c;该语句才会执行代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name…

Introduction to Deep Learning with PyTorch

1、Introduction to PyTorch, a Deep Learning Library 1.1、Importing PyTorch and related packages import torch# supports: ## image data with torchvision ## audio data with torchaudio ## text data with torchtext 1.2、Tensors: the building blocks of network…

磁盘加密工具 | VeraCrypt v1.26.15 绿色版

VeraCrypt 是一个开源项目&#xff0c;旨在提供强大的加密解决方案&#xff0c;以创建和管理加密的磁盘分区和加密容器。它继承了著名的加密软件 TrueCrypt 的特性&#xff0c;并在此基础上进行了扩展和改进。 主要特性 1. 高级加密算法 VeraCrypt 支持多种加密算法&#xf…

假如你是HR,你怎么招「游戏策划」?

你是一名从业十余年&#xff0c; 拥有丰富面试经历、掌握多种话术的 资深游戏行业人事。 想知道策划岗位该怎么入行可点击蓝链 你不满足于在名不见经传的小企业 拿一份凑合过的薪资&#xff0c; 于是你成功跳槽来到国内顶级游戏大厂“猪厂”&#xff0c; 并且接手了你的…

Redis集群技术1——nosql简述

一、关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 …

谷歌排名SEO优化#蜘蛛池软件(搜索大客户)

谷歌排名SEO优化#蜘蛛池软件&#xff08;搜索大客户&#xff09; 如何检测你的网站是否能被谷歌搜索引擎蜘蛛抓取 通过一个工具快速检测你的网站&#xff0c;是否能被谷歌搜索引擎&#xff0c;bing搜索引擎的蜘蛛爬取收录。网站是否能被蜘蛛抓取收录是谷歌SEO的基础&#xff0…

C_深入理解指针(五) —— sizeof和strlen的对比、数组和指针笔试题解析、指针运算笔试题解析

目录 一、sizeof和strlen的对比 1、sizeof 2、strlen 3、sizeof 和 strlen的对比 二、数组和指针笔试题解析 1、⼀维数组 重点学习代码&#xff1a;sizeof与一维整型数组类型 2、字符数组 代码1&#xff1a;sizeof与字符数组类型 代码2&#xff1a;strlen与字符数组类…

log4j 和 java.lang.OutOfMemoryError PermGen space

还是OneCoder在项目中沙箱的问题&#xff0c;用classloader隔离做的沙箱&#xff0c;反复运行用户的任务&#xff0c;出现永生区内存溢出&#xff1a; java.lang.OutOfMemoryError: PermGen space 这个问题在tomcat重复热部署的时候其实比较常见。其道理也和我们沙箱的道理基本…

【重学 MySQL】十二、SQL 语言的规则与规范

【重学 MySQL】十二、SQL 语言的规则与规范 基本规则注释语法规则命名规则基本命名规则具体命名规范其他注意事项 数据导入指令 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;的规则与规范是确保SQL语句能够正确执行、提高代码可读性和可维…

HarmonyOS开发实战( Beta5.0)Native Drawing自绘制能力替代Canvas提升性能

简介 Canvas 画布组件是用来显示自绘内容的组件&#xff0c;它具有保留历史绘制内容、增量绘制的特点。Canvas 有 CanvasRenderingContext2D/OffscreenCanvasRenderingContext2D 和 DrawingRenderingContext 两套API&#xff0c;应用使用两套API绘制的内容都可以在绑定的 Canv…

语音测试(一)ffmpeg视频转音频

视频转音频 下载ffmpeg工具进入bin目录cmd进入控制台输入命令 ffmpeg.exe -i ./视频.mp4 ./音频.wav命令说明 ffmpeg -i input.mp4 output.mkv FFmpeg 可能会尝试自动选择合适的编码器对视频和音频进行重新编码&#xff0c;以便适应 MKV 格式的要求ffmpeg -i input.mp4 -c c…

Java项目:140 springboot203医疗挂号管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 一共有管理员、挂号人员、划价人员、医生 四个角色 管理员登录进入本系统操作的功能包括对挂号人员&#xff0c;划价人员&#xff0c;患者&#xff0…

初始QT!

作业&#xff1a;了解QT文件夹初始代码的意义 QT core gui #QT工程所需得类库 core是核心库 gui图形化界面相关库类 greaterThan(QT_MAJOR_VERSION, 4): QT widgets #版本超过4.0会加上widgetsCONFIG c11 #该编辑器支持c11后的版本 # The following define makes you…

ngrok forward本地argocd并设置为github repo webhook

为什么需要ngrok 我们刚学了argocd的安装和部署应用&#xff0c;但是argocd什么时候部署部署我们的应用&#xff0c;就取决于repo的sync机制。我们采用以下cmd设置为autosync。 argocd app list # to get our app argocd app set argocd/tekton-learning-nginx --sync-polic…

小试牛刀-SOL链创建Token

目录 1.编写目的 2.账户结构 3.环境及使用依赖 4.步骤分解 4.1.导入相关依赖 4.2. 初始化变量 4.3. 创建并初始化Mint Account 4.4. 创建并初始化Metadata Account 4.5. 发送创建和初始化mint Account 4.6 铸造Token 5.源码分享 Welcome to Code Blocks blog 本篇文…

震惊,从仿真走向现实,3D Map最大提升超12,Cube R-CNN使用合成数据集迁移到真实数据集

震惊&#xff0c;从仿真走向现实&#xff0c;3D Map最大提升超12&#xff0c;Cube R-CNN使用合成数据集迁移到真实数据集 Abstract 由于摄像机视角多变和场景条件不可预测&#xff0c;在动态路边场景中从单目图像中准确检测三维物体仍然是一个具有挑战性的问题。本文介绍了一…

基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码

基于飞桨paddle2.6.1cuda11.7paddleRS开发版的目标提取-道路数据集训练和预测代码 预测结果&#xff1a; 预测影像&#xff1a; &#xff08;一&#xff09;准备道路数据集 下载数据集地址&#xff1a; https://aistudio.baidu.com/datasetdetail/56961 mass_road.zip …

国际标准图像分辨率测试ISO12233 - 2017中文翻译

参考&#xff1a;https://blog.csdn.net/jgw2008/article/details/116519404?spm1035.2023.3001.6557&utm_mediumdistribute.pc_relevant_bbs_down_v2.none-task-blog-2~default~OPENSEARCH~Rate-2-116519404-bbs-392397517.264^v3^pc_relevant_bbs_down_v2_default&d…

SpringBoot与Minio的极速之旅:解锁文件切片上传新境界

目录 一、前言 二、对象存储&#xff08;Object Storage&#xff09;介绍 &#xff08;1&#xff09;对象存储的特点 &#xff08;2&#xff09;Minio 与对象存储 &#xff08;3&#xff09;对象存储其他存储方式的区别 &#xff08;4&#xff09;对象存储的应用场景 三、…

万龙觉醒辅助:VMOS云手机助力资源采集!挂机升级!

《万龙觉醒》是一款策略型游戏&#xff0c;玩家需要合理规划资源采集、建筑升级、科技研发等来提升实力。在本文中&#xff0c;我们将为您提供一篇详细的游戏辅助攻略&#xff0c;并介绍如何使用VMOS云手机来提升您的游戏体验&#xff0c;实现24小时的自动化管理。 使用VMOS云…