更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId=1003594013
所谓边缘是指其周围像素灰度有变化的那些像素的集合。边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间。物体的边缘是由灰度不连续所反映的。基于边缘的分割代表了一大类基于图像边缘信息的方法,常用于图像分割。
更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId=1003594013
1.边缘检测的基本原理及常用边缘检测算子
边缘检测的实质是采用某种算法来提取出图像中对象与背景间的交界线。我们将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。以下是对几种经典的边缘检测算子进行理论分析,并对各自的性能特点做出了比较和评价。
人们以这些理论为依据,提出了许多算法,其中比较常用的边缘检测方法有差分边缘检测、Roberts 边缘检测算子、Sobel 边缘检测算子、Prewitt 边缘检测算子、Robinson 边缘检测算子、Laplace 边缘检测算子、Canny 算子和 LOG 算子等等。
(1)差分边缘检测方法
利用像素灰度的一阶导数算子在灰度迅速变化处得到高值来进行奇异点的检测。它在某一点的值就代表该点的“边缘强度”,可以通过对这些值设置阈值来进一步得到边缘图像。然而,用差分检测边缘必须使差分的方向与边缘方向垂直,这就需要对图像的不同方向都进行差分运算,增加了实际运算的繁琐性。
一般为垂直边缘、水平边缘、对角线边缘检测,如下所示:
差分边缘检测方法是最原始、最基本的方法。根据灰度迅速变化处一阶导数达到最大(阶跃边缘情况)原理,要求差分方向与边缘方向垂直,利用导数算子检测边缘。这种算子具有方向性,运算繁琐,目前很少采用。
(2)Roberts 边缘检测算子
Roberts 边缘检测算子根据任意一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差,即:
适当选取门限 TH,并作如下判断:如果 R(i, j)>TH,则(i, j)为阶跃状边缘点,{R(i, j)}为边缘图像。
Roberts 算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘,定位精度高,但对噪声敏感。
(3)Sobel 边缘检测算子
数字图像{f (i, j)}的每个像素,考察它上下左右邻点灰度的加权差,与之接近的邻点的权大。据此,定义 Sobel 算子如下:
适当选取门限 TH,并作如下判断:如果 R(i, j)>TH,则(i, j)为阶跃状边缘点,{R(i, j)}为边缘图像。
Sobel 算子很容易在空间上实现,Sobel 边缘检测器不但产生较好的边缘检测效果,而且受噪声的影响也比较小。当使用大的邻域时,抗噪性能会更好,但这样会增加计算量,并且得出的边缘也会相应变粗。
Sobel 算子利用像素点上下、左右邻点的灰度加权算法,根据在边缘点处达到极值这一现象进行边缘的检测。Sobel 算子对噪声具有平滑作用,提供较为精确的边缘方向信息,但它同时也会检测出许多伪边缘,边缘定位精度不够高。当对精度要求不是很高时,它是一种较为常用的边缘检测方法。
(4)Prewitt 边缘检测算子
Prewitt 边缘检测算子是一种边缘样板算子。这些算子样板由理想的边缘子图像构成。依次用边缘样板去检测图像,与被检测区域最为相似的样板给出最大值。用这个最大值作为算子的输出值 P(i, j),这样可将边缘像素检测出来。
定义 Prewitt 边缘检测算子模板如下:
8个算子样板所对应的边缘方向如图 所示。适当选取门限 TH,并作如下判断:如果 P(i,j)>TH,则(i,j)为阶跃状边缘点,{P(i,j)}为边缘图像。
(5)Robinson 边缘检测算子
Robinson 边缘检测算子也是一种边缘样板算子,其算法和 Prewitt 边缘检测算子相似,只是 8 个样板不同,如图所示。
(6)Laplace 边缘检测算子
Laplace 边缘检测算子是一种二阶微分算子,对于数字图像{ f (i,j)},它在图像中的位置(i,j)的 Laplace 定义如下:
Laplace 边缘检测算子是无方向性的算子,它比前面所述的多个方向导数算子的计算量要小,因为只用一个模板,且不必综合各模板的值。计算数字图像的 Laplace 值也是借助各种模板卷积实现的。实现 Laplace 运算的几种模板可见下图。在数字图像中,可用差分来近似微分运算,若选用图 7-4 中的第一个检测模板,则 f (i,j)的 Laplace 算子为:
几种常用的实现 Laplace 运算的检测模板如图所示。
由于 Laplace 算子是一种二阶导数算子,对图像中的噪声相当敏感。另外它常产生双像素宽的边缘,且也不能提供边缘方向的信息。由于以上原因,Laplace 算子很少直接用于检测边缘,而主要用于已知边缘像素后确定该像素是在图像的暗区或明区一边。
2.各种边缘检测算子的 MATLAB 实现及效果比较
在 MATLAB 中可以由 edge 函数实现各算子对边缘的检测,以 Roberts 算子为例,其语法格式如下:
BW=edge(I,’roberts’)
BW=edge(I,‘roberts’,thresh)
[BW,thresh]=edge(I,‘roberts’,⋯)
BW=edge(I,‘roberts’)自动选择阈值用 Robert 算子进行边缘检测。
BW=edge(I,‘roberts’,thresh)根据所指定的敏感阈值 thresh 用 Robert 算子进行边缘检测,它忽略了所有小于阈值的边缘。当 thresh 为空时,自动选择阈值
[BW,thresh]=edge(I,‘roberts’,⋯)返回阈值。
edge 函数对灰度图像 I 进行边缘检测,返回与 I 同样大的二值图像 BW,其中 1 表示边缘,0 表示非边缘。I 是 unit8 型、unit16 型,或者是 double 型,BW 是 unit8 型。
其余 Sobel 算子、Prewitt 算子、LOG 算子、Canny 算子的实现仅需将‘roberts’用‘sobel’、‘prewitt’、‘log’、‘canny’代替即可。
例:具体实现这几个算子的一个例程
I=imread('cameraman.tif');
BW1 = edge(I,'sobel'); %应用 Sobel 算子进行滤波
BW2 = edge(I,'roberts'); %应用 Roberts 算子进行滤波
BW3 = edge(I,'prewitt'); %应用 Prewitt 算子进行滤波
BW4 = edge(I,'log'); %应用 LOG 算子进行滤波
BW5 = edge(I,'canny'); %应用 Canny 算子进行滤波
subplot(2,3,1),imshow(I),title('原图');
>> subplot(2,3,2),imshow(BW1),title('Sobel算子边缘检测');
>> subplot(2,3,3),imshow(BW2),title('Roberts算子');
>> subplot(2,3,4),imshow(BW3),title('Priwitt算子');
>> subplot(2,3,5),imshow(BW4),title('LOG算子');
>> subplot(2,3,6),imshow(BW5),title('Canny算子');
更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId=1003594013