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
0
投稿
猜你喜欢
- 推荐idea最新激活码:最新Idea激活码永久激活(最新测试有效)https://www.jb51.net/article/178193.h
- 写任何编程代码,不同的开发者都会有不同的见解。但参考一下总是好的,下面是来自 Javascript Toolbox 发布的 14条最佳JS代
- 目录什么是 assert 断言断言和异常的使用场景使用断言的几个原则建议不使用断言的情况:总结什么是 assert 断言Assert sta
- 爬取xxx天气爬取网址:https://tianqi.2345.com/today-60038.htm安装pip install scrap
- 本例子程序展示了长白山火山气体地球化学2002年观测数据中CO2和He两种气体元素深度的时间序列。程序中用到了常用的时间序列python数据
- 前言本篇文章,阐述一下Flask中数据库的迁移为什么要说数据库迁移呢?比如我们以前有一个数据库,里面的信息有 id, name现在我想再加一
- 一、单字节SQL注入MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:1、在GET参数上加一个/*或者#(mysql专有的注释)
- 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。Traits 是一种为类似 PHP 的单继承语言而准备的代
- PHP crc32() 函数实例输出 crc32() 的结果:<?php $str = crc32("Hello World
- 本文实例讲述了JavaScript数据结构中串的表示与应用。分享给大家供大家参考,具体如下:类似于线性表的顺序存储结构,用一组地址连续的存储
- 一、协程官方描述;协程是子例程的更一般形式。 子例程可以在某一点进入并在另一点退出。 协程则可以在许多不同的点上进入、退出和恢复。 它们可通
- 图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不
- 1.直接使用dlib安装dlib方法:Win10安装dlib GPU过程详解思路:1、使用dlib.get_frontal_fac
- 首先我们来安装python1、首先进入网站下载:点击打开链接(或自己输入网址: https://www.python.org/downloa
- PyType_Type和PyBaseObject_TypePyObject和PyTypeObject内容的最后指出下图中对实例对象和类型对象
- 用系统\administrators可以登录,在安全性用户列表中,修改sa属性时系统提示: 属性IsLocked不可用于登录"[s
- 概念关键字:array,数据的组合(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据.数组定义语
- 运行结果:程序代码如下:#将excel中的数据进行读取分析import openpyxlimport numpy as npimport m
- 不知不觉已经在家两个月了,眼看马上春节就要来临了。满怀期待的写了一个新年倒计时的小工具!设置新年时间后都能够使用,打开软件后可以自动计算到新
- 不知道写得对不对啊!错了再改吧!加密函数Function Encodestr(s,xorstr)Dim enFor&nb