Canny边缘检测算法

8 篇文章 0 订阅
4 篇文章 1 订阅

Canny边缘检测算法

Canny边缘检测算法是计算机视觉领域中常用的边缘检测算法之一。它的主要特点是能够准确地检测到图像中的边缘,同时对于噪声有较好的抵抗能力。

1.算法构成

  1. 灰度化处理:将输入的彩色图像转换为灰度图像。

  2. 高斯滤波:使用高斯滤波器对灰度图像进行平滑处理,以减少噪声的影响。

  3. 计算图像梯度:使用Sobel算子计算灰度图像在水平和垂直方向的梯度值,从而得到每个像素点的梯度强度和方向。

  4. 非极大值抑制:对于每个像素点,比较其梯度方向上的邻近两个像素点之梯度值的大小,只保留梯度方向上梯度值极大的像素点,有利于消除边缘上的模糊效果。

  5. 双阈值处理:将像素点分为三类:强边缘、弱边缘和非边缘。当像素点的梯度值高于较高的阈值时,将其分类为强边缘。当像素点的梯度值低于较低的阈值时,将其分类为非边缘。当像素点的梯度值介于较高和较低的阈值之间时,将其分类为弱边缘。

  6. 边缘连接:将弱边缘和其周围的强边缘连接起来形成完整的边缘。

2.Canny边缘检测算法的公式和流程图

  1. 灰度化公式:

I g r a y = 0.299 × I R + 0.587 × I G + 0.114 × I B I_{gray} = 0.299 \times I_{R} + 0.587 \times I_{G} + 0.114 \times I_{B} Igray=0.299×IR+0.587×IG+0.114×IB其中, I g r a y I_{gray} Igray 表示灰度化后的像素值, I R I_{R} IR I G I_{G} IG I B I_{B} IB 分别为原图像对应像素的红、绿、蓝通道上的像素值。

  1. 高斯滤波公式:

G ( x , y ) = 1 2 π σ 2 exp ⁡ ( − x 2 + y 2 2 σ 2 ) G(x,y) = \frac{1}{2\pi\sigma^2}\exp \left(-\frac{x^2+y^2}{2\sigma^2}\right) G(x,y)=2πσ21exp(2σ2x2+y2)其中, G ( x , y ) G(x,y) G(x,y) 表示高斯函数, σ \sigma σ 表示滤波器的标准差。

  1. Sobel算子公式:

G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] ∗ I g r a y , G y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] ∗ I g r a y G_{x} = \begin{bmatrix} -1 & 0 & 1\\ -2 & 0 & 2\\ -1 & 0 & 1\\ \end{bmatrix} * I_{gray} , G_{y} = \begin{bmatrix} 1 & 2 & 1\\ 0 & 0 & 0\\ -1 & -2 & -1\\ \end{bmatrix} * I_{gray} Gx= 121000121 Igray,Gy= 101202101 Igray G x G_{x} Gx G y G_{y} Gy 分别表示水平和垂直方向上的梯度值, ∗ * 表示卷积运算符。

  1. 梯度幅值和方向公式:

M ( x , y ) = G x 2 ( x , y ) + G y 2 ( x , y ) , θ ( x , y ) = tan ⁡ − 1 ( G y ( x , y ) G x ( x , y ) ) M(x,y)=\sqrt{G_x^2(x,y)+G_y^2(x,y)}, \theta(x,y)=\tan^{-1}\left(\frac{G_y(x,y)}{G_x(x,y)}\right) M(x,y)=Gx2(x,y)+Gy2(x,y) ,θ(x,y)=tan1(Gx(x,y)Gy(x,y))其中, M ( x , y ) M(x,y) M(x,y) 表示该像素点的梯度强度, θ ( x , y ) \theta(x,y) θ(x,y) 表示该像素点的梯度方向。

  1. 非极大值抑制公式:

