数字图像处理论文图像分割方法研究Word文档格式.docx
- 文档编号:17271611
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:16
- 大小:676.66KB
数字图像处理论文图像分割方法研究Word文档格式.docx
《数字图像处理论文图像分割方法研究Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字图像处理论文图像分割方法研究Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
按照通用的分割定义,分割出的区域需同时满足均匀性和连通性的条件。
其中均匀性是指该区域中的所有像素点都满足基于灰度,纹理,彩色等特征的某种相似性准则;
连通性是指在该区域内存在连接任意两点的路径。
设F表示一幅图像中所有像素的集合,P(.)是有关均匀性的假设,分割定义为把F划分成若干子集(S1,S2,…,Sn),其中每一个子集都构成一个空间连通区域,即
且P(.)满足
和
P(
)=false,若Si与Sj在空间相邻
符合上述定义的分割计算十分复杂和困难,图像处理和视觉界的研究者们为此付出了长期的努力。
迄今为止,大部分研究成果都是针对某一类型图像,某一具体应用的分割,通用方法和策略仍面临者巨大的困难。
本文我们将对图像分割的方法进行分析和对比。
2主要理论概况
主要介绍课题相关理论基本方法
多数分割算法均基于灰度值的两个基本性质之一:
在第一类中,方法是以灰度突变为基础分割一幅图像,比如图像的边缘。
在第二类中,主要方法是根据一组预定义的准则将一幅图像分割为相似的区域。
阈值处理。
区域生长,区域分裂和区域聚合都是这类方法的例子。
这些方法在一定程度上依赖人类判断来识别区域的存在,并通过勾画边界或选择某个亮度值范围来定义它们。
还有一些方法从不完整的定义开始,不断细化分割,已达到更大的精度和一致性,完全自动的技术会确定有多少类物体出现,并将图像完全细分,并将图像完全细化,以将这些物体隔离出来。
但它们在小型计算机系统中应用甚微,且效率通常要比人工输入的效率低。
普通图像分割任务可视为分类问题的一个例子。
就像多数涉及要素或人工智能的技术那样,它可能不会使用与人类采用的相同输入或决策方法,但会力求实现相同的结果(且有时是成功的)。
卫星成像中一直使用了一种成功的一般分类方法,卫星图像中存在许多波段的数据。
如果在高维空间中画出图像中的每个像素点,空间中的各个坐标轴表示各个波段中的亮度,那么应用于土地利用,作物类型,土壤或岩性等的不同类型的点将会聚集在一起,且这些聚类彼此能很好地分开。
3.图像分割算法
3.1阈值处理
采用与阈值处理的方法,目标和背景像素会具有两种主要模式的灰度级。
一种从背景上提取对象的明显方法是选取一个阈值T来分离这两种模式。
任何满足f(x,y)>
=T的点(x,y)称为对象点,其他点则称为背景点。
换言之,阈值处理后的图像g(x,y)定义为
g(x,y)=
标注为1的像素对应于对象,而标注为0的像素则对应于背景。
T为常数时,这种方法称为全局阈值处理;
T在一幅图像上改变时,称为可变阈值处理。
3.1.1全局阈值处理
当物体和背景像素的灰度分布十分明显时,可以用适用于整个图像的全局阈值。
选取阈值的一种方法是目视检查直方图。
如图3.1所示的直方图有两个不同的模式,我们可以很容易地选取一个阈值T来分开他们。
图3.1
在大多数应用中,通常图像之间有较大变化,即使全局阈值是一种合适的方法,对每一幅图像有能力自动估计阈值的算法也是需要的。
下面的迭代算法可用于这一目的:
1.为全局阈值T选择一个初始估计值。
2.用T分割该图像。
这将产生两组像素:
G1由灰度值大于T的所有像素组成,G2由所有小于等于T的像素组成。
3.对G1和G2的像素分别计算平均灰度值(均值)m1和m2.
4.计算一个新的阈值:
T=1/2(m1+m2)
5.重复步骤2到步骤4,直到连续迭代中的T值间的差小于一个预定义的参数ΔT为止。
Matlab程序:
I=imread('
E:
/images/bear1.jpg'
);
f=rgb2gray(I);
T=0.5*(double(min(f(:
))))+double(max(f(:
)));
done=false;
while~done
g=f>
=T;
Tnext=0.5*(mean(f(g))+mean(f(~g)));
done=abs(T-Tnext)<
0.5;
T=Tnext;
end
T1=T/255;
T2=graythresh(f);
subplot(1,3,1);
imshow(f);
title('
原图像'
subplot(1,3,2);
bw1=im2bw(f,T1);
imshow(bw1);
迭代算法处理'
subplot(1,3,3);
bw2=im2bw(f,T2);
imshow(bw2);
graythresh函数处理'
执行效果:
3.1.2可变阈值处理
在一幅图像中的每一点(x,y)计算阈值,该阈值是以一个或多个在(x,y)邻域计算的特性为基础的。
虽然这可能是似乎有点费力的处理,但现代算法和硬件允许进行快速的邻域处理,特别是对于像逻辑操作和算术操作这样的普通函数。
functiong=localthresh(f,nhood,a,b,meantype)
%Intialize.
f=double(f);
%Computethelocalstandarddeviations.
SIG=stdfilt(f,nhood);
%ComputeMEAN.
ifnargin==5&
&
strcmp(meantype,'
global'
)
MEAN=mean2(f);
else
MEAN=localmean(f,nhood);
%Thisisacustomfunction.
end
%Obtainthesegmentedimage.
g=(f>
a*SIG)&
(f>
b*MEAN);
>
f=imread('
/images/ceils.tif'
g=localthresh(f,ones(3),30,1.5,'
subplot(1,2,1);
原图'
subplot(1,2,2);
imshow(g);
局部阈值处理结果'
)
3.2边缘检测
图像边缘是由于相邻像素间灰度值剧烈变化引起的。
根据微分原理,对于图像中变化比较平坦的区域,因相邻像素的灰度变化剧烈,所以梯度幅值较大,因此用一阶导数幅值的大小可以判断图像中是否有边缘以及边缘的位置。
同理,二阶导数的符号可以用于判断一个边缘像素是在亮的一侧还是在暗的一侧。
常用的边缘检测算子有sobel,prewitt,Roberts,log,zerocrossing,canny等。
i=imread('
/images/lena.jpg'
I=rgb2gray(i);
bw1=edge(I,'
zerocross'
bw2=edge(I,'
prewitt'
bw3=edge(I,'
canny'
bw4=edge(I,'
sobel'
bw5=edge(I,'
roberts'
bw6=edge(I,'
log'
subplot(2,4,1);
imshow(I);
subplot(2,4,2);
zerocross边缘图'
subplot(2,4,3);
prewitt边缘图'
subplot(2,4,4);
imshow(bw3);
canny边缘图'
subplot(2,4,5);
imshow(bw4);
sobel边缘图'
subplot(2,4,6);
imshow(bw5);
roberts边缘图'
subplot(2,4,7);
imshow(bw6);
log边缘图'
3.3区域分割
阈值分割法由于没有或很少考虑空间关系,使多阈值选择受到限制,基于区域的分割方法可以弥补这点不足。
该方法利用的是图像的空间性质,认为分割出来的属于同一区域的像素具有相似的性质,其概念是相当直观的。
传统的区域分割法有区域生长和分裂合并法。
3.3.1区域生长
区域生长是根据预先定义的生长准则来吧像素或子区域集合成较大区域的处理方法。
基本处理方法是以一组“种子”点开始来形成生长区域,即将那些预定义属性类似于种子的领域像素附加到每个种子上(如指定的灰度级或颜色)。
由一个或多个开始点组成的集合的选择通常可基于问题的性质。
当没有先验的信息可用时,一种处理方法是在每一个像素上计算同一组属性,在生长过程期间,这些属性最终将用于把像素分配到区域中。
若这些计算结果显示了一簇值,则应把具有这些特性的像素放在可以作为种子的这些簇的质心。
相似性准则的选择不但依赖于所思考的问题,而且依赖于可用的图像数据类型。
例如,利用人造卫星图像进行陆地分析会严重依赖于颜色的使用。
另外还要考虑像素间的连通性和邻近性,否则有时会出现无意义的结果。
区域生长中的另一个问题是停止规则的公式表达。
一般来说,当不再有像素满足该区域所包含的准则时,生长区域的过程就会停止。
准则(如亮度值,纹理,色彩)实际上是局部的,在区域生长的“历史”中不予考虑。
Matlab代码:
%Segmentbasedonarea,RegionGrowing;
clearall;
closeall;
clc
/images/group.jpg'
if(~(size(I,3)-3))
I=rgb2gray(I);
%转化为单通道灰度图
I=im2double(I);
%图像灰度值归一化到[0,1]之间
Ireshape=imresize(I,[600,800]);
I=Ireshape(51:
475,200:
699);
gausFilter=fspecial('
gaussian'
[55],0.5);
I=imfilter(I,gausFilter,'
replicate'
%种子点的交互式选择
if(exist('
x'
'
var'
)==0&
exist('
y'
)==0)
subplot(2,2,1),imshow(I,[]);
holdon;
[y,x]=getpts;
%鼠标取点回车确定
x=round(x
(1));
%选择种子点
y=round(y
(1));
if(nargin==0)
reg_maxdist=0.1;
%nargin是matlab代码编写中常用的一个技巧,主要用于计算当前主函数的输入参数个
%数,一般可以根据nargin的返回值来确定主函数输入参数的缺省值。
在实现中,如果
%用户输入的参数个数为零,那么默认为0.2
J=zeros(size(I));
%主函数的返回值,记录区域生长所得到的区域
Isizes=size(I);
reg_mean=I(x,y);
%表示分割好的区域内的平均值,初始化为种子点的灰度值
reg_size=1;
%分割的到的区域,初始化只有种子点一个
neg_free=10000;
%动态分配内存的时候每次申请的连续空间大小
neg_list=zeros(neg_free,3);
%定义邻域列表,并且预先分配用于储存待分析的像素点的坐标值和灰度值的空间,加速
%如果图像比较大,需要结合neg_free来实现matlab内存的动态分配
neg_pos=0;
%用于记录neg_list中的待分析的像素点的个数
pixdist=0;
%记录最新像素点增加到分割区域后的距离测度
%下一次待分析的四个邻域像素点和当前种子点的距离
%如果当前坐标为(x,y)那么通过neigb我们可以得到其四个邻域像素的位置
neigb=[-10;
10;
0-1;
01];
%开始进行区域生长,当所有待分析的邻域像素点和已经分割好的区域像素点的灰度值距离
%大于reg_maxdis,区域生长结束
while(pixdist<
0.06&
reg_size<
numel(I))
%增加新的邻域像素到neg_list中
forj=1:
4
xn=x+neigb(j,1);
yn=y+neigb(j,2);
%检查邻域像素是否超过了图像的边界
ins=(xn>
=1)&
(yn>
(xn<
=Isizes
(1))&
(yn<
=Isizes
(1));
%如果邻域像素在图像内部,并且尚未分割好;
那么将它添加到邻域列表中
if(ins&
J(xn,yn)==0)
neg_pos=neg_pos+1;
neg_list(neg_pos,:
)=[xn,yn,I(xn,yn)];
%存储对应点的灰度值
J(xn,yn)=1;
%标注该邻域像素点已经被访问过并不意味着,他在分割区域内
end
%如果分配的内存空问不够,申请新的内存空间
if(neg_pos+10>
neg_free)
neg_free=neg_free+100000;
neg_list((neg_pos+1):
neg_free,:
)=0;
%从所有待分析的像素点中选择一个像素点,该点的灰度值和已经分割好区域灰度均值的
%差的绝对值时所待分析像素中最小的
dist=abs(neg_list(1:
neg_pos,3)-reg_mean);
[pixdist,index]=min(dist);
%计算区域的新的均值
reg_mean=(reg_mean*reg_size+neg_list(index,3))/(reg_size+1);
reg_size=reg_size+1;
%将旧的种子点标记为已经分割好的区域像素点
J(x,y)=2;
%标志该像素点已经是分割好的像素点
x=neg_list(index,1);
y=neg_list(index,2);
%pause(0.0005);
%动态绘制
%if(J(x,y)==2)
%plot(x,y,'
r.'
%end
%将新的种子点从待分析的邻域像素列表中移除
neg_list(index,:
)=neg_list(neg_pos,:
neg_pos=neg_pos-1;
J=(J==2);
%我们之前将分割好的像素点标记为2
holdoff;
subplot(2,2,2),imshow(J);
J=bwmorph(J,'
dilate'
%补充空洞
subplot(2,2,3),imshow(J);
subplot(2,2,4),imshow(I+J);
3.3.2分裂合并法
区域生长法是先从单个种子像素开始通过不断接纳新像素最后得到整个区域。
分裂合并法是先从整幅图像开始通过不断分裂得到各个区域。
实际中常先把图像分成任意大小且不重叠的区域,然后再合并或分裂这些区域以满足分割的要求。
这类方法中,常需要根据图像的统计特性设定图像区域属性的一致性测度,其中最常用的测度多基于灰度统计特征,例如同属性区域中的方差(VWHR)。
下面利用图像四叉树表达简单分裂合并算法。
图3.2简单的区域分裂过程
3.4形态学分水岭分割
分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。
分水岭的概念和形成可以通过模拟浸入过程来说明。
在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。
分水岭的计算过程是一个迭代标注过程。
分水岭比较经典的计算方法是L.Vincent提出的。
在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。
首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。
分水岭变换得到的是输入图像的集水盆图像,集水盆之间的边界点,即为分水岭。
显然,分水岭表示的是输入图像极大值点。
因此,为得到图像的边缘信息,通常把梯度图像作为输入图像,即
g(x,y)=grad(f(x,y))={[f(x,y)-f(x-1,y)]2[f(x,y)-f(x,y-1)]2}0.5
式中,f(x,y)表示原始图像,grad{.}表示梯度运算。
分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。
但同时应当看出,分水岭算法对微弱边缘具有良好的响应,是得到封闭连续边缘的保证的。
另外,分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。
为消除分水岭算法产生的过度分割,通常可以采用两种处理方法,一是利用先验知识去除无关边缘信息。
二是修改梯度函数使得集水盆只响应想要探测的目标。
为降低分水岭算法产生的过度分割,通常要对梯度函数进行修改,一个简单的方法是对梯度图像进行阈值处理,以消除灰度的微小变化产生的过度分割。
即
g(x,y)=max(grad(f(x,y)),gθ)
式中,gθ表示阈值。
I=imread('
/images/tower.jpg'
h=fspecial('
%h=fspecial(type)createsatwo-dimensionalfilterhofthespecifiedtype.fspecialreturnshas
%acorrelationkernel,whichistheappropriateformtousewithimfilter.typeisastringhavingoneofthesevalues.
fd=double(I);
%double使数据变成双精度
g=sqrt(imfilter(fd,h,'
).^2+imfilter(fd,h'
).^2);
figure;
g2=imclose(imopen(g,ones(3,3)),ones(3,3));
imshow(g2);
im=imextendedmin(g2,10);
%
Lim=watershed(bwdist(im));
%watershed分水岭算法Lim的值greaterthanorequalto0,等于0是分水岭脊像素
em=Lim==0;
g3=imimposemin(g2,im|em);
g4=watershed(g3);
imshow(g4);
g5=I;
g5(g4==0)=255;
imshow(g5);
4.小结
本文详述了阈值处理,边缘检测,区域分割,分水岭分割等经典算法,并采用matlab实现,也对人工智能基础上的分类算法做了简述。
图像分割是图像处理与机器视觉的基本问题之一,在图像处理中占据重要位置和起核心作用。
本文在总结经典算法的基础上,又做了适当扩充,是算法更具普适性和健壮性。
参考文献:
[1]RafaelC.Gonzalez数字图像处理(第三版)电子工业出版社2007.8
[2]JohnC.Russ数字图像处理(第六版)电子工业出版社2014.8
[3]张弘数字图像处理与分析(第二版)机械工业出版社2015.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 论文 图像 分割 方法 研究