Canny边缘检测算法

news/2024/10/5 9:21:51

一、概念

Canny算法是一种经典的图像处理算法,用于图像中的边缘检测,其实现的步骤包括:

  1. 高斯滤波
  2. 计算梯度和方向:对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数,然后计算该点的梯度大小和方向;
  3. 非极大值抑制:对梯度图上的每个像素,根据其梯度方向,确定在该方向上的两个相邻像素,然后检查当前像素的梯度幅度与其相邻像素的梯度比较,如果当前像素的梯度幅度大于两个相邻像素的梯度幅度,说明当前像素是局部梯度的最大值,需要保留该像素,反之,则将其值设为零;
  4. 滞后阈值:设置minVal和maxVal两个阈值(建议使用2:1到3:1的上/下比例),当图像的灰度梯度高于maxVal时被认为是真的边界,那些低于minVal的边界会被抛弃,如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是则抛弃。

二、算法接口介绍

2.1 接口1

void cv::Canny	(InputArray dx,
InputArray dy,
OutputArray edges,
double threshold1,
double threshold2,
bool L2gradient = false 
)
/*
InputArray dx:16位在x方向的梯度图像,一般通过Sobel算子计算得到
InputArray dy:16位在y方向的梯度图像,一般通过Sobel算子计算得到
OutputArray edges:单通道8位输出图像,与输入的尺寸一致,其中边缘像素值为255(白色),非边缘像素值为0(黑色)。
double threshold1:低阈值
double threshold2:高阈值
bool L2gradient:是否使用L2范数,默认为false,使用L1范数 
*/	

2.2 接口2

void cv::Canny	(InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool L2gradient = false 
)	/*
InputArray image:8位的输入图像
OutputArray edges:单通道8位输出图像,与输入的尺寸一致,其中边缘像素值为255(白色),非边缘像素值为0(黑色)。
double threshold1:低阈值
double threshold2:高阈值
int apertureSize:Sobel算子的大小,默认为3
bool L2gradient:是否使用L2范数,默认为false,使用L1范数 
*/

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

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

相关文章

【数据库】mybatis生成java代码之AutoGenerator配置

哈喽,大家好,我是木头左,AI改变生活!本文将详细解释 MyBatis 生成 Java 代码的过程,包括全局配置、数据源配置和策略配置。 1. 全局配置 首先,我们需要创建一个 GlobalConfig 对象,用于配置 MyBatis 的全局设置。以下是一些常用的全局配置选项:setOutputDir(String out…

ESP32学习笔记:NVS分区永久保存数据

程序示例: /*ESP32 startup counter example with Preferences library.This simple example demonstrates using the Preferences library to store how many times the ESP32 module has booted. The Preferences library is a wrapper around the Non-volatile storage on …

Wireshark基础教程

Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括: 1、Wireshark软件下载和安装以及Wireshark主界面介绍。 2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析…

SQL 数据库学习 Part 1

数据和信息 信息 信息是客观存在的,是关于现实世界事物的存在方式或运动状态 数据 数据是用来记录信息的可识别的符号,是信息的具体表现形式 数据和信息的联系数据是信息的符号表示或载体 信息则是数据的内涵,是对数据的语义解释数据库 定义 数据库是长期存储在计算机内、有…

1_JAVA线程

Java 线程 1. 创建和运行线程 1.1 直接使用 Thread 例如: public class ThreadTest {public static void main(String[] args) {Thread t = new Thread() {public void run(){// 要执行的任务System.out.println(Thread.currentThread().getName()+" Running");}};/…

Go变量作用域精讲及代码实战

关注作者,复旦AI博士,分享AI领域与云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕博,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,项目管理专业人士,上…

C# JavaScriptSerializer序列化时的时间处理详解

原文链接:https://www.jb51.net/article/122143.htm输出如下图所示: 猜测这里是由于js初始化时间的时候往往是向 1970/01/01 添加毫秒数,JavaScriptSerializer进行序列化的时候也会格式化为距离1970/01/01 到当该时间点GMT+0 时间的毫秒数, 如果直接反序列化可以看到少了8…

人工智能ChatGPT的多种应用:如何更好地提问

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中,沟通本来就是很重要的一门课程,沟通的过程中表达的越清晰,给到的信息越多,那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理,如果想要 ChatGPT 给到的信息越准确,越清晰,和它的沟通就至关重…