M ′ ( x , y ) = { M ( x , y ) i f M ( x , y ) ≥ M L and M ( x , y ) ≥ M ( x + δ x , y + δ y ) 0 o t h e r w i s e M^{'}(x,y) = \begin{cases} M(x,y) & if \quad M(x,y) \geq M_L \quad \text{and} \quad M(x,y) \geq M(x+\delta_x, y+\delta_y)\\ 0 & otherwise \end{cases} M(x,y)={M(x,y)0ifM(x,y)MLandM(x,y)M(x+δx,y+δy)otherwise其中, M L M_L ML 为梯度强度的低阈值, δ x \delta_x δx δ y \delta_y δy 为梯度方向的偏移值(如 δ x = cos ⁡ θ ( x , y ) \delta_x = \cos\theta(x,y) δx=cosθ(x,y) δ y = sin ⁡ θ ( x , y ) \delta_y = \sin\theta(x,y) δy=sinθ(x,y))。

  1. 双阈值处理公式:

C a n n y ( x , y ) = { S t r o n g i f M ′ ( x , y ) ≥ M H W e a k i f M ′ ( x , y ) < M H and M ′ ( x , y ) ≥ M L N o n − e d g e o t h e r w i s e Canny(x,y) =\begin{cases} Strong & if \quad M^{'}(x,y) \geq M_H \\ Weak & if \quad M^{'}(x,y) < M_H \quad \text{and} \quad M^{'}(x,y) \geq M_L \\ Non-edge & otherwise \end{cases} Canny(x,y)= StrongWeakNonedgeifM(x,y)MHifM(x,y)<MHandM(x,y)MLotherwise其中, M H M_H MH 为梯度强度的高阈值, S t r o n g Strong Strong W e a k Weak Weak N o n − e d g e Non-edge Nonedge 分别表示强边缘、弱边缘和非边缘。

  1. 边缘连接公式:

使用联通性分析算法,将强边缘和周围的弱边缘连接起来形成完整的边缘。以上是Canny边缘检测算法的公式和流程图。

3.Canny算法matlab中应用

Canny算法是一种常用的边缘检测算法,其在图像处理中有广泛的应用。在Matlab中,可以通过以下步骤来应用Canny算法:

  1. 读取需要处理的图像,可以使用imread函数实现。

  2. 对图像进行灰度化处理,可以使用rgb2gray函数实现。

  3. 对灰度图像进行高斯滤波,可以使用fspecial和imfilter函数实现。

  4. 对滤波后的图像进行边缘检测,可以使用edge函数实现。其中,Canny算法需要设置’Type’为’Canny’。

  5. 根据需求对检测到的边缘进行处理,可以使用imfill、bwlabel等函数实现。最终,可以使用imshow函数将处理后的图像显示出来。

以下是一个示例代码:

% 读取图像
img = imread('example.jpg');

% 灰度化处理
gray_img = rgb2gray(img);

% 高斯滤波
filter_size = 3; % 滤波器大小
sigma = 1; % 标准差
filter = fspecial('gaussian', [filter_size filter_size], sigma);
gauss_img = imfilter(gray_img, filter);

% 边缘检测
threshold1 = 0.1; % 阈值1
threshold2 = 0.3; % 阈值2
canny_img = edge(gauss_img, 'Canny', [threshold1 threshold2]);

% 显示结果
imshow(canny_img);

需要注意的是,Canny算法的阈值选择对边缘检测结果有着很大的影响,需要根据具体情况进行调整。

4.Canny算法Lingo中应用

Canny算法是一种常用的边缘检测算法,用于图像处理领域。在Lingo语言中,可以通过以下步骤实现Canny算法的应用:

  1. 导入需要处理的图像,可以使用importFile函数来导入。例如:
image = importFile("image.jpg");
  1. 对图像进行灰度化处理,可以使用convertGrayscale函数来实现。例如:
gray_image = convertGrayscale(image);
  1. 对灰度图像进行高斯滤波,可以使用gaussianBlur函数来实现。例如:
blurred_image = gaussianBlur(gray_image, 3);
  1. 对滤波后的图像进行边缘检测,可以使用edgeDetection函数来实现。其中,Canny算法需要设置参数为"Canny"。例如:
canny_edges = edgeDetection(blurred_image, "Canny", 0.1, 0.3);

这里的0.1和0.3是Canny算法中的高低阈值。

  1. 根据需求对检测到的边缘进行处理,可以使用Lingo提供的其他图像处理函数来实现,例如用polygon函数将检测到的边缘用多边形框出来。例如:
polygon(canny_edges);

最后,可以使用savePicture函数将处理后的图像保存到本地。例如:

savePicture(canny_edges, "canny_output.jpg");

以上就是在Lingo中应用Canny算法的基本步骤。需要注意的是,Canny算法的高低阈值的取值会影响到边缘检测的结果,需要根据实际需求进行调整。

5.Canny算法python中应用

Canny算法是一种常用的边缘检测算法,用于图像处理领域。在Python中,可以使用OpenCV库来实现Canny算法的应用。下面是一个基本的示例代码:

import cv2

# 读取需要处理的图像
img = cv2.imread("image.jpg")

# 灰度化处理
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 高斯滤波
blur_img = cv2.GaussianBlur(gray_img, (3, 3), 0)

# 边缘检测
edges = cv2.Canny(blur_img, 100, 200)

# 显示结果
cv2.imshow("Canny Edge Detection", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例代码中,我们使用了OpenCV库来进行图像的读取和处理。首先,我们将彩色图像转换为灰度图像。然后,我们对灰度图像进行高斯滤波,以去除图像中的噪声。接下来,我们使用Canny算法进行边缘检测,其中100和200分别表示Canny算法的高低阈值。最后,我们使用imshow函数将结果显示出来。

需要注意的是,Canny算法的高低阈值的取值会影响到边缘检测的结果,需要根据实际需求进行调整。此外,本示例代码中的图像读取和结果显示的代码可能需要根据具体的开发环境进行调整。

6.Canny边缘检测算法的优点与缺陷

  1. 准确性较高:能够检测到图像中大多数的边缘,并能够消除边缘上的锯齿形状。

  2. 抵抗噪声:在图像处理前进行高斯滤波处理,能够有效地消除噪声。

  3. 对于公共和弱边缘的处理:通过使用双阈值处理,能够对公共和弱边缘进行处理,从而得到更加准确的边缘。与以往的方法相比,Canny边缘检测算法能够得到更加准确的边缘,同时相对于其它边缘检测算法,该算法能够消除边缘上的锯齿形状,并对噪声有较好的抵抗能力。不过该算法存在以下缺陷和需要改进的部分:

  4. 对噪声敏感:在高斯滤波过程中,如果滤波器的大小没有选择好,会导致边缘检测的精度下降;同时噪声较多时,算法仍然存在误检的情况。

  5. 无法检测闭合轮廓:Canny算法对于闭合轮廓的检测能力较弱,可能出现断裂的情况。

  6. 阈值的选择困难:Canny算法需要根据不同的图像进行阈值的选择,如选择高阈值和低阈值时需要根据实际需求来调整参数。

对于以上缺陷,可以采用以下方法改进:

  1. 对于噪声敏感问题,可以采用去噪方法,如中值滤波、小波变换等去除图像中的噪声。

  2. 对于闭合轮廓检测问题,可以采用霍夫直线变换等方法辅助边缘连接,在形成闭合轮廓时更准确。

  3. 阈值的选择可以采用自适应阈值法,如Otsu算法等,来自动确定高低阈值,提高阈值选择的稳健性。

  4. 另外,可以通过使用更加高级的边缘检测算法,如基于深度学习的边缘检测方法等,来进一步提高边缘检测的准确度。

7.个人感悟

​ Canny算法是一种经典的图像边缘检测算法,早在30多年前的1986年就已经提出,至今仍然被广泛地应用。经过多年的研究和改进,Canny算法的性能逐渐提高,但仍然存在一些局限性和不足之处。目前,许多研究者正在基于Canny算法进行改进和优化,以适应不同领域和应用的需要。

​ 个人认为,Canny算法的优点在于其简单直观、高效准确,并且具有广泛的应用。但其缺点也比较明显,例如针对不同形状和大小的边缘检测效果不够稳定,同时易受到噪声的影响。

​ 针对Canny算法的缺点,可以考虑结合其他技术方法进行改进和优化。例如,结合小波变换可以对图像进行多尺度边缘检测,从而获得更准确、稳定的结果。此外,亦可采用深度学习的方法,在Canny算法的基础上进一步提高边缘检测算法的准确率和鲁棒性。总之,Canny算法是一种十分经典的算法,在实际应用中具有广泛的应用。尽管Canny算法存在一些缺陷,但在其基础上进行改进,可以获得更好的边缘检测结果,这也是研究者们持续关注和努力的方向。前提是能够在实践中找到明显存在且需要改进的问题。

8.文献查找

  1. “An edge detection algorithm based on wavelet transform for the underwater movement target” (2023)

该文献提出一种利用小波变换边缘检测算法的方法,用于检测水下移动目标。该方法利用小波变换的多尺度分析抑制噪声,并通过Canny算法实现精确的边缘提取。实验结果表明,该方法对水下移动目标的边缘检测效果明显优于其他常用方法。

  1. “A New Approach to Deal with Canny Edge Detection Algorithm Challenges”(2022, 英文)

​ 该文献提出一种新的边缘检测方法,用于处理Canny边缘检测算法中存在的挑战。该方法采用了Michaelis-Menten算法和Sigmapoint卡尔曼滤波方法,并基于其它特征提取和分类技术来改进Canny算法。实验结果表明,该方法比Canny算法在边缘检测准确度和图像噪声下的抵抗能力方面更优。

  1. “Robust Edge Detection: A Comparative Study” (2021, 英文)该文献比较了多种边缘检测算法,包括Canny算法、Sobel算法,Laplacian算法等,

    这些算法的性能进行了评估和比较。作者还提出一种改进的边缘检测算法,基于渐减梯度和自适应的非极大抑制方法。实验结果表明,改进算法在大多数实验场景下表现更优。

  2. “A Combined Edge Detection Algorithm by Canny & Sobel for Face Recognition System” (2020)

​ 该文献提出一种结合Canny和Sobel算法的边缘检测方法,用于人脸识别系统中的图像分析。该方法在Canny算法的基础上加入了Sobel算法的信息,以提高对边缘的响应。实验结果表明,该方法在人脸检测和特征提取方面具有较好的表现。

  1. “A Robust Edge Detection Algorithm for Blood Cell Segmentation Using Canny Filter and Watershed Transform” (2019)

​ 该文献提出一种针对血细胞显微镜图像的边缘检测方法,结合Canny算法和分水岭变换来实现血细胞的分割。该方法引入了梯度矩阵方向和梯度极值处理,以增强边缘检测算法的稳健性。实验结果表明,该方法对血细胞分割表现出色。

  1. “Edge Detection by Extremal Optimization Based on Canny Detection Method” (2018, 英文)

​ 该文献提出了一种基于极值优化算法的边缘检测方法,基于Canny算法进行改进。该方法通过极值优化来搜索最优的Canny算法阈值,并使用局部自适应阈值来优化边缘检测结果。实验结果表明,该方法在多种图像上表现优于标准Canny算法。

  1. “A novel Canny edge detection method based on sparse representation”

(2022)

​ 该文献提出了一种基于稀疏表示的Canny边缘检测方法。该方法利用高斯小波变换和稀疏表示算法来平滑输入图像,同时保留图像细节信息。实验结果表明,该方法在边缘检测方面能够更准确和更鲁棒。

8.“An Improved Canny Edge Detection Algorithm for In-Vehicle Camera” (2021)

该文献提出了一种针对车载摄像头的改进版Canny边缘检测算法。该方法通过引入自适应高斯滤波和中值滤波来降低图像噪声,以及采用自适应双阈值法来减少漏检和误检。实验结果表明,该方法对于车载视觉应用的图像有更好的噪声去除和更准确的边缘检测效果。

9.“An Improved Canny Edge Detection Algorithm Based on Adaptive Non Maximum Suppression” (2022,国内)该文献提出了一种改进版的Canny边缘检测算法,基于自适应非极大值抑制方法,解

​ 决了传统Canny算法对信噪比低图像的较差性能。实验结果表明,该算法在边缘检测准确度方面有明显提高。

10.“A Method of Fast Canny Edge Detection on GPU” (2021,国内)

​ 该文献提出了一种基于GPU的快速Canny边缘检测算法。该算法利用CUDA并行计算技术,达到了高效计算和优化的目的。实验结果表明,该算法与传统Canny算法在计算时间上相比有明显优势。

11.“Canny Edge Detection Algorithm-Based Automated Detection of Particle Defects in Large-Scale Manufacturing” (2019,国外)

​ 该文献提出了一种基于Canny算法的粒子缺陷自动检测方法,用于大规模制造业。该算法采用了自适应双阈值法和改进的非极大值抑制方法,以实现对图像中粒子缺陷的自动检测。实验结果表明,该方法对于各种不同类型的粒子缺陷能够实现准确和可靠的检测。

12.“A Method of Fast Canny Edge Detection on GPU” (2021,国内)

​ 该文献提出了一种基于GPU的快速Canny边缘检测算法。该算法利用CUDA并行计算技术,达到了高效计算和优化的目的。实验结果表明,该算法与传统Canny算法在计算时间上相比有明显优势。

  • 30
    点赞
  • 174
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不掉发的小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值