(十一)Canny 边缘检测算法

article/2025/9/23 19:20:10

Canny边缘检测算法

一、边缘检测的步骤

1)滤波: 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,
因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波、均值滤波等。
2)增强: 增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域
强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。一般用sobel算子
3)检测: 经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些
点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用
的方法是通过阈值化方法来检测。细化边缘(找到真正的边缘)

二、最优边缘定义

Canny是目前最优秀的边缘检测算法,其目标为找到一个最优的边缘,其最优边缘的定义为:
1、好的检测:算法能够尽可能的标出图像中的实际边缘
2、好的定位:标识出的边缘要与实际图像中的边缘尽可能接近
3、最小响应:图像中的边缘只能标记一次

三、Canny边缘检测算法步骤

1. 对图像进行灰度化
2. 对图像进行高斯滤波
3. 计算梯度幅值和方向(如使用Prewitt,Sobel算子等)
4 对梯度幅值进行非极大值抑制
5 用双阈值算法检测和连接边缘

1、 对图像进行灰度化:

方法1:Gray=(R+G+B)/3;
方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)
在这里插入图片描述

2、 对图像进行高斯滤波:

根据待滤波的像素点及其邻域点的灰度值按照一定的参数规则进行加权平均。这样
可以有效滤去理想图像中叠加的高频噪声。

1、高斯平滑

高斯平滑水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重,相比于均值滤波
而言,有着更好的平滑效果。其中 (x, y) 为坐标,σ 为标准差:

在这里插入图片描述进行高斯滤波之前,需要先得到一个高斯滤波器(kernel)。如何得到一个高斯滤波器?其实就是将高斯函数离散化,将滤波器中对应的横纵坐标索引代入高斯函数,即可得到对应的值。不同尺寸的滤波器,得到的值也不同,下面是 (2k+1)x(2k+1) 滤波器的计算公式 :
在这里插入图片描述

5x5的卷积核 k=2

重要的是需要理解,高斯卷积核大小的选择将影响Canny检测器的性能:
尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。(原因是对噪声不敏感的同时也对边缘不太敏感了,这使得后面的边缘检测器检测不到边缘)一般5x5是一个比较不错的trade off。
在这里插入图片描述在这里插入图片描述

3.计算梯度幅值和方向(如使用Prewitt,Sobel算子等)

可选用的模板:soble算子、Prewitt算子、Roberts模板等等;
一般采用soble算子,OpenCV API用的也是soble算子 ,利用soble水平和垂直算子与输入图像卷积计算dx、dy:
在这里插入图片描述

进一步可以得到图像在点(x,y)处梯度的幅值:
在这里插入图片描述
为了简化计算,图像在点(x,y)处梯度的幅值也可以作如下近似:
在这里插入图片描述
图像在点(x,y)处梯度的方向为:
在这里插入图片描述
如下图表示了中心点(x,y)的梯度向量、梯度方向角θ以及边缘方向(任一点的边缘与梯度向量正交) :
在这里插入图片描述在这里插入图片描述

4、根据梯度方向角对梯度幅值进行非极大值抑制

非极大值抑制(Non-Maximum Suppression,NMS): 顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。
理解: 保留局部最大值,抑制非局部最大值的所有值

1、Canny中的非极大值抑制

重点:Canny中的非极大值抑制是沿着梯度方向对幅值进行非极大值抑制,而非边缘方向。

思想:
1)、计算当前点的梯度方向,并在梯度方向连线与邻域交点进行插值(使用梯度值插值而非像素值),获得dTmp1,和dTmp2
其中,dTmp1用g1与g2进行插值,dTmp2用g8与g9进行插值,即使用与交点相邻的两个像素点的 梯度值 进行插值。其中,g1、g2、…、g9表示该点的梯度强度,是梯度幅值。
其他三种情况同理,根据 梯度方向 的不同选择不同点的梯度值进行插值

在这里插入图片描述

单线性插值原理如下:

