人工智能之视觉领域 计算机视觉 第八章 图像边缘检测

人工智能之视觉领域 计算机视觉

第八章 图像边缘检测


文章目录


前言:什么是边缘?

在日常生活中,我们很容易识别物体的轮廓。在计算机视觉中,"边缘"是指图像中亮度发生急剧变化的地方。这些变化通常对应于物体的边界或表面方向的变化。

学习目标:掌握Canny算法的工作原理及其应用,能够运用Sobel和Laplacian算子进行边缘检测,并了解它们的特点与适用场景。


核心算法

Canny边缘检测

Canny算法是边缘检测的经典方法,其主要步骤包括:

  1. 降噪处理:使用高斯滤波器平滑图像,以减少噪声。
  2. 计算梯度强度和方向:通过Sobel算子计算每个像素点的梯度强度和方向。
  3. 非极大值抑制:细化边缘,仅保留局部最大值。
  4. 双阈值检测:定义两个阈值,高于高阈值的确定为边缘,低于低阈值的排除,介于两者之间的根据连通性判断是否为边缘。
  5. 边缘跟踪:利用滞后阈值技术连接边缘。
函数:cv2.Canny()
python 复制代码
edges = cv2.Canny(image, threshold1, threshold2)
  • image: 输入图像(灰度图)
  • threshold1: 较低的阈值
  • threshold2: 较高的阈值(通常是threshold1的2-3倍)

Sobel算子

Sobel算子主要用于检测图像中的水平和垂直边缘,通过分别计算x方向和y方向上的梯度来实现。

函数:cv2.Sobel()
python 复制代码
sobelx = cv2.Sobel(src, ddepth, dx, dy, ksize=3)
sobely = cv2.Sobel(src, ddepth, dy, dx, ksize=3)
  • src: 输入图像
  • ddepth: 输出图像深度
  • dx, dy: 分别表示x方向和y方向的导数阶数
  • ksize: Sobel核大小

Laplacian算子

Laplacian算子是一种二阶导数算子,用于检测所有方向上的边缘,但对噪声敏感,通常需要先进行降噪处理。

函数:cv2.Laplacian()
python 复制代码
laplacian = cv2.Laplacian(src, ddepth)
  • src: 输入图像
  • ddepth: 输出图像深度

实践代码示例

以下是一个完整的Python代码示例,演示如何使用Canny、Sobel和Laplacian算子进行边缘检测。

python 复制代码
import cv2
import numpy as np
from matplotlib import pyplot as plt

# 加载并转换为灰度图像
img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 高斯模糊预处理(降低噪声影响)
blurred_img = cv2.GaussianBlur(img, (5, 5), 0)

# Canny边缘检测
edges_canny = cv2.Canny(blurred_img, 50, 150)

# Sobel算子
sobelx = cv2.Sobel(blurred_img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(blurred_img, cv2.CV_64F, 0, 1, ksize=5)
sobel_combined = np.sqrt(sobelx**2 + sobely**2)  # 合并结果

# Laplacian算子
edges_laplacian = cv2.Laplacian(blurred_img, cv2.CV_64F)

# 显示结果
plt.figure(figsize=(15, 10))

plt.subplot(2, 3, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])

plt.subplot(2, 3, 2), plt.imshow(edges_canny, cmap='gray')
plt.title('Canny'), plt.xticks([]), plt.yticks([])

plt.subplot(2, 3, 3), plt.imshow(sobel_combined, cmap='gray')
plt.title('Sobel Combined'), plt.xticks([]), plt.yticks([])

plt.subplot(2, 3, 4), plt.imshow(np.abs(sobelx), cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])

plt.subplot(2, 3, 5), plt.imshow(np.abs(sobely), cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])

plt.subplot(2, 3, 6), plt.imshow(edges_laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])

plt.tight_layout()
plt.show()

Mermaid流程图:边缘检测流程

Canny
Sobel
Laplacian
输入图像
选择边缘检测方法
降噪 -> 计算梯度 -> 非极大值抑制 -> 双阈值 -> 边缘跟踪
计算x/y方向梯度 -> 合并结果
直接计算二阶导数
输出清晰边缘
输出水平/垂直边缘
输出所有方向边缘


常见误区提醒

  • 不进行预处理直接检测:对于含有大量噪声的图像,直接进行边缘检测可能会导致大量的假边缘出现。建议首先进行适当的滤波处理(如高斯滤波)以减少噪声的影响。
  • 阈值选择不当:Canny算法中的高低阈值直接影响到边缘检测的效果。如果阈值设置得过低,可能会引入不必要的细节;过高则可能导致重要边缘丢失。
  • 忽略边缘细化:原始梯度信息往往包含过多的信息,非极大值抑制可以帮助细化边缘,使得最终的边缘更加精确和干净。

通过本章的学习,你应该已经掌握了如何使用Canny、Sobel以及Laplacian算子进行边缘检测的方法,并且能够根据具体的应用场景选择合适的边缘检测策略。接下来,我们将探索更多高级的计算机视觉技术,例如特征匹配和对象识别等。

资料关注

咚咚王

《Python编程:从入门到实践》

《利用Python进行数据分析》

《算法导论中文第三版》

《概率论与数理统计(第四版) (盛骤) 》

《程序员的数学》

《线性代数应该这样学第3版》

《微积分和数学分析引论》

《(西瓜书)周志华-机器学习》

《TensorFlow机器学习实战指南》

《Sklearn与TensorFlow机器学习实用指南》

《模式识别(第四版)》

《深度学习 deep learning》伊恩·古德费洛著 花书

《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》

《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》

《自然语言处理综论 第2版》

《Natural-Language-Processing-with-PyTorch》

《计算机视觉-算法与应用(中文版)》

《Learning OpenCV 4》

《AIGC:智能创作时代》杜雨+&+张孜铭

《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》

《从零构建大语言模型(中文版)》

《实战AI大模型》

《AI 3.0》

相关推荐
minhuan2 小时前
大模型应用:规则引擎 + 混元大模型:确定性骨架与智慧大脑的新融合实践.89
人工智能·大模型应用·规则引擎说明·rule-engine应用
数字生命卡兹克2 小时前
2026马年春晚15个关于AI的看点 - 有一种人类之外的美。
人工智能
Fairy要carry2 小时前
面试-SPO
人工智能
十步杀一人_千里不留行2 小时前
当代码评审成为手工业遗风
人工智能
AI浩2 小时前
SSVP:用于工业零样本异常检测的协同语义-视觉提示
人工智能·机器学习
Maynor9962 小时前
王煜全前哨分析框架③:如何构建产业预测方法论?
人工智能
njsgcs2 小时前
memU怎么处理记忆的
人工智能
开开心心就好2 小时前
实用PDF批量加马赛克,抹除敏感信息绿色版
java·linux·开发语言·网络·人工智能·pdf·word2vec
沐曦股份MetaX2 小时前
【智算芯闻】具身智能的新范式:利用AI智能体加速机器人学习技能
人工智能·机器人