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

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

第八章 图像边缘检测


文章目录


前言:什么是边缘?

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

学习目标:掌握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》

相关推荐
百度Geek说20 分钟前
打造高效易用的Agent Skill
人工智能
豆芽包34 分钟前
实战部署OpenClaw
人工智能
大厂码农老A44 分钟前
3天实现"睡后收入"—— Cursor & Skills打造"全自动出海"Agent
人工智能·aigc·ai编程
攻城羊Weslie1 小时前
🐑 从手动到自动:Yi-Shepherd 如何驯服 150+ 个 AI 模型
人工智能·程序员·开源
肥晨1 小时前
OpenClaw 卸载不完全?手把手教你“连根拔起”
人工智能
前端小趴蔡1 小时前
web2api 开源了(稳定的claude2api方案)
人工智能
小碗细面1 小时前
AutoClaw 澳龙上线:一键养虾时代来了,本地部署 OpenClaw 从此零门槛
人工智能·agent·ai编程
飞哥数智坊2 小时前
OpenClaw 为什么火?一个技术人的“不服”与深思
人工智能·agent
明明如月学长2 小时前
Claude Code 背后的秘密:这套免费课程让我看懂了 AI Agent
人工智能
yiyu07163 小时前
3分钟搞懂深度学习AI:深度学习大爆发
人工智能·深度学习