图像分割之边缘检测

图像分割是指将图像中具有特殊意义的不同区域划分开来,这些区域互不相交,每个区域满足灰度、纹理、彩色的某种相似性准则。图像分割是图像分析过程中最重要的步骤之一,分割出的区域可以作为后续特征提取的目标对象。
图像分割的方法非常多,一般采用的方法有边缘检测(edge detection)、边界跟踪(edge tracing)、区域生长(region growing)、区域分离和聚合等。图像分割一般基于图像灰度值的不连续性或其相似性。不连续性是基于图像灰度的不连续变化分割图像,如针对图像的边缘有边缘检测、边界跟踪、Hough变换等算法;相似性是根据事先制定的准则将图像分割为相似的区域,如阈值分割区域增长等。下面针对几个常见的图像分割方法进行介绍。
1, 边缘检测
图像的边缘是图像的最基本的特征,边缘点是指图像中周围像素灰度有阶跃变化或屋顶变化的那些像素点,即灰度值导数较大或极大的地方。图像属性中的显著变化通常反映了属性的重要意义和特征。边缘检测可以大幅度的减少数据量,并且剔除那些被认为不相干的信息,保留图像的结构属性。
1.1, 边缘检测基本步骤
(1) 平滑滤波:由于梯度计算易受噪声影响,因此第一步是用滤波去除噪声。但是,降低噪声的平滑能力越强,边界强度的损失越大。
(2) 锐化滤波:为了检测边界,必须确定某点邻域中的灰度变化。锐化操作加强了存在有意义的灰度局部变化位置的像素点。
(3) 边缘判定:图像中存在许多梯度不为零的点,但是对于特定应用,不是所有点都有意义,这需要根据具体情况去选择和去除处理点,具体方法包括二值化处理和过零检测等。
(4) 边缘连接:将间断的边缘连接成为有意义的完整边缘,同时去除假边缘。主要方法是Hough变换。
1.2,边缘检测方法的分类
通常可以把边缘检测的算法分为两类:基于查找的算法和基于零穿越的算法。除此之外,还有Canny边缘检测算法、统计判别方法等。基于查找的算法是指通过寻找图像中一阶导数中的最大和最小值来检测边界。通常将边界定位在梯度最大的方向,是基于一阶导数的边缘检测算法。基于零穿越的算法是指通过寻找图像中二阶导数零穿越来寻找边界。通常是拉普拉斯零点或者非线性差分表示的过零点,是基于二阶导数的边缘检测算法。基于一阶导数的边缘算子包括Roberts算子、Sobel算子、Prewitt算子等,它们都是梯度算子;基于二阶导数的边缘检测算子主要是高斯-拉普拉斯边缘检测算子。
1.3,边缘检测算子
Roberts算子利用局部差分算子寻找边缘,边缘定位精度高,但是容易丢失一部分边缘,同时由于图像没经过平滑处理,因此不具备抑制噪声的能力。该算子对具有陡峭边缘且含噪声小的图像效果较好。Sobel算子和Prewitt算子都考虑了邻域信息,相当于对图像先做加权平滑处理,然后做微分运算,所不同的是平滑部分的权值有一些差异,因此对噪声有一定的抑制能力,但是不能完全排除检测结果中出现的虚假边缘。虽然这两个算子边缘定位效果不错,但检测出来的边缘容易出现多像素宽。
高斯-拉普拉斯算子,运用拉普拉斯算子之前先进行高斯低通滤波,这是因为拉普拉斯算子是一个二阶导数,对噪声有过强的敏感性,而且其幅值会产生双边缘,这是复杂分割中不希望的结果,解决的办法是利用它对阶跃性边缘的零交叉性质来定位边缘。并且边缘方向也不可检测。高斯-拉普拉斯算子,简称LoG算子,应用时,高斯函数中的标准差参数的选择很关键,它对图像边缘检测效果有很大的影响,不同图像对应不同参数。该算法提高了拉普拉斯算子的抗噪声能力,但是在抑制噪声的同时把原有的比较尖锐的边缘也平滑掉了,造成这种尖锐边缘无法检测到,常用的LoG算子是5×5的模板。
Canny边缘检测算子。前面介绍的都是基于微分方法的边缘检测算法,都是要求图像没有噪声或者先通过平滑去除噪声的前提下才能正常应用。在图像边缘检测中,抑制噪声和边缘精确定位是无法同时满足的,一些边缘检测算法通过平滑滤波去除噪声的同时,也增加了边缘定位的不确定性;而提高边缘检测算子对边缘敏感性的同时,也提高了对噪声的敏感性。Canny算子力图在抗噪声干扰和精确定位之间寻求最佳折中方案。对边缘的错误检测率要尽可能的低,尽可能检测出图像的真实边缘,且尽可能减少检测出虚假边缘,这要求信噪比尽量大,因为输出信噪比越大,错误率越小,同时对单边缘最好只有一个响应。因此,Canny边缘检测的基本思想就是首先对图像选择一定的Gauss滤波器进行平滑化滤波,然后采用非极值抑制技术进行处理得到最后的边缘图像(所谓非极值抑制技术就是用一阶偏导的有限差分来计算梯度的幅值和方向,然后将非局部极大值点置零以得到细化的边缘)。
最后用双阈值算法检测和连接边缘,所谓双阈值算法检测就是使用两个阈值a和b
(a的阈值小于b),从而得到两个阈值边缘图像,使用高阈值得到的图像B含有很少的假边缘但是有间断,双阈值算法要在由低阈值得到的图像A中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在A的8个邻点位置寻找可连接到轮廓上的边缘,这样,算法不断在A中搜集边缘,直到将B连接起来为止。B用来找每条线段,A用来在这些线段的两个方向上延伸找边缘的断裂处,并连接这些边缘。

Matlab中的相关函数

BW = edge(I)
gpuarrayBW = edge(gpuarrayI)
BW = edge(I,'sobel')
BW = edge(I,'sobel',thresh)
BW = edge(I,'sobel',thresh,direction)
BW = edge(I,'sobel',...,options)
[BW,thresh] = edge(I,'sobel',...)
BW = edge(I,'prewitt')
BW = edge(I,'prewitt',thresh)
BW = edge(I,'prewitt',thresh,direction)
[BW,thresh] = edge(I,'prewitt',...)
BW = edge(I,'roberts')
BW = edge(I,'roberts',thresh)
BW = edge(I,'roberts',...,options)
[BW,thresh] = edge(I,'roberts',...)
BW = edge(I,'log')
BW = edge(I,'log',thresh)
BW = edge(I,'log',thresh,sigma)
[BW,thresh] = edge(I,'log',...)
BW = edge(I,'zerocross',thresh,h)
[BW,thresh] = edge(I,'zerocross',...)
BW = edge(I,'canny')
BW = edge(I,'canny',thresh)
BW = edge(I,'canny',thresh,sigma)
[BW,thresh] = edge(I,'canny',...)

你可能感兴趣的:(计算机视觉,SimpleCV,图像处理,计算机视觉,Matlab)