十八、计算机视觉-canny边缘检测

news2024/11/18 3:39:39

文章目录

  • 前言
  • 一、canny检测的流程
    • 1.高斯滤波(Gaussian Smoothing)
    • 2.梯度计算(Gradient Calculation)
    • 3.非极大值抑制(Non-maximum Suppression)
    • 4.双阈值检测(Double Thresholding)
    • 5.边缘跟踪与连接(Edge Tracking and Hysteresis)
  • 二、代码实现


前言

Canny边缘检测是计算机视觉领域中常用的一种边缘检测算法,它由约翰·凯恩(John Canny)于1986年提出,是一种多阶段的算法,具有较好的性能和准确性。Canny边缘检测算法的主要优点包括良好的边缘定位精度、抑制噪声的能力以及对边缘连接的稳健性。然而,它也存在一些缺点,如计算复杂度较高、对参数的敏感性等。因此,在实际应用中,需要根据具体情况进行参数调整和优化。


一、canny检测的流程

1.高斯滤波(Gaussian Smoothing)

Canny边缘检测的第一步是使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。高斯滤波器我们上节课已经讲过了,这里就不重复了。

2.梯度计算(Gradient Calculation)

接下来,对平滑后的图像使用Sobel、Prewitt或其他梯度算子计算图像中每个像素点的梯度值和方向。这一步用于检测图像中的边缘。

3.非极大值抑制(Non-maximum Suppression)

在第二步梯度计算中,每个像素点都被赋予了一个梯度幅值和一个梯度方向。然后,非极大值抑制的目标是通过扫描图像,对每个像素点进行检查,并在梯度方向上比较该像素点与其相邻两个像素点的梯度幅值,只保留梯度幅值最大的像素点,而抑制其他像素点。这样做的结果是,在梯度图像中只保留了沿着边缘方向上梯度最大的像素点,其他像素点被抑制或抑制掉。这种抑制机制有助于细化边缘并减少边缘检测结果中的杂散响应,使得边缘更加清晰和准确。
具体来说,对于每个像素点,算法的步骤如下:

1>确定当前像素点的梯度方向。
2>在梯度方向上,找到与当前像素点相邻的两个像素点。
3>比较当前像素点与其相邻两个像素点的梯度幅值。
4>如果当前像素点的梯度幅值最大,则保留该像素点;否则,抑制该像素点。

4.双阈值检测(Double Thresholding)

双阈值检测(Double Thresholding)是Canny边缘检测算法的第四个步骤,它用于将梯度图像中的像素点分成三类:强边缘像素、弱边缘像素和非边缘像素,以便后续的边缘连接处理。
具体来说,双阈值检测的步骤如下:
设定两个阈值:首先,需要设定两个阈值,分别是高阈值(High Threshold)和低阈值(Low Threshold)。这两个阈值的选择是根据具体应用而定的,通常高阈值设定为强边缘像素的阈值,低阈值设定为弱边缘像素的阈值。中间值可以根据需要进行调整。
像素分类:对梯度图像中的每个像素点进行分类:
a.如果像素的梯度幅值大于高阈值,则将其标记为强边缘像素。
b.如果像素的梯度幅值介于低阈值和高阈值之间,则将其标记为弱边缘像素。
c.如果像素的梯度幅值小于低阈值,则将其标记为非边缘像素。
边缘连接处理:在双阈值检测之后,强边缘像素被认为是最可能的边缘,而弱边缘像素可能是边缘的一部分,也可能是噪声。因此,接下来需要进行边缘连接处理,将弱边缘像素连接到强边缘像素,形成完整的边缘。
双阈值检测的作用是将梯度图像中的像素点进行分门别类,为后续的边缘连接处理提供依据。这种分类策略有助于过滤掉一些低梯度幅值的像素点,减少噪声对边缘检测结果的影响,并保留梯度幅值较大的像素点作为潜在的边缘点。

5.边缘跟踪与连接(Edge Tracking and Hysteresis)

边缘跟踪与连接是Canny边缘检测算法中的最后一步,它的目的是将弱边缘像素连接成强边缘,从而形成连续的边缘线。在Canny边缘检测的前几个步骤中,我们得到了两类边缘像素:强边缘像素和弱边缘像素。强边缘像素是那些梯度值超过高阈值的像素,而弱边缘像素是那些梯度值介于低阈值和高阈值之间的像素。边缘跟踪与连接的基本思想是从强边缘像素出发,沿着梯度方向追踪连接其周围的弱边缘像素,直到无法继续连接为止。这样就形成了一条连续的边缘线。

二、代码实现

