← 返回首页
图像边缘检测
发表时间:2025-02-21 01:25:04
图像边缘检测

Canny 边缘检测算法是一种非常流行的边缘检测算法,它由 John F. Canny 在 1986 年提出。

1.Canny算法

Canny算法是一种用于图像处理的边缘检测算法,它的主要目的是从图像中找出物体的轮廓(边缘)。我们可以用一个简单的比喻来理解它:想象你有一张照片,Canny算法就像是一个“智能画笔”,它能自动帮你勾勒出照片中物体的轮廓,比如桌子的边、人的轮廓、窗户的框架等等。下面我会用通俗易懂的方式解释它的主要步骤:

  1. 平滑处理(去噪) 在开始找轮廓之前,Canny算法会先给图像“洗个澡”,去除一些脏东西(噪声)。因为噪声就像是照片上的小瑕疵,会影响后续的边缘检测。它通常用一种叫做高斯滤波器(Gaussian filter)的方法,就像用一块柔软的布轻轻擦拭照片,让图像变得平滑。
  2. 计算梯度(找变化) 接下来,算法会检查图像中每个点的“变化情况”。简单来说,就是看看图像的亮度是从亮到暗,还是从暗到亮。如果亮度变化很快,那很可能是一个边缘。比如,一张黑白照片中,白纸和黑字的交界处,亮度变化就很大。Canny算法会计算每个点的梯度大小(变化的强度)和梯度方向(变化的方向)。
  3. 非极大值抑制(选最强的边缘) 这一步就像是在一群候选人中选最优秀的。Canny算法会沿着梯度方向检查每个点,看看它是不是周围最突出的。如果不是,就把它“淘汰掉”。比如,一条直线的边缘,我们只需要保留最清晰、最明显的部分,而不是所有的模糊边缘。
  4. 双阈值检测(筛选边缘) Canny算法会用两个阈值来筛选边缘:一个高阈值和一个低阈值。高阈值用来找出“非常确定”的边缘,比如很明显的轮廓;低阈值用来找出“可能的边缘”。然后,它会把那些“可能的边缘”和“非常确定的边缘”连接起来,形成完整的轮廓。
  5. 边缘连接(勾勒完整轮廓) 最后一步是把所有筛选出来的边缘连起来,形成完整的物体轮廓。就像用笔把断断续续的线条连起来,画出一个完整的图形。

Canny算法就像一个智能的“画师”,它通过平滑图像、找变化、选最强的边缘、筛选边缘和连接边缘这几个步骤,最终勾勒出图像中物体的轮廓。它被广泛用于计算机视觉领域,比如自动驾驶(检测道路边缘)、医学图像处理(勾勒器官轮廓)等。

代码实现:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('./images/jpg/small_bird01.jpg')

# 将图像转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用 Canny 边缘检测
edges = cv2.Canny(gray_image, threshold1=50, threshold2=150)

# 显示原图和边缘图
cv2.imshow('Original Image', image)
cv2.imshow('Edge Image', edges)

# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

2.Canny算法和Sobel算子对比

因此,选择哪种方法取决于具体的应用需求。如果需要快速处理且对噪声不敏感,Sobel算子是不错的选择;如果需要高精度和抗噪能力,则Canny算法更适合。