Canny算子Matlab实现

article/2025/9/23 18:59:31

1、Canny边缘提取原理

Canny边缘检测方法利用了梯度方向信息,采用“非极大抑制”以及双阈值技术,获得了单像素连续边缘,是目前所认为的检测效果较好的一种边缘检测方法。
先利用高斯函数对图像进行低通滤波;然后对图像中的每个像素进行处理,寻找边缘的位置及在该位置的边缘法向,并采用一种称之为“非极值抑制”的技术在边缘法向寻找局部最大值;最后对边缘图像做滞后阈值化处理,消除虚假响应。
Canny为一个边缘检测算法自定义了目标集,并用优化的方法实现了边缘检测。根据Canny的说法,一个边缘算子必须满足的三个准则是:
(1)低错误率:边缘算子应该只对边缘响应,并能找到所有的边,而对于非边缘应能舍弃。
(2)定位精度:被边缘算子找到的边缘像素与真正的边缘像素间的距离应该尽可能的小。
(3)在单边存在的地方,检测结果不应出现多边。
需要找到一个能够使三个准则都得到优化的滤波器函数。
假设滤波器函数是f,那么滤波器函数对边缘B的响应由下面的卷积给出:
在这里插入图片描述
最后Canny证明了Gaussian函数的一阶导数是边缘检测滤波器的有效近似。
在一维情况下,Gaussian函数为:
在这里插入图片描述
对x的微分为:
在这里插入图片描述
二维情况下Gaussian函数为:
在这里插入图片描述
二维Gaussian函数在x、y方向上有偏导数,与Canny优化的边缘检测滤波器近似的是G’。所以把输入图像和G’进行卷积,得到一个边缘增强的图像。
卷积实现起来比较简单,但是计算量大,而对于二维卷积计算是成倍增长的。由于一个二维的高斯卷积可以分解成两个一维的高斯卷积,而且微分也可以分解成两个方向上的一维卷积,因此Canny用一维卷积实现了边缘检测算法。
高斯卷积得到的边缘图像还存在一些具有较高梯度值、非边缘的点,这对真正的边缘是一种干扰,应该去除掉。对于一个边缘像素,都有一个与该点所在的边垂直的梯度方向,并且该像素的梯度值要大于该边两侧的像素的梯度值。Canny根据这种思想用抑制非极大值点的算法对梯度图像做了后续处理,最后得到了理想的梯度图像。

2、 算子计算步骤:

(1) 先利用高斯平滑滤波器来平滑图像以除去噪声(即用高斯平滑滤波器与图像作卷积);
(2) 计算梯度的幅值和方向
在这里插入图片描述
(3)对梯度幅值进行非极大值抑制;
(4) 用双阈值检测和连接边缘。

3、Matlab实现

 clc;clear all;close all;I=rgb2gray(imread('F:\D_Photogrammetry\DSC00438.JPG.jpg'));     Img=double(I);  sz=size(I); %%  第一步、Gaussian卷积平滑滤波alf=3;  n=7; n0=floor((n+1)/2);for i=1:n    %%Gaussian卷积核计算for j=1:n  h(i,j)=exp(-((i-n0)^2+(j-n0)^2)/(2*alf))/(2*pi*alf);  end  end  Img_n=uint8(conv2(Img,h,'same'));  % 通过创建的高斯卷积核进行高斯滤波,并转换为8为整型数据figure(); imshow(I);     title('Gray Image');  figure(); imshow(Img_n);   title('Gaussian Filter Result'); M = zeros(sz(1),sz(2));
