Opencv中的Canny边缘检测
文章目录
- 1.Canny引入
- 2.Canny算法实现步骤
- (1)去噪
- (2)计算梯度和梯度方向
- (3)过滤非最大值
- (4)使用阈值检测边缘
- 3.Canny函数实现
- 4.实例代码测试
- (1)图片测试代码
- (1)调节阈值大小
- (2)使用L2gradient=True
- (3)设置apertureSize中的Sobel算子大小
- (2)实时检测代码
- 5.Canny的实际应用
1.Canny引入
(1)Canny边缘检测算子是John.F.Canny与1986年开发出来的一个多级边缘检测算法;边缘检测是计算机视觉中一个非常古老的问题,它涉及到检测图像中的边缘来确定目标的边界,从而分离感兴趣的目标。最流行的边缘检测技术之一是Canny边缘检测。
(2)对最优边缘检测算法评价
a.好的检测:算法能够尽可能多的标识出图片中的实际边缘;
b.好的定位:标识出的边缘要与实际图片中的实际边缘尽可能的接近;
c.最小响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应该标识为边缘。
https://wenku.baidu.com/view/54a32be6d6bbfd0a79563c1ec5da50e2524dd1da.html
2.Canny算法实现步骤
(1)去噪
:因为原始的图片具有很多随机的噪声,那么在进行边缘处理的时候很容易将这些噪声视为图像的边缘,可以使用5x5的高斯滤波器对图像进行平滑(模糊)。
(2)计算梯度和梯度方向
:使用4个mask检测水平,垂直以及对角线方向的边缘;原始图像和每个mask进行卷积并且保存起来,对于每个点都标识这个点上的最大值以及生成的边缘的方向:
(3)过滤非最大值
:在高斯滤波过程中,边缘可能别被放大,因为在真实的图片中,梯度值最大有可能比较多,所以需要对边缘进行过滤,使边缘的宽度尽可能为一个像素点;如果一个像素点属于边缘,那么这个像素点在梯度方向上梯度值最大;否则不是边缘,将像素值设置为0;
(4)使用阈值检测边缘
:使用一个阈值检测边缘不太合理,使用上下阈值来检测边缘;我们选择valueMax作为高阈值,valueMin作为低阈值;任何梯度值大于高阈值(valueMax)的一定为边缘;任何小于低阈值(valueMin)的一定不是边缘;而对高阈值和低阈值之间的值进行检查,如果边缘相连,则视为边缘;否则不是边缘。
3.Canny函数实现
(5)python中的Canny函数
Canny(InputArray image, double threshold1,double threshold2,OutputArray edges=None, int apertureSize=None,bool L2gradient=None)
参数解释:
Image:输入图像(源图像),单通道为8bit;
Threshold1:第一个滞后性阈值;
Threshold2:第二个滞后性阈值;
Edges:输出边缘图,需要和一样的尺寸和数据类型;
apertureSize:应用Sobel算子的孔径大小,默认值为3;
L2gradient:计算图像梯度幅度值的情况,默认值为False;如果为 True,则使用更精确的 L2 范数进行计算
边缘检测算子:https://blog.csdn.net/wsp_1138886114/article/details/81368890
4.实例代码测试
(1)图片测试代码
import os
import cv2
import numpy as npdef handl_Canny(pic_path='images/lenna.jpg'):#读取图像img=cv2.imread(pic_path)#缩放图像的大小img=cv2.resize(src=img,dsize=(512,512))#对图像进行边缘检测,低阈值=50 高阈值=200img_canny=cv2.Canny(img,threshold1=50,threshold2=200)#显示检测之后的图像cv2.imshow('image',img_canny)#显示原图像cv2.imshow('src',img)cv2.waitKey(0)#销毁所有的窗口
cv2.destroyAllWindows()
if __name__ == '__main__':print('PyCharm')handl_Canny()
(1)调节阈值大小
threshold1=80,threshold2=200
threshold1=130,threshold2=200
threshold1=50,threshold2=220
threshold1=30,threshold2=100
threshold1=30,threshold2=80
总结:可以发现随着threshold1和threshold2的差距变大,检测出的边缘越来越少。因为他们之间的阈值间距越大,那么出现在阈值之间的梯度值就越多,出现不连续的边缘也就越多,导致很多都被过滤掉,所以最后检测出的边缘较少;但是比如threshold1=30,threshold2=100之间相差70,而threshold1=100,threshold2=170之间也是相差70,但是前面一种检测出的边缘又比后面的多,因为梯度值大多数集中在了100以下,所以前面一种检测出的边缘更多。
(2)使用L2gradient=True
如果为 True,则使用更精确的 L2 范数进行计算
上比于上面,threshold1=30,threshold2=80,检测出的边缘越来越少了;
(3)设置apertureSize中的Sobel算子大小
Canny(img,threshold1=50,threshold2=200,apertureSize=5)
和上面的threshold1=50,threshold2=200,比较,细节要多了很多。
https://blog.csdn.net/wsp_1138886114/article/details/81368890
(2)实时检测代码
import os
import cv2
import numpy as np
def detect_Canny():cap=cv2.VideoCapture(0)while cap.isOpened():OK,frame=cap.read()# 缩放图像的大小img = cv2.resize(src=frame, dsize=(512, 512))# 对图像进行边缘检测,低阈值=50 高阈值=200img_canny = cv2.Canny(img, threshold1=30, threshold2=100)# 显示检测之后的图像cv2.imshow('image', img_canny)if cv2.waitKey(1)&0XFF==27:breakcap.release()cv2.destroyAllWindows()#销毁所有的窗口
cv2.destroyAllWindows()
if __name__ == '__main__':print('PyCharm')detect_Canny()
5.Canny的实际应用
如视觉显著性检测,目标检测,跟踪和运动分析,结构从运动,3D重建,自动驾驶,图像到文本分析等等
Opencv中的Canny边缘检测相关推荐
- OpenCV系列之Canny边缘检测 | 十九
在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法.它由John F. Canny发明 1 ...
- opencv+Recorder︱OpenCV 中的 Canny 边界检测+轮廓、拉普拉斯变换
本文来自于段力辉 译<OpenCV-Python 中文教程> 边缘检测是图像处理和计算机视觉中的基本问题,通过标识数字图像中亮度变化明显的点,来捕捉图像属性中的显著变化,包括深度上的不连续 ...
- OpenCV+python:Canny边缘检测算法
1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...
- candy算子python_Python-计算机视觉中的Canny边缘检测方法
今天的想法是用Canny边缘检测算法,建立一种可以勾画出图像上任何物体的边缘的算法. 首先,我们来描述一下Canny边缘检测器:Canny边缘检测算子是一种边缘检测算子,它采用多级算法检测图像中广泛的 ...
- python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)
原理 Canny边缘检测是一种常用的边缘检测算法.由 John F. Canny提出 这是一个多阶段的算法,我们将经历每个阶段. 1.降低噪音 由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高 ...
- 【图像处理】OpenCV中的边缘检测
[图像处理]OpenCV中的边缘检测 部分参考来源 边缘检测的算子 边缘定义及类型 图像边缘描述 边缘检测算子类别 一阶微分算子:Roberts .Sobel .Prewitt 二阶微分算子:Lapl ...
- Canny边缘检测算法原理及其VC实现详解(二)
3. Canny算法的实现流程 由于本文主要目的在于学习和实现算法,而对于图像读取.视频获取等内容不进行阐述.因此选用OpenCV算法库作为其他功能的实现途径(关于OpenCV的使用,作者将另文表述 ...
- 第四章:OpenCV中的图像处理
第四章:OpenCV中的图像处理 本章节你将学习图像的改变色彩空间.提取对象.图像的几何变换.图像的阈值.平滑图像等OpenCV图像处理的基本内容. 更多内容请关注我的GitHub库:TonyStar ...
- OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔
OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...
最新文章
- 一个 Babelfish ,看懂云数据库的发展方向
- MySQL的优化(大纲)
- ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐)
- 微博:吃饭砸锅的艺术
- 上学路线 (Standard IO)
- mysql中一些简单但是新手容易犯的错误
- net core 3.0 之Grpc新特性小试牛刀
- vscode 使用 ssh 登录
- 敏捷开发绩效管理之三:个体动力之源——同行压力(松结对编程,师徒制度,跨职能团队,绩效考核)...
- wait会释放锁吗_漫画:如何证明sleep不释放锁,而wait释放锁?
- LINUX获得毫秒时间戳的代码
- debian远程桌面设置
- mysql建表语句转换成oracle,如何手动将ORACLE的sql建表语句转换为MYSQL的建表语句...
- sci-hub, libgen等科研用文献书籍下载
- 联想拯救者Legion Y7000 2020款(10代INTEL+GTX1650)安装ubuntu16.04(双系统)探索内核与显卡网卡驱动的关系
- OllyDbg笔记-Olly Advanced插件使用
- Hadoop数据迁移工具DistCp
- 豆瓣爬虫btmd_12_Mamba文件
- beego框架-logs模块学习笔记
- 和月薪5W的华为程序员聊过后,才知道自己一直在打杂...