图像处理与计算机视觉--第五章-图像分割-Canny算子

文章目录

    • 1.边缘检测算子分类
    • 2.Canny算子核心理论
      • 2.1.Canny算子简单介绍
      • 2.2.Canny算子边缘检测指标
      • 2.3.Canny算子基本原理
    • 3.Canny算子处理流程
      • 3.1.高斯滤波去噪声化
      • 3.2.图像梯度搜寻
      • 3.3.非极大值抑制处理
      • 3.4.双阈值边界处理
      • 3.5.边界滞后技术跟踪
      • 3.6.Canny算子边缘检测的特点
    • 4.Canny算子算法代码
    • 5.Canny算子效果展示
    • 6.参考文章及致谢

1.边缘检测算子分类

(1)一阶导数的边缘检测算子:通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子:依据于二阶导数过零点,常见的有Laplacian 算子,此类算子对噪声敏感。
(3)Canny算子:前面两类均是通过微分算子来检测图像边缘,还有一种就是Canny算子,其是在满足一定约束条件下推导出来的边缘检测最优化算子。

2.Canny算子核心理论

2.1.Canny算子简单介绍

Canny算子是一种非常常用的边缘检测算子,其效果图如下所示:
在这里插入图片描述

2.2.Canny算子边缘检测指标

Canny算子是基于边缘检测来实现的,那么边缘检测的指标如下所示:
(1)好的信噪比,即将非边缘点判定为边缘点的概率要低。
(2)高定位,检测出的边缘要在实际边缘中心。
(3)对单一边缘仅有唯一响应,即虚假边缘要能得到最大抑制。

2.3.Canny算子基本原理

1.2个条件:一能有效抑制噪声,二能精确定位边缘位置
2.平滑后求导,用高斯滤波器进行平滑
3.用一阶偏导有限差分计算梯度幅值与方向
3.对梯度幅值进行非极大值抑制
4.用双闯值检测与连接边缘

3.Canny算子处理流程

第三部分的内容引用自:https://blog.csdn.net/zaishuiyifangxym/article/details/90142702
我的工作就是通过其的blog来进行学习,这位博主的cv的专栏写的非常好。
如果大家这这篇blog中有什么不明白的可以去他的专栏里面看看,内容非常全面,应该能够有比较好的解答。

3.1.高斯滤波去噪声化

根据上述算法的第一个原理,我们需要对于图片影响进行去噪声化处理。
边缘检测容易受到噪声的影像。因此,在进行边缘检测前,通常需要进行去噪。通常,使用高斯滤波来去除噪声,高斯滤波去噪是比较常用的去噪函数合,其5x5的模板公式对应如下:
1 273 × [ 1 4 7 4 1 4 16 26 16 4 7 26 41 26 7 4 16 26 16 4 1 4 7 4 1 ] \frac{1}{273}\times\begin{bmatrix}1&4&7&4&1\\4&16&26&16&4\\7&26&41&26&7\\4&16&26&16&4\\1&4&7&4&1\end{bmatrix} 2731× 1474141626164726412674162616414741

在Opencv库当中,高斯滤波的函数如下所示:

img = cv2.GaussianBlur(src, ksize, sigmaX)
其中,参数:src 表示原始图像;ksize 表示核大小,而且ksize只能是奇数;sigmaX 表示X方向方差。

3.2.图像梯度搜寻

在这一部分的内容当中,我们需要去计算和找寻梯度幅值和方向,寻找图像的梯度。我们需要先将卷积模板分别作用x和y方向,再计算梯度幅值和方向,其公式如下所示:
卷积化 : d x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] d y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] 幅度 : S = d x 2 + d y 2 方向 : θ = arctan ⁡ ( d y d x ) \begin{aligned}卷积化:d_x&=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}\quad d_y=\begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}\\\\幅度:S&=\sqrt{d_x^2+d_y^2}\\\\ 方向:\theta&=\arctan(\frac{d_y}{d_x})\end{aligned} 卷积化:dx幅度:S方向:θ= 121000121 dy= 101202101 =dx2+dy2 =arctan(dxdy)
计算之后得到的幅度和方向如图所示:
              在这里插入图片描述

3.3.非极大值抑制处理

  对于每个像素点,它进行如下操作:应用非最大抑制技术来过滤掉非边缘像素,将模糊的边界变得清晰。该过程保留了每个像素点上梯度强度的极大值,过滤掉其他的值。

Step1:将其梯度方向近似为以下值中的一个,包括04590135180225270315,即表示上下左右和45度方向。
Step2:比较该像素点和其梯度正负方向的像素点的梯度强度,如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)。

Step1和Step2的处理方式如图所示:
在这里插入图片描述