theta = zeros(sz(1),sz(2));
canny1 = zeros(sz(1),sz(2));%非极大值抑制
canny2 = zeros(sz(1),sz(2));%双阈值检测和连接Img_n=double(Img_n);    for i=2:(sz(1)-2)  for j=2:(sz(2)-2)  %%     第二步 计算x 和 Y 方向的幅度和方向梯度Sx=Img_n(i-1,j-1)+2*Img_n(i,j-1)+Img_n(i+1,j-1)-Img_n(i-1,j+1)-2*Img_n(i,j+1)-Img_n(i+1,j+1);  Sy=Img_n(i+1,j-1)+2*Img_n(i+1,j)+Img_n(i+1,j+1)-Img_n(i-1,j-1)-2*Img_n(i-1,j)-Img_n(i-1,j+1);  M(i,j)=sqrt(Sx^2+Sy^2);  %记录幅度值theta(i,j)= atan(Sx/Sy);%记录方位角,反应梯度方向,与梯度垂直的方向即为边缘方向%%     第三步,分四个方向进行比较,非极大值抑制dirc = theta(i,j);if abs(dirc) <= pi / 8if (M(i,j) > M(i-1,j-1) )&&( M(i,j)> M(i+1,j+1) )canny1(i, j) = M(i, j);endelseif abs(dirc) >= 3 * pi / 8if (M(i,j) > M(i-1,j-1) )&&( M(i,j)> M(i+1,j+1) )canny1(i, j) = M(i, j);endelseif dirc > pi / 8 && dirc < 3 * pi / 8if ( M(i,j) > M(i-1,j-1) )&&( M(i,j)> M(i+1,j+1) )canny1(i, j) = M(i, j);endelseif dirc > - 3 * pi / 8 && dirc < - pi / 8if (M(i,j) > M(i-1,j-1) )&&( M(i,j)> M(i+1,j+1) )canny1(i, j) = M(i, j);endendend  end  %% 第四步,双阈值监测和边缘连接 lowTh  = 0.2 *max(max(canny1));%高阈值higtTh = 0.4 *max(max(canny1));%低阈值
for i = 2 : sz(1)for j = 2 : sz(2)if canny1(i,j) >lowTh && canny1(i,j) < higtThcanny2(i,j) = canny1(i,j);endend
endfigure() ;imshow(uint8(M)); title('Canny Amplitude values'); figure() ;imshow(uint8(canny1)); title('Nonmaximum inhibition:Canny1 Edge detection results'); figure() ;imshow(uint8(canny2)); title('Double threshold monitoring:Canny2 Edge detection results'); 

4、结果

在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/cXpwsyhn.shtml

相关文章

canny算子的python实现以及pytorch实现

canny算子的python实现以及pytorch实现 canny的python实现canny的pytorch实现 canny的python实现 参考Canny边缘检测算法(python 实现&#xff09; import numpy as np import cv2 as cv from matplotlib import pyplot as pltdef smooth(image, sigma 1.4, length 5) :&qu…

Python 使用cv2.canny 进行图像边缘检测

CV2提供了提取图像边缘的函数canny。其算法思想如下&#xff1a; 1. 使用高斯模糊&#xff0c;去除噪音点&#xff08;cv2.GaussianBlur&#xff09;2. 灰度转换&#xff08;cv2.cvtColor&#xff09;3. 使用sobel算子&#xff0c;计算出每个点的梯度大小和梯度方向4. 使用非极…

计算机视觉中Canny算子详解

文章目录 前言一、Canny的实现步骤二、具体实现1.高斯平滑滤波2.计算梯度大小和方向3.非极大抑制4.双阈值(Double Thresholding)和滞后边界跟踪 总结 前言 Canny边缘检测是一种非常流行的边缘检测算法&#xff0c;是John Canny在1986年提出的。它是一个多阶段的算法&#xff0c…

Canny 边缘检测算法

目录 一、边缘检测的步骤 二、最优边缘定义 三、Canny边缘检测算法步骤 1.对图像进行灰度化&#xff1a; 2.对图像进行高斯滤波&#xff1a; 3. 计算梯度幅值和方向 4.非极大值&#xff08;Non-Maximum Suppression&#xff09;抑制 5.用双阈值算法检测和连接边缘 代…

Canny算法

Canny Canny分为5个步骤 1)、使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。 高斯滤波器是一种平滑空间滤波器&#xff0c;用于模糊处理和降低噪声。我们的高斯滤波器通过以下公式得到。 我们运用该公式计算出高斯卷积核&#xff0c;如k越大&#xff0c;检测…

OpenCv之Canny

目录 一、自适应阈值 二、边缘检测Canny 一、自适应阈值 引入前提:在前面的部分我们使用是全局闻值&#xff0c;整幅图像采用同一个数作为闻值。当时这种方法并不适应与所有情况&#xff0c;尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应闻…

图像处理——Canny算子

首先感谢以下两位的渊博知识&#xff1a; &#xff08;1&#xff09;爱鱼 https://www.cnblogs.com/mightycode/p/6394810.html &#xff08;2&#xff09;mitutao https://www.cnblogs.com/love6tao/p/5152020.html 图像边缘信息主要集中在高频段&#xff0c;通常…

Canny算子与霍夫变换检测圆与直线

目录 引言 一、canny算子 二、canny算子代码 三、霍夫变换检测直线 四、霍夫变换检测直线代码 五、霍夫变换检测直线效果 六、霍夫变换检测圆 七、霍夫变换检测圆代码 八、霍夫变换检测圆效果 引言 canny算子是计算机视觉最常用的一种算子&#xff0c;是目前一种非常流行…

