图像处理与计算机视觉--第五章-图像分割-Canny算子-程序员宅基地

技术标签: 计算机视觉  图像处理  人工智能  

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中有什么不明白的可以去他们俩个的专栏里面看看,内容非常全面,应该能够有比较好的解答。
在文章的最后再次表达由衷的感谢!!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_71819746/article/details/133516091

智能推荐

将Vue项目打包成一个HTML文件后是如此丝滑_babel vue转成html-程序员宅基地

文章浏览阅读8.3k次。最近碰到一个需求,需要将Vue项目在移动端运行测试,但一般Vue项目打包后都是不止一个文件,放到移动端测试哪受得了。先看看打包后的目录,把这个index.html发送到手机上就能独立运行整个项目接下来看我的vue配置文件vue.config.js:const path = require("path");function resolve(dir) { return path.join(__dirname, dir);}module.exports = { publi._babel vue转成html

JAVA设计模式(06):结构型-适配器模式(Adapter)_技软件公司在很久以前曾开发了一个算法库,里面包含了一些常用的算法,例如排序算法-程序员宅基地

文章浏览阅读5k次。我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容,如图1所示:图1 电源适配器示意图 在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之_技软件公司在很久以前曾开发了一个算法库,里面包含了一些常用的算法,例如排序算法

Python模拟MQTT v3.1.1服务器_python mqtt服务器-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏6次。配置文件通常位于 Mosquitto 安装目录的 \mosquitto\mosquitto.conf 或 \mosquitto\mosquitto.conf 文件中。重新运行代码:在完成以上步骤后,关闭并重新打开命令行窗口,然后再次运行你的代码,系统应该能够找到并启动mosquitto命令。将Mosquitto MQTT服务器软件的安装路径添加到系统的环境变量中,这样系统就能够找到mosquitto命令。在编辑窗口中,点击“新建”按钮,并将Mosquitto MQTT服务器软件的安装路径添加进去。_python mqtt服务器

1分钟搭建完成PalWorld(幻兽帕鲁)游戏服务器-程序员宅基地

文章浏览阅读864次,点赞20次,收藏25次。这游戏比较吃内存,所以内存尽量在16G以上(Pocketpair官方的推荐配置是4vCPU 16G),CPU选4vCPU即可,带宽方面推荐不限流量的固定带宽,延时低,畅玩体验更佳。在这里,阿里云的服务把大部分游戏需要的配置都帮你配好了,包括网络端口设置(UDP 协议访问 8211 端口)、游戏环境安装等,全程只要点击几下鼠标即可。2、在“新建批量管理软件任务”页面中,默认已选中“幻兽帕鲁”以及最新版本,只需要展开“选择实例”并选中要安装幻兽帕鲁的ECS实例即可。配置完成之后,点击下一步,确认提交订单。

AI论文速读 | ST-LoRA:低秩适配的时空预测-程序员宅基地

文章浏览阅读321次,点赞3次,收藏5次。时空预测在现实世界的动态系统中至关重要,它利用来自不同地点的历史数据来预测未来的变化。现有的方法通常优先考虑开发复杂的神经网络来捕获数据的复杂依赖性,但其准确性未能显示出持续的改进。此外,这些方法还忽视了节点的异构性,阻碍了定制预测模块有效处理不同的区域节点。本文目标不是提出一种新模型,而是提出一种新颖的低秩适配框架,作为现有时空预测模型的现成插件,称为ST-LoRA,它通过以下方式缓解上述问题: 节点级调整。具体来说,首先定制一个包含多个可训练低秩矩阵的节点自适配低秩层。

德州CC2640R2f蓝牙芯片学习笔记(三)ti_rto学习_cc2640r2frgzr 蓝牙例程-程序员宅基地

文章浏览阅读856次。目录前言:一、本系列文章由江山(csdn名:补不补布)(github:jianggogogo)自己写成,当中用到引用时都已经标记出来,如果出现版权问题,请直接联系我修改。当然,技术在于分享,欢迎大家转载,不过请注明出处。最后,如果出现有错误的地方欢迎大家指正。前言:本文基于谷雨cc2640r2f教程所编写,是一篇学习笔记。一、..._cc2640r2frgzr 蓝牙例程

随便推点

Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数_python3 getattr-程序员宅基地

文章浏览阅读434次。hasattr()函数hasattr()函数用于判断是否包含对应的属性语法:hasattr(object,name)参数:object–对象name–字符串,属性名返回值:如果对象有该属性返回True,否则返回False示例:class People: country='China' def __init__(self,name): self.name=name def people_info(self): print('%s is xxx' %_python3 getattr

python GDAL遥感影像创建缩略图_tif 生成缩略图-程序员宅基地

文章浏览阅读754次。利用Translate创建缩略图功能,指定缩略图宽度为1024,等比例缩放。_tif 生成缩略图

RIL/QCRIL架构及基本流程_芯片ril是啥-程序员宅基地

文章浏览阅读1.6k次。通过之前章节的讲述我们已经知道,libril属于Google原生的逻辑,MTK和高通公司都在使用这套原始逻辑,而libril的下层则是各个芯片厂商为了适配各自的芯片而自己开发的一套处理逻辑。QCRil则是高通公司为适配自己的modem芯片而开发的自己消息处理逻辑。里面主要是将请求消息、请求响应及主动上报消息封装成QMI消息进行传递。据高通的说法,使用qmi消息的机制可以传输效率更高,更稳定。_芯片ril是啥

基于Java图书管理系统的设计与实现 毕业设计开题报告_基于java的图书管理系统国外研究现状及分析-程序员宅基地

文章浏览阅读710次,点赞2次,收藏4次。基于Java图书管理系统的设计与实现 毕业设计开题报告,大学生本科专科专升本成人教育毕业设计毕设开题报告模板,研究背景与意义、国内外研究现状、、研究思路与方法、研究内客和创新点、后台功能需求分析和前端功能需求分析、研究思路与研究方法、可行性、研究进度安排、论文(设计)写作提纲、主要参考文献_基于java的图书管理系统国外研究现状及分析

一文带你了解webrtc基本原理(动手实现1v1视频通话)_webrtc的原理-程序员宅基地

文章浏览阅读3.5k次,点赞6次,收藏30次。webrtc (Web Real-Time Communications) 是一个实时通讯技术,也是实时音视频技术的标准和框架。大白话讲,webrtc是一个集大成的实时音视频技术集,包含了各种客户端api、音视频编/解码lib、流媒体传输协议、回声消除、安全传输等。对于开发者来说可以借助webrtc非常方便的实现低延时视频通话能力。现在主流的直播系统、会议系统基本都是基于webrtc来实现。..._webrtc的原理

QT实现客户端服务器HTTP(get请求、post请求)_qt实现http服务器-程序员宅基地

文章浏览阅读8k次,点赞10次,收藏96次。使用QT网络编程实现服务端和客户端的HTTP请求的PSOT、GET请求。_qt实现http服务器

推荐文章

热门文章

相关标签