第10章:Canny图像边缘检测

第10章:Canny图像边缘检测

    • 一、Canny边缘检测的基础:
      • 1. 应用高斯滤波去除图像噪声:
      • 2. 计算梯度
      • 3.非极大值抑制
      • 4. 应用双阈值确定边缘:
    • 二、Canny函数使用:

​ Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。1986年,John F.Canny发表了著名论文A Computational Approach to Approach to Edge Detection,在该论文中详述了如何进行边缘检测。

OpenCV中提供了函数cv2.Canny()来实现Canny边缘检测。

一、Canny边缘检测的基础:

Canny边缘检测主要分为如下步骤:

  • 步骤一:去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
  • 步骤二:计算梯度的幅度和方向。
  • 步骤三:非极大值抑制,即适当的让边缘变瘦。
  • 步骤四:确定边缘。使用双阈值算法确定最终的边缘信息。

下面对上诉步骤进行简单介绍:

1. 应用高斯滤波去除图像噪声:

​ 由于图像的边缘非常容易受到噪声的干扰,为了避免检测到错误的边缘信息,通常需要对图像进行滤波以去除噪声。滤波的目的是对一些纹理较弱的非边缘区域进行平滑处理,以便得到更准确的边缘, 避免将其判断为边缘。在实际处理中,通常会使用高斯滤波去除图像中的噪声。

image-20211102155727078

上图演示了使用高斯滤波器T对原始图像O中像数值为226的像素点进行滤波,得到该点在滤波结果图像内D的值。

​ 在滤波过程中,我们通过滤波器对象像素点周围的像素进行加权平均值计算,获取最终滤波结果。对于高斯滤波器T,越临近中心的点,权重值越大。对图像O中像素值为226的像素点,使用滤波器T进行滤波的计算过程及结果为:

image-20211102160004938

高斯滤波器(高斯核)并不是固定的,例如,它还可以是:

image-20211102160038258

​ 滤波器的大小也是可变的,高斯核的大小对于边缘检测的效果具有很重要的作用。滤波器的核越大,边缘信息对于噪声的敏感度就越低。不过,核越大,边缘检测的定位错误也会随之增加。通常来说,一个5×5的核能够满足大多数的情况。

2. 计算梯度

​ 在前面的图像梯度中,介绍了如何计算图像梯度的幅度。在这里,我们关注梯度的方向,梯度的方向与边缘的方向是垂直的。(梯度方向垂直于边缘)

image-20211102160207612

边缘检测算子返回水平方向的Gx和垂直方向上的Gy。梯度的幅度G和方向θ(用角度值表示)为:

image-20211102160403963

式中,atan2(•)表示具有两个参数的arctan函数。

​ 梯度的方向总与边缘垂直,通常就近取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)等8个不同方向。

​ 因此,在计算梯度时,我们会得到梯度的幅度和角度(代表梯度的方向)两个值。

下面展示梯度的表示法。其中,每一个梯度都包含幅度和方向两个不同的值。为了方便观察,这里使用了可视化表示方法。例如,左上角顶点的值"2↑",实际上表示的是一个二元数对"(2, 90)",表示梯队的幅度为2,角度为90°

image-20211102160526612

3.非极大值抑制

​ 在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。在具体实现时,逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并且根据判断结果决定是否抑制该点。通过以上描述可知,该步骤是边缘细化的过程。针对每一个像素点:

  • 如果该点是正/负梯度方向上的局部最大值,则保留该点。
  • 如果不是,则抑制该点(归零)

在下图中,A、B、C三点具有相同的方向(梯度方向垂直与边缘) 。判断这三个点是否为各自的局部最大值:如果是,则保留该点;否则,抑制该点(归零)。

image-20211102160711241

​ 经过比较判断可知A点具有最大的局部值,所以保留A点(称为边缘),其余两点(B和C)被抑制(归零)

​ 在下图中,黑色背景的点都是向上方向梯度(水平边缘)的局部最大值。因此,这些点会被保留;其余点会被抑制(处理为0)。这意味着,这些黑色背景的点最终被处理为边缘点,而其他点都被处理为非边缘点。

image-20211102160932347

​ "正\负梯度方向上"是指相反方向的梯度方向。例如,在上图中,黑色背景的像素点都是垂直方向梯度(向上或向下)方向上(即水平边缘)的局部最大值。这些点最终会被处理为边缘点。

​ 经过上述处理后,对于同一个方向的若干个边缘点,基本上仅保留了一个,因此实现了边缘细化的目的。

4. 应用双阈值确定边缘:

​ 完成上述步骤后,我们得到的目标边缘图像内已经可以获取到图像的强边缘。但是,一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的,也可能是由于噪声所产生的。对于后者,我们必须将其剔除。

