基于边缘的分割方法

  • Post author:
  • Post category:其他


一、概念

边缘检测是检测图像特性发生变化的位置。不同的图像灰度不同,边界处会有明显的边缘,利用该特性可以分割图像。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,还保护了目标的边界结构。

常见的边缘分割算法包括Canny算法、Sobel算法、Prewitt算法等。这些算法通常将图像转换为灰度图像,然后通过计算像素值之间的梯度或差异来找到边缘。这些算法通常需要对梯度或差异进行阈值处理,以区分边缘和噪声。

除了基本的边缘分割算法外,还有一些更高级的技术,如基于机器学习的边缘分割算法和基于深度学习的边缘分割算法。这些算法通常需要训练数据集,并使用卷积神经网络(CNN)等技术进行分割。这里我们介绍传统的边缘分割方法。

二、边缘分割方法

(1)Canny算子

Canny算子是一种经典的边缘检测算法,它通过计算图像的梯度来检测边缘。该算法具有高精度、低误检和单一响应等优点,是计算机视觉中常用的边缘检测算法之一。

Canny算子的主要步骤包括:

  1. 噪声抑制:使用高斯滤波器平滑图像,以消除图像中的噪声。

  2. 计算图像梯度:使用Sobel算子计算图像在x和y方向上的梯度。

  3. 非极大值抑制:在梯度方向上,只有具有局部最大值的像素才会被认为是边缘像素。

  4. 双阈值检测:将所有像素分为三类:强边缘、弱边缘和非边缘。如果像素的梯度值高于高阈值,则被认为是强边缘,如果低于低阈值,则被认为是非边缘。如果像素的梯度值介于两个阈值之间,则被认为是弱边缘,需要进一步处理。

  5. 边缘连接:在保留强边缘的同时,将弱边缘与强边缘连接起来,形成完整的边缘。

Canny算子可以应用于各种类型的图像,特别是具有复杂纹理和噪声的图像。

在MATLAB中,可以使用

edge

函数来实现Canny算子边缘检测。如下:

% 采用Canny算子对含有噪声的图像进行边缘检测
I=imread('rice.png');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.01);% 添加高斯噪声
% BW=edge(I,'canny')该函数采用Canny算子对图像I进行边缘检测
%并采用自动计算的低阈值和高阈值进行图像分割,函数的返回值BW为二值图像
K=edge(J,'canny');
subplot(121),imshow(J);
title('原始图像');
subplot(122),imshow(K);
title('采用Canny算子提取的边缘');

实验截图:

edge函数功能强大,可以点击

matlab文档

查看。

(2)Sobel算子

Sobel算子是一种用于图像边缘检测的算子,其原理是将一个二维的图像与一个Sobel算子进行卷积,从而得到图像的边缘信息。Sobel算子可以分为水平和垂直两个方向,分别表示为Sobel_x和Sobel_y。

在水平方向上,Sobel_x的卷积核为:

-1  0  1
-2  0  2
-1  0  1

在垂直方向上,Sobel_y的卷积核为:

-1 -2 -1
 0  0  0
 1  2  1

将图像与这两个卷积核分别卷积得到两个结果,再将它们合并,即可得到图像的边缘信息。

Sobel算子是一种简单而有效的边缘检测算法,因为它可以很好地捕捉到图像中的梯度变化。Sobel算子广泛应用于图像处理领域,例如边缘检测、图像锐化等。

实验代码:

%边缘检测
%Sobel算子
Image=im2double(rgb2gray(imread('cat.jpg')));
subplot(2,2,1),imshow(Image),title('原图');
BW= edge(Image,'sobel');
subplot(2,2,2),imshow(BW),title('边缘检测');
H1=[-1 -2 -1;0 0 0;1 2 1];
H2=[-1 0 1;-2 0 2;-1 0 1];
R1=imfilter(Image,H1);
R2=imfilter(Image,H2);
edgeImage=abs(R1)+abs(R2);
subplot(2,2,3),imshow(edgeImage),title('Sobel梯度图像');
sharpImage=Image+edgeImage;
subplot(2,2,4),imshow(sharpImage),title('Sobel锐化图像');

实验结果:

(3)Roberts算子

Roberts算子又称为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。其缺点在于对边缘的定位不准确,提取的边缘线条较粗。在MATLAB中,可调用edge()函数,利用Roberts算子对图像进行边缘检测。

实验代码:

