matlab之Canny边缘检测

转载自:https://blog.csdn.net/humanking7/article/details/46606791

文章目录
        Canny边缘检测基本特征如下:
        Canny边缘检测算法步骤:
        步骤详解
            步骤1:用高斯滤波器平滑处理原图像
            步骤2:用一阶偏导的有限差分进行计算梯度的幅值和方向
            步骤3:对梯度幅值进行非极大值抑制
            步骤4:用双阈值算法检测和连接边缘
        代码
            主函数代码
            Canny边缘检测函数代码
        结果对比
            对比图像
            分析

图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。
Canny边缘检测基本特征如下:

(1) 必须满足两个条件:①能有效地抑制噪声;②必须尽量精确确定边缘的位置。
(2) 根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3) 类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
Canny边缘检测算法步骤:

步骤1:用高斯滤波器平滑处理原图像;
步骤2:用一阶偏导的有限差分进行计算梯度的幅值和方向;
步骤3:对梯度幅值进行非极大值抑制;
步骤4:用双阈值算法检测和连接边缘。


步骤详解
步骤1:用高斯滤波器平滑处理原图像



    使用平滑滤波的原因从根本上来说是边缘检测算子中的导数计算。导数计算对噪声十分敏感,如果不提前使用滤波器加以改善,则在导数计算后,噪声将会被放大,使得检测出来的虚假边缘变多,不利于边缘的提取。

平滑滤波和边缘检测是一对矛盾的概念。一方面,平滑滤波能够有效的抑制噪声,而在此过程中会使得图像边缘模糊,增加了边缘定位的不确定性。另一方面,平滑滤波能够除去对边缘检测中导数运算敏感的噪声,有效的抑制了虚假边缘的产生。实际工程经验表明,高斯滤波器可以在抗噪声干扰和边缘检测精确定位之间提供一个较好的折中方案。


步骤2:用一阶偏导的有限差分进行计算梯度的幅值和方向

图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈,边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘.


由上图可以看出,一阶导数可以用于检测图像中的一个点是否是边缘点(也就是判断一个点是否在斜坡上)。同样,二阶导数的符号可以用于判断一个边缘像素是否在亮的一边还是暗的一边。
用一阶偏导的有限差分来计算梯度的幅值和方向。
 

图中,图a经过梯度计算后的得到梯度三维示意图b。图b中x和y代表图像像素位置,竖轴的数值反映了梯度幅值的大小。由公式(3-17)可知,边缘方向与梯度方向是相垂直的,如图b所示。

 

步骤3:对梯度幅值进行非极大值抑制


步骤4:用双阈值算法检测和连接边缘

matlab代码:

Img = imread('cameraman.tif'); % 读取图像
M = size(Img);            % 计算图像大小
if numel(M)>2             %判断图像是否是彩色图像
    gray = rgb2gray(Img); % 图像灰度变换
else
    gray = Img;
end

Cimg = edge(gray,'canny');
figure(1);
subplot(121); imshow(gray,[]); title('原图');
subplot(122); imshow(Cimg,[]); title('Canny边缘检测');

猜你喜欢

转载自blog.csdn.net/fengxianghui01/article/details/89475897