​ 设置两个阈值,其中一个为高阈值maxVal,一个为低阈值minVal。根据当前边缘像素的梯度值(指的是梯度幅度,下同)与这两个阈值之间的关系,判断边缘的属性。具体步骤为:

  • 如果当前边缘像素的梯度值大于或等于maxVal,则将当前边缘像素标记为强边缘。
  • 如果当前边缘像素的梯度值介于maxVal与minVal之间,则将当前边缘像素标记为虚边缘(需要保留)
  • 如果当前边缘像素的梯度值小于或等于minVal,则抑制当前边缘像素。

在上述过程中,我们得到了虚边缘,需要对其做进一步处理。一般通过判断虚边缘与强边缘是否连接,来确定虚边缘到底属于哪种情况。通常情况下,如果一个虚边缘:

  • 与强边缘连接,则将该边缘处理为边缘。
  • 与强边缘无连接,则将该边缘处理为弱边缘,将其抑制。

在下图中,左图显示的是三个边缘信息,右图是对边缘信息进行分类的示意图,具体划分如下:

  • A点的梯度值大于maxVal,因此A是强边缘。
  • B和C点的梯度值介于maxVal和maxVal之间,因此B、C是虚边缘。
  • D点的梯度值小于minVal,因此D被抑制(抛弃 )

image-20211102161547147

对于虚边缘B和C的处理:

  • B点的梯度值介于maxVal和minVal之间,是虚边缘,但该点与强边缘不相连,故将其抛弃。
  • C点的梯度值介于maxVal和minVal之间,是虚边缘,但该点与强边缘A相连,故将其保留。

image-20211102161705258

注意: 高阈值maxVal和低阈值minVal不是固定的,需要针对不同的图像进行定义。

二、Canny函数使用:

OpenCV提供了函数cv2.Canny()来实现Canny边缘检测,其语法如下:

edges = cv2.Canny(image, threshold1, threshold2[, spertureSize[, L2gradient]])

  • edges:计算得到的边缘图像

  • image:输入的8位图像

  • threshold1:表示处理过程中的第一个阈值

  • threshold2:表示处理过程中的第二个阈值

  • apertureSize:表示Sobel算子的孔径大小

  • L2gradient:为计算图像梯度幅度的标识(gradient magnitude)的标识。其默认值为False。如果为True,则使用更精准的L2范数进行计算(即两个方向的导数的平方和再开方),否者使用L1范数(直接将两个方向导数的绝对值相加)

    image-20211102162050473

示例:

import cv2img = cv2.imread('../boat.512.tiff')
rst1 = cv2.Canny(img, 120, 200)
rst2 = cv2.Canny(img, 32, 128)
cv2.imshow('img', img)
cv2.imshow('rst1', rst1)
cv2.imshow('rst2', rst2)
cv2.waitKey()
cv2.destroyAllWindows()

image-20211102162538397

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派学习笔记】六、启用摄像头、实时视频、录像和截图

目录安装摄像头配置使用luvcview平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf 安装摄像头 配置 sudo raspi-config重启后 cd /dev ls可看到新增了video0设备 使用luvcview 安装 sudo apt-get install luvcview查看摄像设备详细信息 luv…

Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 详解

2019独角兽企业重金招聘Python工程师标准>>> VGA:Video Graphics Array,即:显示绘图矩阵,相当于640480 像素;HVGA:Half-size VGA,即:VGA的一半,分辨率为48032…

敏捷合同-摘自网络

