当前位置: 首页 > news >正文

边缘检测技术现状初探1

边缘检测是计算机视觉与图像处理领域的基石技术,其核心目标是通过识别图像中亮度、色彩或纹理的突变区域,提取物体轮廓与结构信息。随着工业自动化、自动驾驶、医学影像分析等领域的快速发展,边缘检测技术经历了从传统算子到深度学习模型的演进,并在实际应用中不断崭露头角。


一、技术发展简史:从传统算子到深度学习

1.1 传统算子的时期(1960s-1990s)

早期边缘检测技术基于数学微分运算,通过构建一阶或二阶导数算子捕捉灰度突变。

  • Roberts算子(1963):利用对角差分检测边缘,计算简单但对噪声敏感。
  • Sobel与Prewitt算子(1970s):引入方向性梯度计算,通过3×3卷积核增强抗噪性(如Sobel的加权梯度计算)。
  • Canny算法(1986):提出多阶段优化框架(高斯滤波、梯度计算、非极大值抑制、双阈值连接),成为工业检测的黄金标准。

1.2 多尺度与形态学方法(2000s-2010s)

  • Laplacian of Gaussian(LoG):结合高斯平滑与二阶导数,解决噪声与边缘定位的矛盾。
  • 小波变换与模糊理论:通过频域分解与模糊隶属度增强复杂纹理边缘的鲁棒性。
  • 形态学方法:基于集合论结构元素对图像进行形状分析。

1.3 深度学习(2016至今)

  • HED(Holistically-Nested Edge Detection):首次将卷积神经网络(CNN)用于端到端边缘预测,实现多尺度特征融合。
  • RCN与PiDiNet:轻量化网络设计(如PiDiNet仅1M参数)支持实时检测,在BSDS500数据集上超越人类标注精度。
  • Transformer与多任务模型:EDTER等模型通过全局注意力机制提升长程边缘连续性。

二、传统算法简介与示例

2.1 Roberts算子

Roberts算子通过计算对角像素差异捕捉边缘,其核心为两个2×2卷积核:
K x = [ 1 0 0 − 1 ] , K y = [ 0 1 − 1 0 ] K_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}, \quad K_y = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} Kx=[1001],Ky=[0110]

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并灰度化
img = cv2.imread('../sports.jpg', cv2.IMREAD_GRAYSCALE)

# Roberts算子卷积核
kernel_x = np.array([[1, 0], [0, -1]], dtype=np.float32)
kernel_y = np.array([[0, 1], [-1, 0]], dtype=np.float32)

# 计算梯度
grad_x = cv2.filter2D(img, -1, kernel_x)
grad_y = cv2.filter2D(img, -1, kernel_y)

# 梯度幅值合并与二值化
grad = np.abs(grad_x) + np.abs(grad_y)  # 或使用平方根:np.sqrt(grad_x**2 + grad_y**2)
edges = np.uint8(np.where(grad > 30, 255, 0))  # 阈值设为30

# 显示
plt.subplot(121), plt.imshow(img, cmap='gray'),
plt.title('Original Image'), plt.axis('off')

plt.subplot(122), plt.imshow(edges, cmap='gray'),
plt.title('Roberts Edges'), plt.axis('off')

plt.tight_layout()
plt.show()

在这里插入图片描述

TIPS:

  • 直接使用np.abs()简化计算,避免负值截断问题;
  • 阈值选择需根据塑料表面反光强度调整(如透明PET瓶建议阈值15-50);
  • 对椒盐噪声敏感,需预先中值滤波处理。

2.2 Sobel算子实现

Sobel算子是一种基于一阶导数的边缘检测算法,通过计算图像水平和垂直方向的梯度幅值来定位边缘。其核心优势在于:

  1. 抗噪性:采用3×3高斯加权核,抑制高频噪声干扰
  2. 方向性:可分离计算X/Y方向梯度(常用于边缘方向估计)

数学表达式:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] ∗ I , G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] ∗ I G_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} * I, \quad G_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} * I Gx= 121000121 I,Gy= 101202101 I
边缘强度: G = G x 2 + G y 2 G = \sqrt{G_x^2 + G_y^2} G=Gx2+Gy2

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('../sports.jpg', cv2.IMREAD_GRAYSCALE)

# Sobel梯度计算
grad_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)

