如何使用Python图像边缘检测算法,有什么优势吗
Admin 2022-08-17 群英技术资讯 781 次浏览
今天小编跟大家讲解下有关“如何使用Python图像边缘检测算法,有什么优势吗”的内容 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了相关资料,希望小伙伴们看了有所帮助。本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,例如
import cv2
import numpy as np
import matplotlib.pyplot as plt
Detector = EdgeDetect('1.jpg')
Prewitt = Detector.prewitt()
plt.imshow(Prewitt , 'gray')
plt.show()
这个类的构造函数为
class EdgeDetect:
def __init__(self, img) -> None:
self.src = cv2.imread(img)
self.gray = cv2.cvtColor(self.src, cv2.COLOR_BGR2GRAY)
读取的是图像的基本信息。
图像边缘是数字图像的高频成分,对应图像梯度的极值。在二维离散数字图像上,某个方向上图像强度函数微分使用有限差分法来近似,即:

因此图像边缘检测即是对图像的差分运算。
Prewitt算子本质上就是x或y方向上相邻像素的差分。

那我们常说的图像梯度是什么意思呢?
其实就是用x与y方向上相邻像素的差分为方向的向量

在编程实现上,就是构造上图的两个方向的滤波算子,然后将x xx、y yy两个方向的边缘合成就是整张图各方向的边缘检测结果
def prewitt(self):
# Prewitt 算子
kernelX = np.array([[1,1,1],[0,0,0],[-1,-1,-1]], dtype=int)
kernelY = np.array([[-1,0,1],[-1,0,1],[-1,0,1]], dtype=int)
# 对图像滤波
x = cv2.filter2D(self.gray, cv2.CV_16S, kernelX)
y = cv2.filter2D(self.gray, cv2.CV_16S, kernelY)
# 转 uint8 ,图像融合
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
return cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

对高斯核函数x、y方向求导,并将其模板化即得Sobel算子。Sobel算子相比于Prewitt算子有更强的抗噪能力,因为其结合了高斯滤波的效果。

在编程实现上,就是构造上图的两个方向的滤波算子,然后将x、y两个方向的边缘合成就是整张图各方向的边缘检测结果
def sobel(self):
# Sobel 算子
kernelX = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]],dtype=int)
kernelY = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]],dtype=int)
# 对图像滤波
x = cv2.filter2D(self.gray, cv2.CV_16S, kernelX)
y = cv2.filter2D(self.gray, cv2.CV_16S, kernelY)
# 转 uint8 ,图像融合
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
return cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

将Laplace算子

写成差分方程形式为

将差分方程进一步写成卷积核形式如图(a),可将其扩展为图(b)使之具有各向同性。微分算子属于高通滤波,在锐化边缘的同时也增强了噪点,因此Laplace算子抗噪能力弱,且不能检测边缘方向。

在编程实现上,就是构造上图的滤波算子
# Laplace 算子
def laplace(self):
kernel = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], dtype=int)
img = cv2.filter2D(self.gray, cv2.CV_16S, kernel)
return cv2.convertScaleAbs(img)

为克服Laplace算子抗噪能力弱这一问题,引入高斯-拉普拉斯算子(LoG, Laplace of Gaussian),即先低通滤除噪声,再高通强化边缘,LoG算子本质上是带通滤波器。

在编程实现上,就是构造上图的滤波算子
# LoG算子
def LoG(self):
kernel = np.array([[0, 0, 1, 0, 0], [0, 1, 2, 1, 0], [1, 2, -16, 2, 1], [0, 1, 2, 1, 0], [0, 0, 1, 0, 0]], dtype=int)
img = cv2.filter2D(self.gray, cv2.CV_16S, kernel)
return cv2.convertScaleAbs(img)

Canny边缘检测算法可以分为以下步骤。
使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。

阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即

通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。
下面是Canny边缘检测算法的效果。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
数据可视化是指用图形或表格的方式来呈现数据。图表能够清楚地呈现数据性质, 以及数据间或属性间的关系。本文为大家分享了几个Python数据可视化绘图的实例,感兴趣的可以了解一下
对于Python语言来说,比较传统的数据可视化模块是Matplotlib,但它存在不够美观、静态性、不易分享等缺点,限制了Python在数据可视化方面的发展。为了解决这个问题,新型的动态可视化开源模块Plotly应运而生。本文将为大家详细介绍Plotly的用法,需要的可以参考一下
这篇文章给大家分享是关于python xlwt模块的使用内容,包含基础类介绍,xlwt高级应用等等,下文有具有实例,感兴趣的朋友可以参考学习,接下来就跟随小编一起来看看xlwt模块的使用吧。
python中如何求取字典最大值?方法一,通过sorted()函数排序所有的value;方法二,通过max函数取字典中value所对应的key值;
在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异主要体现在以下几个方面:1 python3中print是一个内置函
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008