3.4.双阈值边界处理

  双阈值边界处理的原理也比较简单,我们对非极大值抑制图像作用两个阈值 T l o w T_{low} Tlow T h i g h T_{high} Thigh。 把梯度值小于 T l o w T_{low} Tlow的像素的灰度值设为0,得到图像1。然后把梯度值大于 T h i g h T_{high} Thigh的像素的灰度值设为0,得到图像2。
 由于图像2的阈值值较高,去除大部分噪音,但同时也损失了有用的边缘信息。而图像1的阈值较低,保留了较多的信息,我们可以以图像2为基础,以图像1为补充来连结图像的边缘。
      在这里插入图片描述

3.5.边界滞后技术跟踪

边界滞后技术跟踪的方法研究来自:https://blog.csdn.net/qq_44736333/article/details/109152380

 我们假设两类边缘:经过非极大值抑制之后的边缘点中,梯度值超过T1的称为强边缘,梯度值小于T1大于T2的称为弱边缘,梯度小于T2的不是边缘。
 可以肯定的是,强边缘必然是边缘点,因此必须将T1设置的足够高,以要求像素点的梯度值足够大(变化足够剧烈),而弱边缘可能是边缘,也可能是噪声,如何判断呢?
 当弱边缘的周围8邻域有强边缘点存在时,就将该弱边缘点变成强边缘点,以此来实现对强边缘的补充。
 实际中人们发现T1:T2=2:1的比例效果比较好,其中T1可以人为指定,也可以设计算法来自适应的指定,比如定义梯度直方图的前30%的分界线为T1,我实现的是人为指定阈值。
在这里插入图片描述
 在上图中,白色方块代表存在边缘(包括强弱边缘),遍历弱边缘中的每个像素,如果像素的八邻域存在强边缘对应的像素,则将这个弱边缘像素归为真正的边缘(从视觉上来理解,就是存在一条不确定的边缘,如果这条不确定的边缘旁存在真正的边缘,则将这条边归为真边,非则就将其删除)

3.6.Canny算子边缘检测的特点

1.检出准则: 该准则要求不应丢失重要的边缘,而且不应输出噪声性的多余边缘。
2.定位准则: 该准则要求检测到的边缘位置与实际边缘位置之间的距离为最小。
3.单一响应准则: 该准则在一定程度上多涵盖为检出准则,它要求尽可能减少对于同一边缘出现多个响应的情况。

4.Canny算子算法代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号def All_Canny(img):grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#图像灰度化处理gaussian = cv2.GaussianBlur(grayImage, (5, 5), 0)# 高斯滤波降噪Canny = cv2.Canny(gaussian, 50, 150)# Canny算子return grayImage, gaussian,Canny# 读取图像
img = cv2.imread('lena.jpg')#imread出来的是BRG图像
lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#转化为RGB图像
# 显示图形
Figure=All_Canny(img)#获取Canny检测之后的图片#图像可视化处理
titles = [u'原始图像', u'灰度处理图',u'高斯去噪处理图', u'Canny算子c处理图']
images = [lenna_img ,Figure[0],Figure[1], Figure[2]]
#subplot绘制
#第一张图
plt.subplot(2, 2, 1)
plt.imshow(images[0], 'gray'),plt.title(titles[0])
plt.xticks([]),plt.yticks([])
#第二张图
plt.subplot(2, 2, 2)
plt.imshow(images[1], 'gray'),plt.title(titles[1])
plt.xticks([]),plt.yticks([])
#第三张图
plt.subplot(2, 2, 3)
plt.imshow(images[2], 'gray'),plt.title(titles[2])
plt.xticks([]),plt.yticks([])
#第四张图
plt.subplot(2, 2, 4)
plt.imshow(images[3], 'gray'),plt.title(titles[3])
plt.xticks([]),plt.yticks([])plt.savefig(r"D:\HuaweiMoveData\Users\27182\Desktop\py\Canny.png",dpi=1000)
plt.show()

5.Canny算子效果展示

在这里插入图片描述

6.参考文章及致谢

本章内容的完成离不开以下大佬文章的启发和帮助,在这里列出名单,如果对于内容还有不懂的,可以移步对应的文章进行进一步的理解分析。
1.Canny边缘检测算子流程:https://blog.csdn.net/zaishuiyifangxym/article/details/90142702
2.边界滞后技术跟踪算法:https://blog.csdn.net/qq_44736333/article/details/109152380
我的工作就是根据两位大佬的blog来进行学习,这两位博主的cv的专栏写的非常好。
如果大家这这篇blog中有什么不明白的可以去他们俩个的专栏里面看看,内容非常全面,应该能够有比较好的解答。
在文章的最后再次表达由衷的感谢!!

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

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

相关文章

MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍 MySQL索引(index)是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录,可以帮助数据库快速定位和访问特定数据,而无需扫描整个数据表。 索引的作用和缺点 1. 加快数据搜索:通过使用索引&…

Linux——指令初识

Linux下基本指令 前言一、 ls 指令二、 pwd命令三、cd 指令四、 touch指令五、mkdir指令六、rmdir指令 && rm 指令七、man指令八、cp指令九、mv指令十、cat指令十一、.more指令十二、less指令十三、head指令十四、tail指令总结 前言 linux的学习开始啦! 今…

