【Canny 边缘检测详细讲解】

ops/2025/3/6 21:19:19/

Canny 边缘检测详细讲解

目录

  • Canny 边缘检测详细讲解
    • 一. Canny 边缘检测的基本原理
    • 二. 在 MATLAB 中实现 Canny 边缘检测
    • 三. 运行结果展示
    • 四. 关键参数解释
    • 五. 实验与验证
    • 六. 总结

Canny 边缘检测是一种经典的图像处理算法,广泛应用于计算机视觉领域。它通过多步骤处理,能够有效地检测出图像中的边缘。以下是 Canny 边缘检测的详细讲解,包括其原理、实现步骤以及在 MATLAB 中的代码示例。

一. Canny 边缘检测的基本原理

Canny 边缘检测算法由 John F. Canny 于 1986 年提出,旨在实现“最优”边缘检测。其核心思想是通过多步骤处理,准确地检测出图像中亮度变化显著的区域,同时尽量减少噪声干扰。Canny 边缘检测主要包括以下四个步骤:

  1. 高斯滤波(Gaussian Smoothing)
    • 作用 :平滑图像,减少噪声。
    • 原理 :使用高斯滤波器(Gaussian Filter)对图像进行卷积操作,降低高频噪声,为后续处理做准备。
    • 关键参数 :高斯滤波器的尺寸(如 3x3、5x5)和标准差(σ),决定了滤波的强度。

  2. 计算梯度(Gradient Computation)
    • 作用 :检测图像中亮度变化的方向和强度。
    • 原理 :使用 Sobel 算子或其他梯度算子(如 Prewitt 算子)计算图像在 X 和 Y 方向的梯度,得到梯度的大小和方向。
    • 公式 :
    ○ 梯度大小:
    在这里插入图片描述

    ○ 梯度方向:
    在这里插入图片描述

  3. 非极大值抑制(Non-Maximum Suppression)
    • 作用 :细化边缘,去除噪声点。
    • 原理 :沿着梯度方向对梯度进行一维最大值检测,保留梯度局部最大的点,抑制其他点。这样可以将边缘细化为一条线。

  4. 双阈值处理(Double Thresholding)
    • 作用 :区分强边缘和弱边缘,减少噪声干扰。
    • 原理 :
    ○ 设置高低两个阈值:低阈值用于检测潜在的边缘点,高阈值用于检测强边缘点。
    ○ 高于高阈值的点被认为是强边缘。
    ○ 低于低阈值的点被抑制。
    ○ 介于两者之间的点只有在与强边缘相连时才被视为边缘。

二. 在 MATLAB 中实现 Canny 边缘检测

MATLAB 提供了 edge 函数,简化了 Canny 边缘检测的实现过程。以下是详细的代码示例和解释:

matlab
% 读取图像
image = imread('test.jpg');
grayImage = rgb2gray(image);
% Canny 边缘检测
edges = edge(grayImage, 'Canny', [0.1, 0.3]);
% 显示图像
figure;
imshow(grayImage);
title('Grayscale Image');
figure;
imshow(edges);
title('Canny Edges');

代码解释:
1. 读取图像
matlab

image = imread('test.jpg');
grayImage = rgb2gray(image);
• imread:读取图像文件,返回一个三维矩阵(RGB 图像)。
• rgb2gray:将 RGB 图像转换为灰度图像,便于后续处理。
  1. Canny 边缘检测
    matlab
edges = edge(grayImage, 'Canny', [0.1, 0.3]);
• edge:MATLAB 的边缘检测函数。
• 第一个参数:输入的灰度图像。
• 第二个参数:指定使用的边缘检测算法,这里为 'Canny'。
• 第三个参数:设置低阈值和高阈值,这里为 [0.1, 0.3]。
  1. 显示图像
    matlab
figure;
imshow(grayImage);
title('Grayscale Image');
figure;
imshow(edges);
title('Canny Edges');
• imshow:显示图像。
• figure:创建一个新的图形窗口。
• title:为图像添加标题。

三. 运行结果展示

在这里插入图片描述

四. 关键参数解释

• 低阈值和高阈值○ 在 edge 函数中,[0.1, 0.3] 是低阈值和高阈值的设置。○ 低阈值 :用于检测潜在的边缘点。较低的低阈值可能会检测到更多的边缘,但也会增加噪声。○ 高阈值 :用于检测强边缘点。较高的高阈值可以减少噪声,但可能会遗漏一些边缘。○ 建议将高阈值设置为低阈值的 2 到 3 倍,以确保边缘检测的鲁棒性。
• 图像预处理○ 在进行边缘检测之前,通常需要对图像进行预处理,如去噪、对比度调整等,以提高检测效果。

五. 实验与验证

