Python OpenCV实现边缘检测

 更新时间:2021年08月24日 11:23:34   作者:sxqczzxsh  
这篇文章主要为大家详细介绍了Python OpenCV实现边缘检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Python OpenCV实现边缘检测的具体代码,供大家参考,具体内容如下

1. Sobel 算子检测

Sobel 算子是高斯平滑和微分运算的组合,抗噪能力很强,用途也很多,尤其是效率要求高但对细纹理不是很在意的时候。

对于不连续的函数,有:

假设要处理的图像为I,在两个方向求导。

水平变化:用奇数大小的模板对图像I卷积,结果为Gx。例如,当模板大小为3时,Gx为: 

垂直变化:用奇数大小的模板对图像I卷积,结果为Gy。例如,当模板大小为3时,Gy为:

在图像的每个点,结合以上两个结果,得到: 

极大值的位置是图像的边缘。

当核大小为3时,上述Sobel核可能会产生更明显的误差。 为了解决这个问题,可以使用 Scharr 函数。这个函数只对大小为 3 的核有效,运算速度和 Sobel 函数一样快,但是结果更准确。 计算方法为:

cv.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
参数:
src 传入的图像
ddepth 图像的深度
dx、dy 指求导的阶数,0表示这个方向上没有求导,取值为0、1。
ksize Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。-1代表3x3的Scharr算子。
scale 缩放导数的比例常数,默认情况为没有伸缩系数。
borderType 图像边界的模式,默认值为cv.BORDER_DEFAULT。

需要对x和y两个方向都调用一次cv.Sobel()函数。然后,对每个方向调用cv.convertScaleAbs()函数将其转回uint8格式,再调用cv2.addWeighted()函数将两个方向组合起来。

2. Laplacian 算子检测

Laplacian 使用二阶导数来检测边缘。 因为图像是二维的,所以我们需要从两个方向求导:

不连续函数的二阶导数是:

使用的卷积核是:

cv.Laplacian(src, ddepth, ksize)
参数:
src 需要处理的图像
ddepth 图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度
ksize 算子的大小,即卷积核的大小,必须为1、3、5、7。

然后,对返回值调用cv.convertScaleAbs(res)即可获得边缘图像。

3.  Canny 边缘检测

Canny 边缘检测算法由4个步骤组成。

1)去噪。由于边缘检测容易受噪声影响,首先使用5*5高斯滤波器去除噪声。

2)计算图像梯度。在平滑图像上使用 Sobel 算子计算水平和垂直方向的一阶导数(Gx 和 Gy)。 根据得到的两个梯度图(Gx和Gy)求出边界的梯度和方向,公式如下:

如果一个像素是一个边缘,它的梯度方向总是垂直于边缘。 梯度方向分为四类:垂直方向、水平方向和两个对角线方向。

3)非极大值抑制。得到梯度的方向和大小后,扫描整个图像去除那些非边界点。 检查每个像素点,看这个点的梯度是否在周围具有相同梯度方向的点中最大。

A点位于图像的边缘。在其梯度变化的方向,选择像素B和C,检查A点的梯度是否为极大值。 如果是极大值,则保留,否则A点将被抑制,最后得到的结果是边缘细的二值图像。

4)滞后阈值。现在来确定真正的边界。我们设置了两个阈值:minVal 和 maxVal。 当图像的灰度梯度高于 maxVal 时,认为是真正的边界,低于minVal 的边界将被丢弃。 如果介于两者之间,则取决于该点是否连接到确定为真的边界点。 如果是,则认为是边界点,如果不是,则将其丢弃。 minVal 较小的阈值将间断的边缘连接起来,maxVal 较大的阈值检测图像中明显的边缘。如下图: 

A 高于阈值 maxVal,因此它是真正的边界点。虽然 C 低于 maxVal 但高于 minVal 并与 A 相连,所以它也被视为真正的边界点。 B 会被丢弃,因为它低于 maxVal ,并且没有连接到真正的边界点。 所以,选择合适的 maxVal 和 minVal 对于获得好的结果非常重要。