我的创作纪念日-第1024天

文章目录 一、机缘二、收获三、日常四、憧憬 一、机缘 不知不觉,已经加入CSDN这个大家庭5年多了,回想起3年前发布第一篇博客的时候,那时我记得很清楚,我在做项目时遇到报错,解决问题之后,然后想起了好多人…

SpringCloud(二)Docker、Spring AMQP、ElasticSearch

文章目录 DockerDocker与虚拟机Docker架构镜像、容器、镜像托管平台Docker架构Docker实践 Spring AMQP简单使用案例工作队列- WorkQueue发布订阅服务FanoutExchangeDirectExchangeTopicExchange 消息转换器 ElasticSearch倒排索引IK分词器IK分词拓展与停用字典 操作索引库mappi…

c#基础逻辑练习案例

第二章综合练习小游戏 练习内容 向控制台输出“这是学号姓名的C#基础小游戏”。向控制台换行再输出“请输入你的游戏昵称:”。向控制台输入你的游戏昵称,赋给一个字符串变量。向控制台换行再输出“请输入你的性别:”。向控制台输入你的性别…

创建vue3工程

一、新建工程目录E:\vue\projectCode\npm-demo用Visual Studio Code 打开目录 二、点击新建文件夹按钮,新建vue3-01-core文件夹 三、右键vue3-01-core文件夹点击在集成终端中打开 四、初始化项目,输入npm init 一直敲回车直到创建成功如下图 npm init 五…

Spring5应用之Cglib动态代理

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言Cglib动态代理…

uCOSIII实时操作系统 二 同步与通信

目录 同步概念: 互斥概念: 临界区概念: 任务时间概念: 信号量概念: 互斥信号量概念: 事件标志组概念: 消息邮箱和消息梯队概念: 内存管理概念: 如何从裸机开发…

矢量图形编辑软件illustrator 2023 mac特点介绍

illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软件&am…

六、vpp 流表+负载均衡

草稿!!! vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能,比如这里的流表 今天我们再用VPP实现一个流表的功能 一、流表 1.1流表----plugin init VLIB_REGISTER_NODE 注册流表节点 // 注册流…

纯css实现3D鼠标跟随倾斜

老规矩先上图 为什么今天会想起来整这个呢?这是因为和我朋友吵架, 就是关于这个效果的,就是这个 卡片懸停毛玻璃效果, 我朋友认为纯css也能写, 我则坦言他就是在放狗屁,这种跟随鼠标的3D效果要怎么可能能用纯css写, 然后吵着吵着发现,欸,好像真能用css写哦,我以前还写过这种…

去雨去雪去雾数据集构建

在进行去雨去雪去雾算法的学习过程中,需要构建去雨去雪去雾数据集,本文参考Learning Multiple Adverse Weather Removal via Two-stage Knowledge Learning and Multi-contrastive Regularization: Toward a Unified Model论文中的数据集设定&#xff0c…

面试题 17.24. 最大子矩阵

链接: 面试题 17.24. 最大子矩阵 题解: 这样我们就将二维问题转化为了一维问题,现在另一个问题就是怎么把所有情况都遍历到呢? 我们以第i行为第一行,向下延申,设最后一行为第j行,我们就i在这么…

【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…

手机或者电脑连接局域网内的虚拟机(网桥)

手机或者电脑连接局域网内的虚拟机(网桥) 手机软件:ConnectBot,Termius,JuiceSSH … 1.虚拟机vmware中添加桥接网卡 这里桥接网卡选择的是自动,是自动生成动态IP,如果不需要动态生成&#xff…

MySQL:数据库的物理备份和恢复-冷备份(3)

介绍 物理备份: 直接复制数据文件进行的备份 优点:不需要其他的工具,直接复制就好,恢复直接复制备份文件即可 缺点:与存储引擎有关,跨平台能力较弱 逻辑备份: 从数据库中导出数据另存而进行的备…

性能测试工具 - LoadRunner

什么是性能测试? 性能测试就是测试人员利用性能测试工具模拟系统在不同情况下的性能指标是否正常。 性能测试工具 - LoadRunner 接下来介绍LoadRunner的作用和使用。 LoadRunner 就是一个很常见的性能测试工具,它有三个部分组成: 这三个组…

【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门

大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

Java实现微信支付

微信支付 小黄最在工作中对接需要对接微信支付,在此记录一下微信支付开发的相关流程,望能帮助到各位 前期准备 由于小黄是小程序端需要对接微信支付,需要注册小程序等,小黄会一一列举出来 小程序注册 所需文件 没有注册过微信…

私有云盘:lamp部署nextcloud+高可用集群

目录 一、实验准备: 二、配置mariadb主从复制 三台主机下载mariadb 1)主的操作 2)从的操作 3)测试数据是否同步 三、配置nfs让web服务挂载 1、安装 2、配置nfs服务器 3、配置web服务的httpd 4、测试 四、web 服务器 配…