详解Python中图像边缘检测算法的实现
作者:Mr.Winter` 发布时间:2021-02-08 09:18:27
写在前面
从本节开始,计算机视觉教程进入第三章节——图像特征提取。在本章,你会见到一张简简单单的图片中蕴含着这么多你没注意到的细节特征,而这些特征将会在今后更高级的应用中发挥着极其重要的作用。本文讲解基础特征之一——图像边缘。
本文采用面向对象设计,定义了一个边缘检测类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)
读取的是图像的基本信息。
1.一阶微分算子
图像边缘是数字图像的高频成分,对应图像梯度的极值。在二维离散数字图像上,某个方向上图像强度函数微分使用有限差分法来近似,即:
因此图像边缘检测即是对图像的差分运算。
1.1 Prewitt算子
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)
1.2 Sobel算子
对高斯核函数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)
2.二阶微分算子
2.1 Laplace算子
将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)
2.2 LoG算子
为克服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)
3.Canny边缘检测
Canny边缘检测算法可以分为以下步骤。
使用Sobel算子滤除原图像噪声,并得到梯度图;
应用非极大值抑制(Non-Maximum Suppression, NMS)以消除边缘检测、目标检测带来的杂散响应,即对待测边缘或目标,应尽可能有唯一的准确响应
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。
阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即
通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。
下面是Canny边缘检测算法的效果。
来源:https://blog.csdn.net/FRIGIDWINTER/article/details/123956874
猜你喜欢
- MSXML是微软非托管代码栈中最为核心的XML服务集合,不但适合基于COM的开发应用,更是微软AJAX解决方案和客户端XSLT解决方案的核心
- asp之家注:作为一个学习asp的爱好者,相信一定接触过session,我们经常使用session来作为会员登录的验证,当然也可以使用COO
- 分页,就是按照某种规则显示分组数据集,但是在SQL Server 中,分页并不是十分容易就能够实现。在过去,开发人员通常需要自己编写程序,使
- 对于相册来说,大图的浏览非常重要,因为对浏览者来说最重要的就是大图看得爽不爽,因为做项目的需要,我比较了许多相册的大图浏览方式,现在一一评说
- Sjoerd Visscher 发现了一个简洁的 方法 让样式在 IE 中作用到未知的元素上——仅需 JS 创建此未知元素即可:docume
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 注意,在改变数值之前锁定应用,确保一段时间里只有一个客户执行该语句。<SCRIPT LANGUAGE="VBScr
- 和单选框一样,许多新手在用 Javascript 验证表单(form)中多选框(checkbox)的值时,都会遇到问题,原因是 checkb
- 中文简繁体网页的转换FrontPage 2002提供了中文简繁体转换的功能。只要轻轻一点就可做出简体或繁体中文网站了。如要将当前
- 1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PH
- 在登陆界面中,通常,最重要的部分为登陆的Form表。一个非常棒的提升体验的做法是,在载入页面时自动聚焦到第一个提供用户输入的表单框,让用户不
- PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下1,在网站的结账页面,设置一个提交到PayPal网站的
- asp+js做的一个dig程序中的投票(有的叫顶一下,踩一下),由于代码较长,只贴出核心部分:投票中的代码相关文章推荐:ajax +asp
- 本文实例讲述了Golang算法问题之数组按指定规则排序的方法。分享给大家供大家参考,具体如下:给出一个二维数组,请将这个二维数组按第i列(i
- Abs (数值)绝对值。一个数字的绝对值是它的正值。空字符串 (null) 的绝对值,也是空字符串。未初始化的变数,其绝对为 0例子:ABS
- 本文实例讲述了Python向Excel中插入图片的简单实现方法。分享给大家供大家参考,具体如下:使用Python向Excel文件中插入图片,
- 去听了牛人 dbaron 的一个 Web Page Layout/Display in Mozilla 讲座( via )。讲的东西对我一个
- 本文实例讲述了微信小程序实现图片上传、删除和预览功能的方法。分享给大家供大家参考,具体如下:这里主要介绍一下微信小程序的图片上传图片删除和图
- 前言:前两天用Python实现了ftp服务器。在小项目中就用到了反射。因此写个笔记巩固下。反射的定义:检测和修改它本身状态或行为的一种能力(
- 最近在研究WEB布局,遇到<H1>标签了,<H1>标签很重要。在一般教程中都这么说,<H1>标签在同一页