% 采用Roberts算子进行图像的边缘检测
I=imread('rice.png');
I=im2double(I);
% 调用格式BW=edge(I,'roberts',thresh)采用Roberts算子对图像I进行边缘检测,thresh为分割阈值(本例中为35/255)
% 该函数会忽略所有小于thresh的像素值,注意阈值需要进行归一化即变换到[0,1]之间
J=edge(I,'roberts',35/255);
subplot(121),imshow(I);
title('原始图像');
subplot(122),imshow(J);
title('采用Roberts算子提取的边缘');

实验结果:

(4)Prewitt算子

对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,需要采用更加复杂的3X3的算子,如Prewitt算子。Prewitt算子是一种基于梯度的边缘检测算子,它可以用于图像中边缘的检测和分割。Prewitt算子分为水平和垂直两个方向,分别计算图像中每个像素在这两个方向上的梯度,然后将其组合起来得到最终的边缘强度。其模板如下:

水平方向的Prewitt算子模板:

-1 -1 -1
 0  0  0
 1  1  1

垂直方向的Prewitt算子模板:

-1  0  1
-1  0  1
-1  0  1

这两个模板可以通过卷积操作应用于图像中的每个像素,以计算其在水平和垂直方向上的梯度值。然后,可以根据计算出的梯度值来计算每个像素的边缘强度,通常是通过计算梯度幅值来实现的。最后,可以根据设定的阈值对边缘强度进行二值化,以得到最终的边缘分割结果。

同时,Prewitt算子是一种线性算子,它对噪声比较敏感,因此在使用Prewitt算子进行边缘检测时,需要对图像进行预处理,例如平滑处理,以降低噪声的影响。

实验代码:

I=imread('cameraman.tif');
I=im2double(I);
[J1,thresh]=edge(I,'prewitt',[],'both');
[J2,thresh]=edge(I,'prewitt',[],'horizontal');
[J3,thresh]=edge(I,'prewitt',[],'vertical');
figure('NumberTitle','off','Name','prewitt算子进行边缘检测');
subplot(221);imshow(I);title('原始图像');
subplot(222);imshow(J1);title('采用prewitt算子进行边缘检测,方向为水平和垂直');
subplot(223);imshow(J2);title('采用prewitt算子进行边缘检测,方向为水平');
subplot(224);imshow(J3);title('采用prewitt算子进行边缘检测,方向为垂直');

实验结果:

(5)Log算子

LOG算子是一种基于高斯滤波的边缘检测算子,它可以用于图像中边缘的检测和分割。LOG算子的全称是Laplacian of Gaussian,即高斯拉普拉斯算子。该算子是通过先对图像进行高斯滤波,然后计算拉普拉斯算子来检测图像中的边缘。

实验代码:

% 采用LOG算子对含有噪声的图像进行边缘检测
I=imread('cameraman.tif');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.005);% 添加高斯噪声
% BW=edge(I,'log',thresh,sigma)该函数采用LOG算子对图像I进行边缘检测,
% 若不设置阈值tresh或tresh为空,系统会自动计算tresh值
% sigma为LOG滤波器的标准差默认位2
K=edge(J,'log',[],2.3);% 采用LOG算子提取边缘
subplot(121),imshow(J);
title('原始图像');
subplot(122),imshow(K);
title('采用LOG算子提取的边缘');

实验结果:

不同算子边缘检测对比如下:

三、小结

  1. Prewitt算子和Sobel算子:Prewitt算子和Sobel算子都是基于梯度的边缘检测算子,它们的模板非常相似,只是在模板中的权值不同。Prewitt算子的模板是由3×3的权值矩阵组成,而Sobel算子的模板则是由5×5的权值矩阵组成。此外,Sobel算子在计算梯度时采用的是加权平均值,因此在图像处理中更为常用。

  2. Roberts算子:Roberts算子是一种比较简单的边缘检测算子,其模板是由2×2的权值矩阵组成,比Prewitt和Sobel算子的模板更小。它的计算速度很快,但是它对噪声比较敏感,检测到的边缘也比较粗糙。

  3. Canny算子:Canny算子是一种非常经典的边缘检测算法,它在检测到边缘时具有较高的准确性和稳定性。与其他算子不同,Canny算子包括多个步骤,包括高斯平滑、计算梯度、非极大值抑制、双阈值处理和边缘链接等。

  4. LOG算子:LOG算子是一种基于高斯滤波的边缘检测算子,它先对图像进行高斯平滑,然后使用拉普拉斯算子计算边缘。与其他算子不同,LOG算子能够检测到更细微的边缘,但是由于使用了高斯滤波,它可能会丢失一些细节信息。

总的来说,不同的边缘检测算子适用于不同的场景和需求。选择合适的算子需要根据具体的情况进行选择和调整,以得到最佳的边缘检测效果。



版权声明:本文为weixin_44686138原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。