Python如何使用cv2.canny进行图像边缘检测
作者:风华明远 发布时间:2021-03-11 20:38:12
标签:Python,cv2.canny,图像,边缘检测
使用cv2.canny进行图像边缘检测
CV2提供了提取图像边缘的函数canny。
其算法思想如下:
1.使用高斯模糊,去除噪音点(cv2.GaussianBlur)
2.灰度转换(cv2.cvtColor)
3.使用sobel算子,计算出每个点的梯度大小和梯度方向
4.使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应
5.应用双阈值,来确定真实和潜在的边缘
6.通过抑制弱边缘来完成最终的边缘检测
Canny函数的定义如下:
edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
参数含义如下:
image
:要检测的图像threshold1
:阈值1(最小值)threshold2
:阈值2(最大值),使用此参数进行明显的边缘检测edges
:图像边缘信息apertureSize
:sobel算子(卷积核)大小L2gradient
:布尔值。True
:使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方)False
:使用L1范数(直接将两个方向导数的绝对值相加)
其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。
阈值对检测结果的影响
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,apertureSize=3)
edges2 = cv2.Canny(img,100,200,apertureSize=5)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()
可以看到,在调整threshold1之后,检测出的边缘增多了。
sobel算子对检测结果的影响
sobel默认的算子大小是3,扩大算子,会获得更多的细节,但是也更能提取图像了。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,apertureSize=3)
edges2 = cv2.Canny(img,100,200,apertureSize=5)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()
范数对检测结果的影响
L2gradient=True时,检测出的边缘减少了。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('d:\\girl.png')
edges = cv2.Canny(img,100,200,L2gradient=False)
edges2 = cv2.Canny(img,100,200,L2gradient=True)
plt.subplot(131),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image1'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(edges2,cmap = 'gray')
plt.title('Edge Image2'), plt.xticks([]), plt.yticks([])
plt.show()
来源:https://blog.csdn.net/weixin_42272768/article/details/111244896


猜你喜欢
- 本文实例讲述了C#访问SQL Server数据库的实现方法。分享给大家供大家参考。具体如下:这里介绍一下用C#访问SQL Server数据库
- 在asp中调用sql server的存储过程可以加快程序运行速度,本文介绍了asp使用存储过程的方法。1.调用存储过程的一般方法 先假设在s
- 1.使用SQL*PLUS停止数据库$ sqlplus /nologSQL> connect / as sysdbaSQL> sh
- 假设有一个可迭代对象,现在想要对它内部的元素进行排序,我们一般会使用内置函数 sorted,举个例子:data = (3
- 在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数判断文本
- 本文是将yolo3目标检测框架训练出来的ckpt文件固化成pb文件,主要利用了GitHub上的该项目。为什么要最终生成pb文件呢?简单来说就
- 假设你想找到本书中的某一个句子。你可以一页一页地逐页搜索,但这会花很多时间。而通过使用本书的索引,你可以很快地找到你要搜索的主题。表的索引与
- 如何写入超长的字符串? 我们可使用Command写入,来完成大容量的字符串的操作: dim&n
- 我们先来看一个例子:#encoding=utf-8 # #by panda #桥接模式 def printInfo(info): &nbs
- Django提供了一个新的类来帮助管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭
- 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于
- 模块的相关概念 1. 什么是模块模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块模块的英文名叫:
- 在某些编程语言中,例如 C/C++、C#、PHP、Java、JavaScript 等等,do-while 是一种基本的循环结构。它的核心语义
- range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生
- 这是个“懒人”用的办法,你没有时间更新主页,却又不能让三个月前的更新还标着"new",那么用这个js可以帮你的大忙!这个
- SQL Server2005数据项的分拆与合并:参考示例如下:-- ====================================
- 一、开始的话使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息。之前做了一个web版的发布系统,
- 通过这个布局思路来做一个简单的后台管理系统也是OK的,大家可以参考一下啦!话不多说,还是先来梳理一下需要的第三方模块。PyQ5 的UI界面布
- 这里从八个pandas的数据处理生命周期,整理汇总出pandas框架在整个数据处理过程中都是如何处理数据的。也就是从pandas的数据表对象
- mysql mysqldump 只导出表结构 不导出数据mysqldump --opt -d 数据库名 -u root -p > xx