在一幅图像中,人们往往只对其中的某些目标感兴趣,而这些目标通常占据一定的区域,并且在某些特性上(如灰度,轮廓,颜色及纹理等)上和周围的图像有差别。这些差别可能很明显也可能很微小,随着计算机图像处理技术的发展,使得人们可以通过计算机来对图像进行某些方面的处理。其中,生活中最常见的就是图像识别技术(面部识别,指纹识别等),而图像识别的基础就是图像分割。所以讲,图像分割是后续高级图像处理学习的基础。
1.图像分割的基本知识
图像分割,就是图像中反应物体真实情况的,占据不同区域的,具有不同特性的目标区分开来,并形成数字特征。在现实生活的不同领域内,图像分割有着不同的叫法,但其核心是相同的。
1.1图像分割简单定义
(1)定义
图像分割是指将一幅图像分解为若干互不交叠的,有意义的,具有相同性质的区域。
(2)优秀的图像分割应具有的特点
a.分割出来的各区域对某种特性(比如灰度)而言具有相似性,区域的内部是连通的,且没有过多小孔;
b.相邻区域对分割所依据的性质有明显的差异;
c.区域的边界是明显的。
在实际的区域分割算法中,只能寻求较为满足上述特点的方法。因为,若是过于强调同一区域内性质一致性,则分割区域会产生很多小孔和一些不规整的边界;若是过于强调相邻区域显著的差异,则有很多分割区域就会合并到一起。所以,不同的分割技术总是在各种特点中寻求一种平衡。
(3)图像分割算法的共性
图像分割是图像处理和计算机视觉方便的经典难题,至今没有统一的标准进行评判,因此每年都会涌现出很多分割技术。然而,它们大多数遵循图像在像素级的两个性质:相似性和不连续性。属于同一目标的区域具有相似性,属于不同目标的区域在边界出现不连续性。
2.边缘检测
人们可能最先研究的就是基于边缘的图像分割方法,基于在图像的边缘灰度变化的往往比较剧烈,它试图通过检测图像中不同区域的边缘来实现对图像的分割。
2.1边缘检测概述
(1)概述
边缘检测技术非常重要,因为边缘时所要提取目标与背景的分界线,提取出边缘才能将目标与背景分隔开。
在图像中,边缘往往表征一个特征区域的终结和另一个特征区域的开始,边界所分开区域的内部特征或属性是一致的,而不同区域内部的特征或属性是不同的,边缘检测正是利用物体和背景在某种图像特征上的差异来实现的,这些差异包括灰度,颜色,纹理等。
边缘检测的实质就是检测图像特性发生变化的位置。
(2)基本内容
由于图像中噪音和模糊的存在,检测的边界很可能变宽或在某些点发生间断。因此,边缘检测包括两大基本内容:
**a.**抽取出反映灰度变化的边缘点;
**b.**剔除某些边界点或填补边缘间断点,并将这些边缘连接成线。
(3)边缘的基本知识
a.边缘
是指图像中像素灰度有阶跃变化或屋顶状变化的那些像素的集合。
b.边缘分类
1.阶跃状边缘:阶跃状边缘位于两边的像素灰度值有明显不同的地方(跳变后保持不变);
2. 屋顶状边缘:屋顶状边缘位于灰度值从增加到减少的转折处(跳变后又恢复原状)。
阶跃状和屋顶状边缘其邻近灰度方向导数变化情况,见下图:
2.2常见边缘检测算子
边缘检测算法中,通过边缘检测算子来检测图像的边缘是最为简单,也是最为经典的边缘检测方法。其基本思想是通过考察图像的每个像素点在某个邻域内灰度的变化,利用边缘邻近的一阶或二阶导数变化规律来判断该像素是否在图像区域的边界上。
2.2.1梯度算子检测边缘
最为简单的边缘检测算子就是梯度边缘算子,掌握了其边缘检测的方法,余下较复杂的边缘检测方法便能迎刃而解了。下面着重介绍利用梯度边缘算子检测边缘的算法。
(1)梯度定义式及简化计算
函数f(x,y)在(x,y)处的梯度为一个向量:
计算这一向量的大小:
模板表示:
(2)检测边缘点步骤
- 计算梯度图像;
2)选取适当的阈值T,对梯度图像进行二值化;
当Grad[f (x,y)]≥T时,令f (x,y)=l,则为阶跃状边缘点。否则f (x,y)=0,形成一幅边缘二值图像。
(3)举例
源代码:
%1.边缘检测
%(1)梯度算子法
mImg = imread('rice.png');
if size(mImg,3)>1%判读入图像是否为灰度图,不是,则转化成灰度图
mImg = rgb2gray(mImg);
end
mImg = im2double(mImg);
mBlock = [-1 1];%梯度算子
mImgDy = imfilter(mImg, mBlock, 'replicate');%滤波函数imfilter
mImgDx = imfilter(mImg, mBlock','replicate');
mImgDxy = sqrt(mImgDy.*mImgDy+mImgDx.*mImgDx);
figure;
subplot(221), imshow(mImg),title('灰度图');
subplot(222), imshow(mat2gray(abs(mImgDy))),title('横向偏导后图像');
subplot(223), imshow(mat2gray(abs(mImgDx))),title('纵向偏导后图像');
subplot(224), imshow(mat2gray(mImgDxy)),title('梯度图');
vThred = 0.3;%设定阈值
mImgDxy = mat2gray(mImgDxy);%根据阈值将灰度图转化成二值图像,以便更好地体现出边缘
mImgDxy(mImgDxy<vThred) = 0;
mImgDxy(mImgDxy>=vThred) = 1;
mImgDxy = bwmorph(mImgDxy, 'thin');
figure,imshow(mImgDxy),title('二值图像');
其中,若对函数imfilter有兴趣,请参见imfilter函数详解