OpenCV——Canny边缘检测(cv2.Canny())

Canny边缘检测 Canny 边缘检测是一种使用多级边缘检测算法检测边缘的方法。1986 年&#xff0c;John F. Canny 发 表了著名的论文 A Computational Approach to Edge Detection&#xff0c;在该论文中详述了如何进行边缘 检测。 Canny()边缘检测步骤 Canny 边缘检测分为如下…

(十一)Canny 边缘检测算法

Canny边缘检测算法 一、边缘检测的步骤 1&#xff09;滤波&#xff1a; 边缘检测的算法主要是基于图像强度的一阶和二阶导数&#xff0c;但导数通常对噪声很敏感&#xff0c; 因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波、均值滤波…

Canny边缘检测算法的实现

图像边缘信息主要集中在高频段&#xff0c;通常说图像锐化或检测边缘&#xff0c;实质就是高频滤波。我们知道微分运算是求信号的变化率&#xff0c;具有加强高频分量的作用。在空域运算中来说&#xff0c;对图像的锐化就是计算微分。由于数字图像的离散信号&#xff0c;微分运…

【canny边缘检测】canny边缘检测原理及代码详解

文章目录 前言canny边缘检测算法主要流程一、高斯模糊二、图像梯度计算三、非极大值抑制四、双阈值边界跟踪 前言 本文通过介绍canny边缘检测原理与代码解析&#xff0c;希望能让大家深入理解canny边缘检测 canny边缘检测算法主要流程 canny边缘检测主要分为4个部分&#xff…

Canny边缘检测原理

一. Canny基本思想 1. 边缘检测 解析&#xff1a;边缘是对象和背景之间的边界&#xff0c;还能表示重叠对象之间的边界。边缘检测是图像分割的一部分&#xff0c;图像分割的目的是识别出图像中的区域。边缘检测是定位边缘像素的过程&#xff0c;而边缘增强是增加边缘和背景之…

Canny边缘检测

边缘检测发展 Canny 边缘检测是一种从不同视觉对象中提取有用结构信息并显着减少要处理的数据量的技术。它已广泛应用于各种计算机视觉系统。 Canny 发现&#xff0c;在不同的视觉系统上应用边缘检测的要求是比较相似的。因此&#xff0c;可以在各种情况下实施满足这些要求的边…

Canny边缘检测算法(python 实现)

文章目录 最优边缘准则算法实现步骤1. 应用高斯滤波来平滑(模糊)图像&#xff0c;目的是去除噪声2. 计算梯度强度和方向3. 应用非最大抑制技术NMS来消除边误检4. 应用双阈值的方法来决定可能的&#xff08;潜在的&#xff09;边界5. 利用滞后技术来跟踪边界 opencv实现Canny边缘…

左外连接和右外连接是什么样的?

1左外连接 左表的记录都会出现在结果集中&#xff0c;并上右表与之对应的部分&#xff0c;如果右表没有&#xff0c;使用null填充。 举例。 select * from people p left join role r p.idr.id 左外连接结果&#xff1a; 2、右外连接 右表的记录都会出现在结果集中&#xf…

sql左外连接和右外连接的区别

一、数据集合不同 1、左外连接&#xff1a;是A和B的交集再并上A的所有数据。 2、右外连接&#xff1a;是A和B的交集再并上B的所有数据。 二、语法不同 1、左外连接&#xff1a;SELECT *FROM aLEFT OUTER JOIN bON a.ageId b.id。 2、右外连接&#xff1a;SELECT *FROM a…

MySQL自连接和内连接和外连接_左外连接+右外连接

自连接&#xff1a;将一张表看作两张表 练习&#xff1a;查询员工id&#xff0c;员工姓名及其管理者的id和姓名select emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name from employees emp,employees mgr where emp.manager_id mgr.employee_id;内连接 只是把左…

SQL--左外连接(LEFT JOIN)

LEFT JOIN 关键字从左表&#xff08;table1&#xff09;返回所有的行&#xff0c;即使右表&#xff08;table2&#xff09;中没有匹配。如果右表中没有匹配&#xff0c;则结果为 NULL。 SQL LEFT JOIN 语法: SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.c…

内连接、左连接、左外连接、右连接的区别

一&#xff1a;测试例子 存在如下两张表&#xff1a;年级与班级&#xff0c;表内容如下 班级表 二&#xff1a;内连接与自然连接 1&#xff1a;自然连接 对于select * from gradeclass gc where gc.grade_id in (select id from grade)&#xff0c;其结果如下图 其查询是把符…