敏捷软件开发实践的文化中存在着一个断层,该断层同样体现在许多敏捷团队中。这个断层就是业务分析人员在敏捷项目中的角色——谁来担任这个角色?它的作用 和价值是什么?它又是如何发生改变的?这种情况的潜台词(其实我曾…

第11章:图像金字塔

第11章:图像金字塔一、理论基础:1. 向下采样:2. 向上采样:二、pyrDown函数使用:三、pyrUp函数及使用:四、采样可逆性研究五、拉普拉斯金字塔1. 定义:2. 应用:什么是图像金子塔&#…

【树莓派学习笔记】七、(免费)内网穿透将树莓派作为服务器管理网站

目录nginx安装开机自启动测试查看nginx安装路径查看配置文件路径(测试用)修改index.nginx-debian.html内网穿透免费方案ngrok原版方案下载ngrok连接账户开启内网穿透httpSSH网云穿方案开通隧道下载开启内网穿透开机自启动花生壳方案下载和安装添加内网穿透映射测试平台&#xf…

第12章:图像轮廓

第12章:图像轮廓一、查找并绘制轮廓:1. 查找图像轮廓:2. 绘制图像轮廓:3. 绘制轮廓实例:二、矩特征1. 矩的计算:moments函数2. 计算轮廓面积:contourArea函数3. 计算轮廓长度:arcLen…

【树莓派学习笔记】八、两步安装VS Code (Visual Studio Code)

目录下载安装使用(可选)安装插件C/CCMake ToolsCode Runner平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf 下载 官网下载 Download Visual Studio Code 发送到树莓派 安装 sudo dpkg -i Desktop/code_1.60.2-1632316275_armhf.deb 使用 在…

20 best jquery 截图

digguka, January 05, 2012jQuery Image Crop - A very useful list of tools for cropping, zooming and resizing of images. Some of plugins come with the ability to upload croped images. 转载于:https://www.cnblogs.com/yqskj/archive/2013/05/25/3098411.html

【RK3399Pro学习笔记】一、Thinker Edge R 安装系统和VNC服务

目录下载固件安装USB驱动下载烧录工具刷机第一次开机连接WifiSSH登录换源设置语言安装VNC服务平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 风火轮论坛资料网盘 提取码:wqbd 下载固件…

第13章:直方图处理

第13章:直方图处理一、直方图的含义:1. 普通直方图:2. 归一化直方图:二、绘制直方图:1. 使用Numpy绘制直方图:2. 使用OpenCV绘制直方图:3. 使用掩码绘制直方图:三、直方图均衡化&…

操作系统 内存管理篇

一.程序的装入和链接 装入方式: 链接方式: 二.进程的内存映像 三.内存的分配 1.连续分配 分配方式: 2.不连续分配 分页:页面大小一致 引入快表(和 cache 处理思路一致) 升级到二级页表 分段:…

【RK3399Pro学习笔记】二、Thinker Edge R 内网穿透以实现远程SSH

目录免费方案花生壳下载安装添加内网穿透映射测试平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 因Thinker Edge R安装的镜像为64位的版本 getconf LONG_BIT免费方案 花生壳 下载 在花生壳下载…

第14章:傅里叶变换

第14章:傅里叶变换一、理论基础:二、Numpy实现傅里叶变换:1. 实现傅里叶变换:2. 逆傅里叶变换:3. 高通滤波示例:三、OpenCV实现傅里叶变换:1. 实现傅里叶变换:2. 实现逆傅里叶变换&a…

代码能不能不要写得这么烂?!

我是一个研二的即将实习和毕业的普通屌丝研究生,带着几个研一的同学一起做数据挖掘项目。为了在毕业的时候防止青黄不接导致老师不让我毕业,于是从他们刚进实验室起,就“开始了设计模式和代码风格的培养”。具体的做法,就是扔给他…

【Kali 树莓派版学习笔记】安装系统和VNC服务

目录下载固件和烧录系统第一次开机SSH连接换源设置语言安装VNC平台:树莓派3B 版本: Linux kali 5.4.83-Re4son-v7 #1 SMP Sat May 15 03:22:58 UTC 2021 armv7l GNU/Linux 下载固件和烧录系统 Get Kali 格式化TF卡 使用Win32DiskImager刷入镜像 第…

第15章:模板匹配

第15章:模板匹配一、模板匹配基础:1. cv2.matchTemplate()函数:2. 匹配原理:3. 查找最值:二、多模版匹配:1. 获取匹配位置集合:2. 循环:3.调整坐标4.标记匹配图像的位置​ 模板匹配是…

第16章:霍夫变换

第16章:霍夫变换一、霍夫直线变换:1. 霍夫直线变换原理:2. HoughLines函数:3. HoughLinesP函数:2. 霍夫圆环变换:霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方…

一个java处理JSON格式数据的通用类(三)

/** *//** * 从json数组中解析出java Integer型对象数组 * param jsonString * return */ public static Double[] getDoubleArray4Json(String jsonString)...{ JSONArray jsonArray JSONArray.fromObject(jsonString); Doubl…

【树莓派学习笔记】九、C语言寄存器操作控制GPIO

目录CPU型号确定寄存器的地址问题GPIO寄存器GPFESLnGPSETnGPCLRn重要函数mmap函数munmap函数点灯程序平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf CPU型号确定 由 pinout命令可知,所用的板子Soc型号为BCM2837 寄存器的地址问题…

bzoj2527

首先环可以变成链来处理,对于l>r的情况就是修改区间[1,r],[l,mx]然后不难想到整体二分,二分答案k,然后算1~k场流星雨对国家的贡献然后判定将国家划分变成子问题解决,没什么难的终于不是tle,poi良心了一把 1 type wayrecord2 …