当前位置: 首页>編程日記>正文

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

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

目录

  • 0 写在前面
  • 1 一阶微分算子
    • 1.1 Prewitt算子
    • 1.2 Sobel算子
  • 2 二阶微分算子
    • 2.1 Laplace算子
    • 2.2 LoG算子
  • 3 Canny边缘检测

0 写在前面

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

本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,例如

import cv2
import numpy as np
import matplotlib.pyplot as pltDetector = 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算子本质上就是xxxyyy方向上相邻像素的差分。

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

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

∇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]

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

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算子

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

在这里插入图片描述

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

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算子

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

写成差分方程形式为

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

使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。
ifGp⩾HighThreshold:Gp=StrongEdgeelseifGp⩾LowThreshold:Gp=WeakEdgeelseGp=SuppressedEdgeif\,\,G_p\geqslant HighThreshold: G_p=Strong\,\,Edge\\else\,\,if\,\,G_p\geqslant LowThreshold: G_p=Weak\,\,Edge\\else\,\, G_p=Suppressed\,\,EdgeifGpHighThreshold:Gp=StrongEdgeelseifGpLowThreshold:Gp=WeakEdgeelseGp=SuppressedEdge
阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即
ifGp=WeakEdgeandGpisconnectedwithStrongEdge:Gp=StrongEdgeelse:Gp=SuppressedEdgeif\,\,G_p=Weak\,\,Edge\,\,and\,\,G_p\,\,is\,\,connected\,\,with\,\,Strong\,\,Edge:\\\,\, G_p=Strong\,\,Edge\\else:\\\,\, G_p=Suppressed\,\,EdgeifGp=WeakEdgeandGpisconnectedwithStrongEdge:Gp=StrongEdgeelse:Gp=SuppressedEdge
通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。

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

在这里插入图片描述

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


🔥 更多精彩专栏

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

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


https://www.fengoutiyan.com/post/16214.html

相关文章:

  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機