在这里插入图片描述单线性插值化简可得: y =(y1-y0) * [(x-x0)/(x1-x0)] + x0
2) 将当前像素的梯度强度与沿正负梯度方向上的两个梯度插值点dTm1和dTm2进行比较。
3) 如果当前像素的梯度强度与dTm1和dTm2的梯度强度相比是最大的,则该像素点的梯度值保留,作为边缘点,否则该像素点的的梯度值将被抑制(的梯度值置为0)。这样可以抑制非极大值,保留局部梯度最大的点的的梯度值,以得到细化的边缘。
在这里插入图片描述

5、用双阈值算法检测和连接边缘

还要进行双阈值处理的原因:

完成非极大值抑制后,会得到一个以梯度局部极小值构成的图像,在图像上显示的就是有许多离散的点点,因此要把真正是边缘的点连接起来,同时去除孤立的噪声点。

思想:

•人工给定两个阈值,一个是低阈值TL,一个高阈值TH,
• 如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素,该位置的像素值置255;
•如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;
• 如果边缘像素的梯度值小于低阈值,则会被抑制,该位置的像素值置0。

双阈值检测:

大于高阈值为强边缘,小于低阈值不是边缘。介于中间是弱边缘。
阈值的选择取决于给定输入图像的内容。

算法步骤:

1、选取系数TH和TL,比率为2:1或3:1。(一般取TH=0.3或0.2,TL=0.1);
2、将小于低阈值的点抛弃,赋0;将大于高阈值的点立即标记(这些点为确定边缘点),赋1或255;
3、将小于高阈值,大于低阈值的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋1或255)具体的,当强边缘的8邻域内有弱边缘像素,则将如边缘像素变成强边缘,赋值1或255,或者反过来理解,只要弱边缘的8邻域内有强边缘,则如边缘变成强边缘,赋值1或255

在这里插入图片描述


http://chatgpt.dhexx.cn/article/BKFfwMPe.shtml

相关文章

Canny边缘检测算法的实现

图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。我们知道微分运算是求信号的变化率,具有加强高频分量的作用。在空域运算中来说,对图像的锐化就是计算微分。由于数字图像的离散信号,微分运…

【canny边缘检测】canny边缘检测原理及代码详解

文章目录 前言canny边缘检测算法主要流程一、高斯模糊二、图像梯度计算三、非极大值抑制四、双阈值边界跟踪 前言 本文通过介绍canny边缘检测原理与代码解析,希望能让大家深入理解canny边缘检测 canny边缘检测算法主要流程 canny边缘检测主要分为4个部分&#xff…

Canny边缘检测原理

一. Canny基本思想 1. 边缘检测 解析:边缘是对象和背景之间的边界,还能表示重叠对象之间的边界。边缘检测是图像分割的一部分,图像分割的目的是识别出图像中的区域。边缘检测是定位边缘像素的过程,而边缘增强是增加边缘和背景之…

Canny边缘检测

边缘检测发展 Canny 边缘检测是一种从不同视觉对象中提取有用结构信息并显着减少要处理的数据量的技术。它已广泛应用于各种计算机视觉系统。 Canny 发现,在不同的视觉系统上应用边缘检测的要求是比较相似的。因此,可以在各种情况下实施满足这些要求的边…

Canny边缘检测算法(python 实现)

文章目录 最优边缘准则算法实现步骤1. 应用高斯滤波来平滑(模糊)图像,目的是去除噪声2. 计算梯度强度和方向3. 应用非最大抑制技术NMS来消除边误检4. 应用双阈值的方法来决定可能的(潜在的)边界5. 利用滞后技术来跟踪边界 opencv实现Canny边缘…

左外连接和右外连接是什么样的?

1左外连接 左表的记录都会出现在结果集中,并上右表与之对应的部分,如果右表没有,使用null填充。 举例。 select * from people p left join role r p.idr.id 左外连接结果: 2、右外连接 右表的记录都会出现在结果集中&#xf…

