Canny边缘检测

article/2025/9/23 19:40:12

Canny边缘检测实例

边缘检测发展

Canny 边缘检测是一种从不同视觉对象中提取有用结构信息并显着减少要处理的数据量的技术。它已广泛应用于各种计算机视觉系统。 Canny 发现,在不同的视觉系统上应用边缘检测的要求是比较相似的。因此,可以在各种情况下实施满足这些要求的边缘检测解决方案。边缘检测的一般标准包括:
1:以低错误率检测边缘,这意味着检测应准确捕捉图像中显示的尽可能多的边缘
2:从操作员处检测到的边缘点应准确定位在边缘的中心。
3:图像中的给定边缘应仅标记一次,并且在可能的情况下,图像噪声不应产生错误边缘。

Canny边缘检测的步骤

1:应用高斯滤波去平滑图像为了去除噪音的影响。
2:计算图像的x轴和y轴的梯度,并计算梯度的合方向
3:使用非极大值抑制,对那些伪边界点抑制
4:把min_max应用到上面得到的图像
5:通过滞后跟踪边缘:通过抑制所有其他弱且未连接到强边缘的边缘来完成边缘的检测。

高斯滤波

因为噪音的存在会轻易地影响到图像的边界,因此我们在进行边缘检测的开始要对图像进行平滑滤波,其中比较常用的滤波器就是高斯滤波,我们将其记做为 H H H,其尺寸是 ( 2 k + 1 , 2 k + 1 ) (2k+1,2k+1) (2k+1,2k+1)下面给出其表达式:
H i j = 1 2 π σ 2 e x p ( − ( i − ( k + 1 ) ) 2 + ( j − ( k + 1 ) ) 2 2 σ 2 1 < = i , j < = ( 2 k + 1 ) H_{ij} = \frac{1}{2\pi\sigma^2}exp(-\frac{(i-(k+1))^2+(j-(k+1))^2}{2\sigma^2} 1 <= i,j <= (2k+1) Hij=2πσ21exp(2σ2(i(k+1))2+(j(k+1))21<=i,j<=(2k+1)
举例给出一个当 k = 2 k= 2 k=2的矩阵 H H H:
H = 1 159 [ 2 4 5 4 2 4 9 12 9 2 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2 ] H = \frac{1}{159}\begin{bmatrix}2&4&5&4&2\\ 4&9&12&9&2\\5&12&15&12&5\\4&9&12&9&4\\2&4&5&4&2\end{bmatrix} H=1591245424912945121512549129422542
记我们的图像矩阵为 A A A,那么高斯滤波和我们图像做下面的卷积运算:
B = H ∗ A B = H * A B=HA
使用 H H H从左到右从上到下对原图像进行平滑处理。

计算图像的梯度大小和方向

首先给出计算梯度大小的公式:
G = G x 2 + G y 2 θ = a r c t a n ( G y G x ) G = \sqrt{G_x^2 + G_y^2} \\ \theta = arctan(\frac{G_y}{G_x}) G=Gx2+Gy2 θ=arctan(GxGy)
如下面的图像所示:虽然使用了arctan反三角函数,但是我们在这里却只使用了四个角度 0 。 , 4 5 。 , 9 0 。 , 13 5 。 0^。,45^。,90^。,135^。 04590135算出来的梯度距离那个方向近,我们就将其归为哪一类。例如:当 θ ∈ [ 0 , 22.5 ] o r [ 157.5 , 180 ] \theta \in[0,22.5] or [157.5,180] θ[0,22.5]or[157.5,180]时,我们将其映射到 0 。 0^。 0
如下面的图示:
在这里插入图片描述

非极大值抑制

在一些实施方式中,算法将连续梯度方向分类为一小组离散方向,然后在前一步的输出(即,边缘强度和梯度方向)上移动3×3滤波器。在每个像素时,如果其幅度不大于梯度方向上的两个邻居的大小,则抑制中心像素的边缘强度(通过将其值设置为0)。例如:
1:如果中心点梯度角度为0°(即边缘处于南北方向),如果其梯度幅度大于东部和西部方向上的像素的大小,则认为该点将被认为是在边缘上。
2:如果圆角梯度角度为90°(即边缘在东西方向上),如果其梯度幅度大于北部和南方方向的像素的大小,则将视线视为边缘。
3:如果圆角梯度角度为135°(即边缘处于东北 - 西南方向),如果其梯度大小大于西北部和东南部的像素处的大小,则将视线视为在边缘上方向,
4:如果圆角梯度角度为45°(即边缘处于西北部 - 东南方向),如果其梯度幅度大于东北和西南西北部的像素的大小,则视线被认为是在边缘上方向。
在这里插入图片描述
做一个试例:对于中心点A来说,其梯度角度为0,此时对其左右的两个点的梯度大小进行比较,如果该点的梯度大小大于其他两个,那么A点的梯度大小得以保留,否则将大小其抑制,设置为0。

双阈值

在这里插入图片描述
在施加非最大抑制之后,剩余的边缘像素在图像中提供了更准确的真实边缘的表示。然而,一些边缘像素仍然是由噪声和颜色变化引起的。为了解释这些杂散的响应,必须用弱梯度值滤除边缘像素,并具有高梯度值的边缘像素。这是通过选择高阈值和低阈值来实现的。如果边缘像素的梯度值高于高阈值,则标记为强边像素。如果边缘像素的梯度值小于高阈值并且大于低阈值,则标记为弱边缘像素。如果边缘像素的梯度值小于低阈值,则将抑制它。经验确定了两个阈值,并且它们的定义取决于给定输入图像的内容。

边缘跟踪滞后

到目前为止,强边像素肯定应该参与最终边缘图像,因为它们从图像中的真实边缘提取。但是,将有一些关于弱边缘像素的争论,因为这些像素可以从真正的边缘或噪声/颜色变化中提取。为了实现准确的结果,应拆除由后一种原因引起的弱边缘。通常,由真正边缘引起的弱边缘像素将连接到强边像素,而噪声响应是未连接的。要跟踪边缘连接,通过查看弱边缘像素及其8个连接的邻域像素来应用BLOB分析。只要有一个涉及BLOB的一个强边像素,可以将弱边缘点识别为应保留的。

opencv实现canny边缘检测

import cv2
import matplotlib.pyplot as plt
import numpy as np#cv2.canny(img, min_val. max_val, kernal_size, L2gradient=False(default))
img = cv2.imread('orginal.JPG', 0)
image = cv2.Canny(img, 100, 200, 5)
#print(img.dtype)
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.axis('off')
plt.xticks([])
plt.yticks([])
plt.title('orginal image')plt.subplot(122)
plt.imshow(image, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.axis('off')
plt.title('Caany dection')plt.show()
new = np.concatenate((img, image), axis=1)
cv2.imwrite('combined.jpg', new)

在这里插入图片描述

结语

上文的认识大多来自于维基百科,还有一些内容没有写的,如果有哪些不足或者错误的地方还请各位uu前来指正。
有关canny的详细内容可阅读https://en.wikipedia.org/wiki/Canny_edge_detector


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

相关文章

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

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

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

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

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

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

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

自连接&#xff1a;将一张表看作两张表 练习&#xff1a;查询员工id&#xff0c;员工姓名及其管理者的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 关键字从左表&#xff08;table1&#xff09;返回所有的行&#xff0c;即使右表&#xff08;table2&#xff09;中没有匹配。如果右表中没有匹配&#xff0c;则结果为 NULL。 SQL LEFT JOIN 语法: SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.c…

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

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

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

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

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

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

MySQL之左外连接右外连接

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

秒懂sql中的左外连接

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

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

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

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

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

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

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

左连接,右链接

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

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

全外连接是左外连接和右外连接的结合。 左外连接和右外连接的区别如下&#xff1a; 1、数据集合上的区别 &#xff08;1&#xff09;左外连接&#xff1a;是A与B的交集&#xff0c;然后连接A的所有数据。 &#xff08;2&#xff09;右外连接&#xff1a;是A与B的交集&#xff…

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

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

左连接、右连接、内连接、外连接

一.外连接 外连接分三类&#xff1a;左外连接&#xff08;LEFT OUTER JOIN&#xff09;、右外连接&#xff08;RIGHT OUTER JOIN&#xff09;和全外连接&#xff08;FULL OUTER JOIN&#xff09;。 1.左外连接 左连接 left join 是left outer join的简写&#xff0c;left j…

左外连接和右外连接的含义及区别,举例说明

左连接的含义是限制表2中的数据必须满足连接条件&#xff0c;而不管表1中的数据是否满足连接条件&#xff0c;均输出表1的内容。 右连接的含义是限制表1中的数据必须满足连接条件&#xff0c;而不管表2中的数据是否满足连接条件&#xff0c;均输出表2的内容。 创建表格A1,B1,…

外连接(左连接和右连接)

介绍&#xff1a; 1.内连接&#xff1a;两张表没有主次关系&#xff1b;外连接&#xff1a;两张表产生了主次关系 2.带有right的是右外连接&#xff0c;又叫右连接&#xff1b;带有left的是左外连接&#xff0c;又叫左连接 3.任何一个左连接都有右连接的写法&#xff0c;任何…

图解MySQL 内连接、外连接、左连接、右连接、全连接……太多了

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