# Canny 边缘检测
edges1 = cv2.Canny(image, threshold1=100, threshold2=200, apertureSize=3)
edges2 = cv2.Canny(image, threshold1=50, threshold2=100, apertureSize=3)
# 显示结果
cv2.imshow("Original Image", image)
cv2.imshow("Canny Edges1", edges1)
cv2.imshow("Canny Edges2", edges2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

threshold1 和 threshold2:两个阈值参数,用于控制边缘检测的灵敏度。如果图像梯度值高于 threshold2,则被认为是强边缘像素;如果图像梯度值低于 threshold1,则被认为是非边缘像素;介于这两个阈值之间的像素被认为是弱边缘像素。一般建议将 threshold1 设置为 threshold2 的一半到两倍之间。
当我们threshold1设置较小时 可以看到上图,出现的边缘就会更多。因为threshold1 控制了边缘检测的低阈值,如果一个像素的梯度值低于 threshold1,则被认为是非边缘像素,而高于 threshold1 的像素会被进一步检查。如果高于 threshold1 的像素的梯度值高于 threshold2,则被认为是强边缘像素;如果梯度值介于 threshold1 和 threshold2 之间,则被认为是弱边缘像素。
因此,当 threshold1 设置得较小时,更多的像素会被认为是弱边缘像素,进而会有更多的弱边缘像素被连接成边缘。这样就会导致检测到的边缘数量增加。但需要注意的是,设置过小的 threshold1 值可能会导致边缘检测结果中包含大量的噪声或无用的边缘,因此需要根据具体情况进行调整。

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

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

相关文章

6、Flume安装

按照采集通道规划,需在hadoop102,hadoop104两台节点分别部署一个Flume。可参照以下步骤先在hadoop102安装,然后再进行分发。 1. Flume安装部署 1.1 安装地址 (1) Flume官网地址:Welcome to Apache Flume…

COCI2016-2017#1 Kralj

目录 COCI2016-2017#1 Kralj题目描述背景输入输出数据范围 题解解法 打赏 COCI2016-2017#1 Kralj 题目描述 背景 精灵王将 n n n个精灵编号为 1 , ⋯ , n 1 , \cdots , n 1,⋯,n,矮人王将 n n n个矮人围成一个圆环,从某个矮人开始顺时针编号为 1 , ⋯…

Mysql高级篇(中)——SQL性能分析

Mysql高级篇(中)—— SQL性能分析 一、(了解)MySQL Query Optimizer 的主要功能和原理二、(了解)MySQL 常见瓶颈三、关键字 EXPLAIN1、是什么2、基本语法3、EXPLAIN 执行信息详解(1&#xff09…

Windows--linux共享文件夹

1、如果共享文件夹设置在Windows上面 文件夹设置 个人家里电脑通常不设置用户名密码 linux端mount命令行 mount -t cifs -o usernamewade,vers3.0 //192.168.0.143/openvswitch-2.17.10 /root/windows

计算机专业选题推荐-基于python的岗位兼职招聘平台【python-爬虫-大数据定制】

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的岗位兼职招聘平…

我的第3个AI项目-Advanced RAG with Gemma, Weaviate, and LlamaIndex

目录 一、项目简介概述时间kaggle地址(代码和详细注解)主要工作和收获技术栈数据集结果 二、bug修复在 Kaggle 使用模型时需要先同意该模型的使用条款使用 GPU 时显存不足把 Weaviate 从V3升级到V4改动一:创建client改动二:判断某…

网络编程day02(字节序、TCP编程)

目录 【1】字节序 1》大小端转换 2》端口转换 3》IP地址转换 主机字节序转换为网络字节序 (小端序->大端序) 网络字节序转换为主机字节序(大端序->小端序) 【2】TCP编程 1》流程 2》函数接口 1> socket 2> …

免费的 Mac 应用清理工具Pearcleaner v3.8.6

免费的 Mac 应用清理工具。这是一款免费开源的 Mac 应用清理工具,能够彻底卸载应用并清理残留文件。它采用 SwiftUI 开发,提供了简单易用的界面,支持右键卸载、迷你模式和 Homebrew 清理等功能。 下载链接:https://pan.quark.cn/s…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法:文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项,可以跟着下面路径把该选项调出来 :工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

BRAM IP Native模式使用

简介 BRAM(‌Block RAM)是‌FPGA(Field-Programmable Gate Array)中的一种专用RAM资源,固定分布在FPGA内部的特定位置。该内容主要对BRAM(Block RAM”的缩写)Native模式下IP界面做详细描述和使用…

C语言进阶版第9课—指针(3)

文章目录 1. 字符指针变量2. 数组指针变量3. 二维数组传参的本质4. 函数指针变量5. typedef关键字6. 函数指针数组7. 函数指针数组的应用—转移表 1. 字符指针变量 练习题 2. 数组指针变量 在学习数组指针前,我们先回忆一下什么是指针数组指针数组 → 存放指针的数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…