# 归一化梯度幅值
grad_mag = np.sqrt(grad_x ** 2 + grad_y ** 2)
grad_mag = cv2.normalize(grad_mag, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

# 动态阈值处理
_, edges = cv2.threshold(grad_mag, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 可视化对比
plt.figure(figsize=(12, 4))
plt.subplot(131), plt.imshow(img, cmap='gray'), plt.title('Original')
plt.subplot(132), plt.imshow(grad_mag, cmap='jet'), plt.title('Gradient Magnitude')
plt.subplot(133), plt.imshow(edges, cmap='gray'), plt.title('Sobel Edges')
plt.show()

在这里插入图片描述

2.3 Prewitt算子

Prewitt算子是一种基于一阶导数的边缘检测方法,与Sobel算子的主要区别在于均匀权重核设计,其特点包括:

  1. 计算效率高:核内无高斯加权,仅使用均匀权重(适合嵌入式设备)
  2. 方向敏感:对水平/垂直/对角边缘具有明确响应
  3. 噪声敏感:未内置平滑处理,需配合预处理使用

数学表达式:
K x = [ − 1 0 1 − 1 0 1 − 1 0 1 ] , K y = [ − 1 − 1 − 1 0 0 0 1 1 1 ] K_x = \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix}, \quad K_y = \begin{bmatrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix} Kx= 111000111 ,Ky= 101101101
边缘强度: G = ∣ G x ∣ + ∣ G y ∣ G = |G_x| + |G_y| G=Gx+Gy (简化计算,避免平方根耗时)

例子

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('../sports.jpg', cv2.IMREAD_GRAYSCALE)

# Prewitt核计算
kernel_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)
kernel_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float32)
grad_x = cv2.filter2D(img, cv2.CV_64F, kernel_x)
grad_y = cv2.filter2D(img, cv2.CV_64F, kernel_y)

# 梯度幅值归一化与自适应阈值
grad_mag = np.abs(grad_x) + np.abs(grad_y)
grad_mag = cv2.normalize(grad_mag, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
_, edges = cv2.threshold(grad_mag, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 形态学后处理(闭合断裂边缘)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
edges = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel, iterations=1)

# 可视化对比
plt.figure(figsize=(12, 4))
plt.subplot(141), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(142), plt.imshow(grad_x, cmap='jet'), plt.title('X Gradient')
plt.subplot(143), plt.imshow(grad_y, cmap='jet'), plt.title('Y Gradient')
plt.subplot(144), plt.imshow(edges, cmap='gray'), plt.title('Prewitt Edges')
plt.tight_layout()
plt.show()

在这里插入图片描述

2.4 Canny算法

技术要点:高斯核尺寸(5×5)平衡噪声抑制与细节保留,双阈值(50,150)需根据材质反光特性调整。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 图像读取与预处理
img = cv2.imread('../sports.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (5, 5), 1)

# Canny边缘检测(双阈值自适应)
edges = cv2.Canny(img_blur, 50, 150)

# 边缘连接优化
kernel = np.ones((3, 3), np.uint8)
edges = cv2.dilate(edges, kernel, iterations=1)
# 显示
plt.subplot(121), plt.imshow(img, cmap='gray'),
plt.title('Original Image'), plt.axis('off')

plt.subplot(122), plt.imshow(edges, cmap='gray'),
plt.title('Canny Edges'), plt.axis('off')

plt.tight_layout()
plt.show()

在这里插入图片描述

相关文章:

  • Java全栈面试宝典:线程机制与Spring IOC容器深度解析
  • 167. 两数之和 II - 输入有序数组 leetcode
  • UML之扩展用例
  • open3d教程 (三)点云的显示
  • 【蓝桥杯每日一题】4.1
  • SQLyog一款被遗忘的MySQL管理利器深度解析
  • 强化终端安全防线防范屏幕共享诈骗
  • SAP SCC安装配置
  • 【蓝桥杯速成】| 18.完全背包(练习室)
  • Excel去掉单元格里面的换行的方法
  • 优艾智合-西安交大具身智能机器人研究院公布人形机器人矩阵
  • Tiktok矩阵运营中使用云手机的好处
  • ChatBI产品形态深度解析:嵌入式BI与大模型的场景化融合实践
  • Mysql之Redo log(Red log of MySQL)
  • 黑白彩色相机成像原理
  • 嘿嘿,好久不见
  • Maven核心配置文件深度解析:pom.xml完全指南
  • 解码 @property - 属性管理的艺术
  • 搜索算法-------DFS练习1
  • C 语 言 --- 指 针 1
  • 广东省人防工程建设网站/浏览器老是出现站长工具
  • 怎么把自己做的网站传网上/seo引擎优化外包
  • 怎么用Visio studio做网站/网络推广是做什么工作的
  • 网站里面的链接怎么做的/seo深度优化公司
  • 网站两侧广告代码/北京网站制作400办理多少钱
  • 揭阳网站制作维护/seo网站自动发布外链工具