IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 计算机视觉教程3-1:全面详解图像边缘检测算法(附Python实战) -> 正文阅读

[人工智能]计算机视觉教程3-1:全面详解图像边缘检测算法(附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} {?x?f?[i,j]f[i+1,j]?f[i,j]?y?f?[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=[?x?f???y?f??]

在编程实现上,就是构造上图的两个方向的滤波算子,然后将 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=?x2?2f?+?y2?2f?

写成差分方程形式为

? 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(x?1,y)+f(x,y+1)+f(x,y?1)?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)检测来确定真实的和潜在的边缘。

使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。
i f ?? G p ? H i g h T h r e s h o l d : G p = S t r o n g ?? E d g e e l s e ?? i f ?? G p ? L o w T h r e s h o l d : G p = W e a k ?? E d g e e l s e ?? G p = S u p p r e s s e d ?? E d g e if\,\,G_p\geqslant HighThreshold: G_p=Strong\,\,Edge\\else\,\,if\,\,G_p\geqslant LowThreshold: G_p=Weak\,\,Edge\\else\,\, G_p=Suppressed\,\,Edge ifGp??HighThreshold:Gp?=StrongEdgeelseifGp??LowThreshold:Gp?=WeakEdgeelseGp?=SuppressedEdge
阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即
i f ?? G p = W e a k ?? E d g e ?? a n d ?? G p ?? i s ?? c o n n e c t e d ?? w i t h ?? S t r o n g ?? E d g e : ?? G p = S t r o n g ?? E d g e e l s e : ?? G p = S u p p r e s s e d ?? E d g e if\,\,G_p=Weak\,\,Edge\,\,and\,\,G_p\,\,is\,\,connected\,\,with\,\,Strong\,\,Edge:\\\,\, G_p=Strong\,\,Edge\\else:\\\,\, G_p=Suppressed\,\,Edge ifGp?=WeakEdgeandGp?isconnectedwithStrongEdge:Gp?=StrongEdgeelse:Gp?=SuppressedEdge
通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。

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

在这里插入图片描述

本文完整代码请关注下方公众号回复“CV008”获取~


🚀 计算机视觉基础教程说明

章号 ?????????????????????????????????? 内容
? 0 ??????????????????????? ???? 色彩空间与数字成像
? 1 ??????????????????????? ???? 计算机几何基础
? 2 ??????????????????????? ???? 图像增强、滤波、金字塔
? 3 ??????????????????????? ???? 图像特征提取
? 4 ??????????????????????? ???? 图像特征描述
? 5 ??????????????????????? ???? 图像特征匹配
? 6 ??????????????????????? ???? 立体视觉
? 7 ??????????????????????? ???? 项目实战

🔥 更多精彩专栏

🏠 欢迎加入社区和更多志同道合的朋友交流AI 技术社

👇配套代码 · 优质体验 · 系统知识 请关注👇
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:19:25  更:2022-06-06 17:19:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 2:35:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码