为了更好地理解 Canny 边缘检测的效果,可以进行以下实验:
1. 改变阈值
• 调整低阈值和高阈值,观察边缘检测结果的变化。
• 例如,将阈值设置为 [0.05, 0.15] 或 [0.15, 0.45],对比不同设置下的边缘检测效果。
○ 实践验证 edges = edge(grayImage, ‘Canny’); 不带阈值
○ 实践验证对比不同阈值下的图像

在这里插入图片描述

  1. 对比其他边缘检测算法
    • 使用 Sobel、Prewitt 等其他边缘检测算法,比较它们的检测效果。
    • 例如:
    matlab
edges_sobel = edge(grayImage, 'Sobel');
figure; imshow(edges_sobel); title('Sobel Edges');

在这里插入图片描述

  1. 添加噪声
    • 在图像中添加噪声(如高斯噪声、椒盐噪声),观察 Canny 边缘检测对噪声的鲁棒性。
    • 例如:
    matlab
noisyImage = imnoise(grayImage, 'gaussian', 0, 0.01);
edges_noisy = edge(noisyImage, 'Canny', [0.1, 0.3]);
figure;imshow(edges_noisy); title('Edges with Noise');

在这里插入图片描述

  1. 调整高斯滤波器的参数
    • 在 edge 函数中,默认使用高斯滤波器。可以通过设置 Sigma 参数调整高斯滤波器的标准差。
    • 例如:
    matlab
edges = edge(grayImage, 'Canny', [0.1, 0.3], 'Sigma', 1);

六. 总结

Canny 边缘检测是一种高效且鲁棒的边缘检测算法,通过高斯滤波、梯度计算、非极大值抑制和双阈值处理,能够准确地检测出图像中的边缘。在 MATLAB 中,使用 edge 函数可以方便地实现 Canny 边缘检测,用户只需设置适当的参数即可。通过调整阈值和其他参数,可以进一步优化边缘检测的效果,满足不同的应用需求。


http://www.ppmy.cn/ops/163692.html

相关文章

Unity 实现在模型表面进行绘画

Texture2D-SetPixels32 - Unity 脚本 API 实现思路 从笔尖位置发射射线获取画纸上碰撞位置的UV 纹理坐标以确认笔迹位置,射线检查碰撞的最大距离即笔尖距离画纸的最大距离,利用Texture2D.SetPixels32 实现对画纸贴图颜色的修改。 核心代码 发射一条以…

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤: 1.打开vs,创建一个新项目,分别在搜素框中选择C#、Windows、桌面,然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”,右键单击“数据连接”&#xff0…

[Computer Vision]实验六:视差估计

目录 一、实验内容 二、实验过程 2.1.1 test.py文件 2.1.2 test.py文件结果与分析 2.2.1 文件代码 2.2.2 结果与分析 一、实验内容 给定左右相机图片,估算图片的视差/深度;体现极线校正(例如打印前后极线对)、同名点匹配…

DDK:Distilling Domain Knowledge for Efficient Large Language Models

速览方法论 不太了解知识蒸馏的可以看这篇文章【KD开山之作】 本文的动机是“降低学生模型在各领域和老师模型的差异”。 在一些性能差异比较大的领域,ddk方法可以降低student模型的困惑度(PPL, Perplexity),提高学生模型在该领域的性能。 该篇文章的优…

探索DeFi世界:用Python开发去中心化金融应用

探索DeFi世界:用Python开发去中心化金融应用 在区块链技术快速发展的今天,去中心化金融(DeFi)正在改变传统金融行业的格局。作为一名自媒体创作者和技术爱好者,我希望通过本文分享如何用Python开发去中心化金融应用,帮助读者深入了解DeFi的潜力和技术实现方式。 什么是…

Docker01 - docker快速入门

Docker快速入门 文章目录 Docker快速入门一:Docker概述1:虚拟机技术和容器化技术2:Docker名词解释2.1:Docker镜像(images)2.2:Docker容器(containers)2.3:Docker仓库(registry) 3:Docker下载安装…

css画出带圆角平行四边形效果

使用css画出平行四边形效果如下图 HTML代码 <div class"badge"><span>营业中</span> </div> 关键代码&#xff1a; transform: skewX(-15deg); /* 让元素倾斜&#xff0c;形成平行四边形的视觉效果 */ 如果倾斜的元素里面需要放文字&…

Amadine for Mac v1.6.7 矢量图形设计软件 支持M、Intel芯片

Amadine 是Mac毒找到的一款矢量图形设计软件&#xff0c;非常适合平面设计专业人士以及具有创造性思维的业余爱好者。Amadine精确开发并注重用户需求&#xff0c;提供各种工具和功能&#xff0c;将最疯狂的插图创意带入生活。完美平衡的UI保证了快速简便的工作流程。 应用介绍…