sql左外连接和右外连接的区别

一、数据集合不同 1、左外连接:是A和B的交集再并上A的所有数据。 2、右外连接:是A和B的交集再并上B的所有数据。 二、语法不同 1、左外连接:SELECT *FROM aLEFT OUTER JOIN bON a.ageId b.id。 2、右外连接:SELECT *FROM a…

MySQL自连接和内连接和外连接_左外连接+右外连接

自连接:将一张表看作两张表 练习:查询员工id,员工姓名及其管理者的id和姓名select emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name from employees emp,employees mgr where emp.manager_id mgr.employee_id;内连接 只是把左…

SQL--左外连接(LEFT JOIN)

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。 SQL LEFT JOIN 语法: SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.c…

内连接、左连接、左外连接、右连接的区别

一:测试例子 存在如下两张表:年级与班级,表内容如下 班级表 二:内连接与自然连接 1:自然连接 对于select * from gradeclass gc where gc.grade_id in (select id from grade),其结果如下图 其查询是把符…

数据库之SQL(基本连接,内连接,左外连接,右外连接,全外连接,交叉连接,自连接)

之前的博客内容我们分享了数据表的查询与管理,但那只是针对数据库中的一个表格进行的查询管理,现在如果我们想要同时看到两个数据表中的数据的话,那要怎么办呢?采用多连接查询的方式。 SQL中有哪几种多连接的方式? 有七…

左连接、右连接、内连接、外连接简单说明

例如有两个表: test1: test2: 内连接:(inner join on)返回两个表的交集。 例如: select * from test1 a inner join test2 b on a.idb.id; 结果: 外连接:返回两个表的并集。(在此就不做截图…

MySQL之左外连接右外连接

外连接: 假设A和B表进行连接,使用外连接的话, AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表, 当副表中的数据没有和主表中的数据匹配上,副表自动模…

秒懂sql中的左外连接

左外连接: 1.语法: SELECT 查询字段 FROM 查询表格(左表) LEFT JOIN 右表 ON 查询条件 2.左外连接查询的就是左表,那干嘛加个右表,岂不是没有作用: 区别在于左外连接是查询完左表后&…

sql的四种连接——左外连接、右外连接、内连接、全连接

一、内连接 满足条件的记录才会出现在结果集中。 二、 左外连接(left outer join,outer可省略) 左表全部出现在结果集中,若右表无对应记录,则相应字段为NULL 举例说明: 客户表: 订单表&#x…

数据库的内连接、外连接(左外连接、右外连接、全外连接)以及交叉连接

SQL数据库的连接:内连接、和外连接(左外连接、右外连接、和全连接) 本次实验在MySQL数据库中进行,数据库初始表如下: 一、内连接:结果仅包含符合连接条件的两表中的行。如下: 二、外连接&#…

oracle左外连接、右外连接、完全外连接以及(+)号用法

准备工作 oracle连接分为: 左外连接:左表不加限制,保留左表的数据,匹配右表,右表没有匹配到的行中的列显示为null。右外连接:右表不加限制,保留右表的数据。匹配左表,左表没有匹配到…

左连接,右链接

用两个表(a_table、b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接、外连接( 左(外)连接、右(外)连接、全(外)连接)。 MySQL版本:Server version: 5.6.31 MySQL Community Server (…

全外连接、左外连接和右外连接区别(含举例)

全外连接是左外连接和右外连接的结合。 左外连接和右外连接的区别如下: 1、数据集合上的区别 (1)左外连接:是A与B的交集,然后连接A的所有数据。 (2)右外连接:是A与B的交集&#xff…

连接查询之外连接(左外链接和右外连接)

内连接: 假设A表和B表进行连接查询,使用内连接的话,凡是A表和B表能够匹配上的记录被查询出来,这就是内连接。A、B两张表没有主副之分,两张表是平等的。 外连接: 假设A表和B表进行连接查询,使用…