计算机视觉教程3-1:全面详解图像边缘检测算法(附Python实战)

计算机视觉教程3-1:全面详解图像边缘检测算法(附Python实战)图像边缘检测算法种类繁多 本文系统梳理了图像边缘检测算法 并都附上了 Python 实战代码加深理解 便于二次开发

0 写在前面

从本节开始,计算机视觉教程进入第三章节——图像特征提取。在本章,你会见到一张简简单单的图片中蕴含着这么多你没注意到的细节特征,而这些特征将会在今后更高级的应用中发挥着极其重要的作用。本文讲解基础特征之一——图像边缘。

本文采用面向对象设计,定义了一个边缘检测类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 一阶微分算子

图像边缘是数字图像的高频成分,对应图像梯度的极值。在二维离散数字图像上,某个方向上图像强度函数微分使用有限差分法来近似,即:

{ ∂ f ∂ x [ i , j ] ≈ f [ i + 1 , j ] − f [ i , j ] ∂ f ∂ y [ i , j ] ≈ f [ i , j + 1 ] − f [ i , j ] \begin{cases} \frac{\partial f}{\partial x}\left[ i,j \right] \approx f\left[ i+1,j \right] -f\left[ i,j \right]\\ \frac{\partial f}{\partial y}\left[ i,j \right] \approx f\left[ i,j+1 \right] -f\left[ i,j \right]\\\end{cases} {
xf[i,j]f[i+1,j]f[i,j]yf[i,j]f[i,j+1]f[i,j]

因此图像边缘检测即是对图像的差分运算

1.1 Prewitt算子

Prewitt算子本质上就是 x x x y y y方向上相邻像素的差分。

在这里插入图片描述
那我们常说的图像梯度是什么意思呢?

其实就是用 x x x y y y方向上相邻像素的差分为方向的向量

∇ f = [ ∂ f ∂ x ∂ f ∂ y ] \nabla f=\left[ \begin{matrix} \frac{\partial f}{\partial x}& \frac{\partial f}{\partial y}\\\end{matrix} \right] f=[xfyf]

在编程实现上,就是构造上图的两个方向的滤波算子,然后将 x x x y y y两个方向的边缘合成就是整张图各方向的边缘检测结果

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 x x y y y方向求导,并将其模板化即得Sobel算子。Sobel算子相比于Prewitt算子有更强的抗噪能力,因为其结合了高斯滤波的效果。

在这里插入图片描述

在编程实现上,就是构造上图的两个方向的滤波算子,然后将 x x x y y 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算子

∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla ^2f=\frac{\partial ^2f}{\partial x^2}+\frac{\partial ^2f}{\partial y^2} 2f=x22f+y22f

写成差分方程形式为

∇ 2 f = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( x , y ) \nabla ^2f=f\left( x+1,y \right) +f\left( x-1,y \right) +f\left( x,y+1 \right) +f\left( x,y-1 \right) -4f\left( x,y \right) 2f=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)

将差分方程进一步写成卷积核形式如图(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)检测来确定真实的和潜在的边缘。

下面是Canny边缘检测算法的效果。

在这里插入图片描述

本文的完整工程代码请通过下方名片联系我获取


? 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》



?源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系?



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210577.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:20
下一篇 2026年3月19日 上午7:21


相关推荐

  • 详解神经网络的前向传播和反向传播(从头推导)

    详解神经网络的前向传播和反向传播(从头推导)详解神经网络的前向传播和反向传播本篇博客是对MichaelNielsen所著的《NeuralNetworkandDeepLearning》第2章内容的解读,有兴趣的朋友可以直接阅读原文NeuralNetworkandDeepLearning。  对神经网络有些了解的人可能都知道,神经网络其实就是一个输入XXX到输出YYY的映射函数:f(X)=Yf(X)=Yf(X)=Y,函…

    2022年6月12日
    41
  • idea2021激活码mac版【在线注册码/序列号/破解码】

    idea2021激活码mac版【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    53
  • WLAN设备集成规范

    WLAN设备集成规范WLAN 设备集成规范一 无线覆盖技术指标 1 二 无线设备技术指标 2 三 设计依据 2 四 系统吞吐量 31 系统吞吐量 32 系统支持并发用户数 33 无线覆盖边缘场强的取定 34 覆盖范围预测 3 五 设备平面布置 41 设备平面布置说明 41 选择 AP 设置点的原则 42 AP 位置确

    2026年3月16日
    3
  • OpenGL 安装

    OpenGL 安装OpenGL 是一套由 SGI 公司发展出来的绘图函数库 它是一组 C 语言的函数 用于 2D 与 3D 图形应用程序的开发上 OpenGL 让程序开发人员不需要考虑到各种显示卡底层运作是否相同的问题 硬件由 OpenGL 核心去沟通 因此只要显示卡支援 OpenGL 那么程序就不需要重新再移植 而程序开发人员也不需要重新学习一组函数库来移植程序 安装首先不可或缺的就是编译器与基本的函数库

    2026年3月18日
    2
  • powershell修改host文件

    powershell修改host文件使用图形界面发现修改不了host文件,这里提供一种方法:1.按win+X组合键2.点击WodowsPowerShell(管理员)3.输入cdC:\Windows\System32\drivers4.输入ls看是否存在host文件(我们可以看到host文件的权限)5.输入notepadhosts此时会已记事本形式打开host文件在里面加你想要加入的域名即可,6.然后点击文件,点击保存。…

    2022年10月12日
    4
  • 成为一名CV(计算机视觉)工程师,你需要具备哪些能力?[通俗易懂]

    成为一名CV(计算机视觉)工程师,你需要具备哪些能力?[通俗易懂]2019年国家对人工智能加大了支持力度,媒体对人工智能的资讯报道也越来越多,刚刚结束的人工智能大会也展示了国内现在的人工智能的发展状况,“双马”对话中也处处透露出对人工智能的美好展望。人工智能一个很大的应用方向是CV(计算机视觉)。CV在如制造业、检验、文档分析、医疗诊断和军事等领域中各种智能系统中不可分割。具体的像无人驾驶、人脸识别、VR/AR等,未来在医疗领域等还将有更大的发展。那么成为一名计算机视觉工程师应该具备哪些能力呢?首先数学要学好。大学里开过的高数、线性代数、概率统计等课都十分

    2022年4月20日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号