人工智能之视觉领域 计算机视觉
第八章 图像边缘检测
文章目录
- [人工智能之视觉领域 计算机视觉](#人工智能之视觉领域 计算机视觉)
- 资料关注
前言:什么是边缘?
在日常生活中,我们很容易识别物体的轮廓。在计算机视觉中,"边缘"是指图像中亮度发生急剧变化的地方。这些变化通常对应于物体的边界或表面方向的变化。
学习目标:掌握Canny算法的工作原理及其应用,能够运用Sobel和Laplacian算子进行边缘检测,并了解它们的特点与适用场景。
核心算法
Canny边缘检测
Canny算法是边缘检测的经典方法,其主要步骤包括:
- 降噪处理:使用高斯滤波器平滑图像,以减少噪声。
- 计算梯度强度和方向:通过Sobel算子计算每个像素点的梯度强度和方向。
- 非极大值抑制:细化边缘,仅保留局部最大值。
- 双阈值检测:定义两个阈值,高于高阈值的确定为边缘,低于低阈值的排除,介于两者之间的根据连通性判断是否为边缘。
- 边缘跟踪:利用滞后阈值技术连接边缘。
函数: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》