cv.Canny(image, threshold1, threshold2)
参数:
image 灰度图
threshold1 minval,较小的阈值
threshold2 maxval,较大的阈值

例:使用Sobel、Laplacian、Canny算法检测下面图像的边缘。

import matplotlib
import cv2 as cv
import matplotlib.pyplot as plt
 
font = {
    "family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
 
img = cv.imread("./image/horse.jpg", 0)
 
# Sobel
x = cv.Sobel(img, cv.CV_16S, 1, 0)
y = cv.Sobel(img, cv.CV_16S, 0, 1)
absx = cv.convertScaleAbs(x)
absy = cv.convertScaleAbs(y)
res = cv.addWeighted(absx, 0.5, absy, 0.5, 0)
plt.imshow(res, cmap=plt.cm.gray)
plt.title("Sobel")
plt.show()
 
# Schaar
x = cv.Sobel(img, cv.CV_16S, 1, 0, ksize=-1)
y = cv.Sobel(img, cv.CV_16S, 0, 1, ksize=-1)
absx = cv.convertScaleAbs(x)
absy = cv.convertScaleAbs(y)
res = cv.addWeighted(absx, 0.5, absy, 0.5, 0)
plt.imshow(res, cmap=plt.cm.gray)
plt.title("Schaar")
plt.show()
 
# Laplacian
res = cv.Laplacian(img, cv.CV_16S)
res = cv.convertScaleAbs(res)
plt.imshow(res, cmap=plt.cm.gray)
plt.title("Laplacian")
plt.show()
 
# Canny
res = cv.Canny(img, 0, 100)
plt.imshow(res, cmap=plt.cm.gray)
plt.title("Canny")
plt.show()

输出:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python面向对象特殊成员

    Python面向对象特殊成员

    这篇文章主要介绍了Python面向对象特殊成员的相关资料,需要的朋友可以参考下
    2017-04-04
  • 解析python 类方法、对象方法、静态方法

    解析python 类方法、对象方法、静态方法

    这篇文章主要介绍了解析python 类方法、对象方法、静态方法的的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • python3中bytes和string之间的互相转换

    python3中bytes和string之间的互相转换

    这篇文章主要介绍了python3中bytes和string之间的互相转换,文中给出了详细的介绍和示例代码,相信对大家具有一定的参考价值,有需要的朋友们下面来一起学习学习吧。
    2017-02-02
  • Python反爬虫伪装浏览器进行爬虫

    Python反爬虫伪装浏览器进行爬虫

    这篇文章主要介绍了Python反爬虫伪装浏览器进行爬虫,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • python中的测试框架

    python中的测试框架

    这篇文章主要介绍了python中测试框架的相关资料,帮助大家更好的理解和使用python进行测试,感兴趣的朋友可以了解下
    2020-11-11
  • python爬虫headers设置后无效的解决方法

    python爬虫headers设置后无效的解决方法

    这篇文章主要为大家详细介绍了python爬虫headers设置后无效的解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • python中翻译功能translate模块实现方法

    python中翻译功能translate模块实现方法

    在本篇文章中小编给各位整理了一篇关于python中翻译功能translate模块实现方法,有需要的朋友们可以参考下。
    2020-12-12
  • Mac中Python 3环境下安装scrapy的方法教程

    Mac中Python 3环境下安装scrapy的方法教程

    作为一名python爬虫爱好者,怎能不折腾下Scrapy?折腾了许久之后终于安装到了mac中,所以下面这篇文章主要给大家介绍了关于Mac系统中Python 3环境下安装scrapy的相关资料,文中将实现的步骤一步步介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • python判断一个集合是否包含了另外一个集合中所有项的方法

    python判断一个集合是否包含了另外一个集合中所有项的方法

    这篇文章主要介绍了python判断一个集合是否包含了另外一个集合中所有项的方法,涉及Python集合操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • python实现简单五子棋游戏

    python实现简单五子棋游戏

    这篇文章主要为大家详细介绍了python实现简单五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论