图像分割人工智能大作业Word下载.docx
《图像分割人工智能大作业Word下载.docx》由会员分享,可在线阅读,更多相关《图像分割人工智能大作业Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
其中比较典型的方法是基于阈值的分割方法,在实际的应用中,阈值分割的方法也往往能取得好的分割效果,很大程度上影响着后续的图像处理和图像分析的效果,图像阈值分割是指能够找到一个能把图像分割为目标和背景的最优阈值。
图像阈值分割方法一般根据不同理论将问题转化,根据不同的理论,阈值分割一般先构造一个评价函数,然后求解关于这个函数的最优化问题,因此许多利用群体智慧的算法也被应用到了阈值分割中,例如蚁群算法,神经网络算法,遗传算法,在此我将遗传算法应用到了图像的阈值分割中。
2.问题表示与算法描述
在算法中根据遗传算法的原理结合图像的特征,将图像中的每一个像素看作一条染色体,并对每一条染色体进行编码,然后通过交叉变异的方法找到最优解。
遗传算法主要包括四个部分:
1.编码和种群的初始化,一般采用二进制的方法进行编码,种群的初始化即是指产生一组可行解X,X是n*m大小的矩阵,n是种群的大小,m是染色体的长度,X的每一个行向量代表一个染色体;
2.定义适值函数,选择个体。
由适值函数可以计算出每个染色体(即可行解)的适值,按一定的选择机制f对新种群中的染色体进行选择,得到进化后的种群X´
=f(X);
3.交叉变异运算,交叉运算在种群体中按照交叉率选择出父体,这些父体两个一组,在每组染色体中随机选择一个或多个点进行基因交换,变异运算在种群中按变异率选出染色体,在每个选出的染色体中随机选择一个或多个点,并改变该点的基因,种群X´
经过交叉变异运算得到一个新种群X´
´
,X´
为n*m矩阵;
4.终止条件.将X´
的值赋给X,重复进行交叉变异运算和定义适值函数并选择个体,直到满足一定的终止条件。
图像中的每个像素可以看作是一个染色体,对像素的灰度值进行编码后可得到染色体的基因序列。
染色体应该向着适值最大的方向进化,即在进化过程中越来越适应环境,会产生一个最优的阈值,但最优阈值事先无法确定,所以染色体进化的方向也无法确定,即遗传算法无法进行。
所以首先设置一个初始阈值,让个体向着这个阈值代表的方向进化,然后根据选择机制选择出来的新群体更新阈值。
群体代表了图像的灰度值特征,阈值更新后应将群体复原。
随着阈值的不断更新,群体的进化最后趋于稳定。
当群体每次进化得到的阈值趋于稳定时,则说明该阈值是最优的阈值。
下面对每一阶段做详细的介绍。
Ø
编码和种群的初始化
在文中是对灰度图像进行处理,灰度值的取值范围为0~255,故用二进制表示,染色体的长度L应该为8,染色体的值可用一个向量表示,如若一点的灰度值为255,则染色体的向量可以表示为x=[11111111]。
在进行算法计算之前,先生成初始种群,随机生成种群,种群大小为n。
在最开始时生成初始种群,随机生成n个染色体。
X={x(i)=round(rand(1,L))}
其中rand(1,L)是指生成L个取值为0~1的数,round是指在一定的阈值th下,小于th的数值为0,大于th的数值为1,round将x(i)化为了只包含0,1取值的向量,即将向量的值用二进制表示。
定义适值函数更新种群个体
定义适值函数,对合适的个体进行筛选,设种群X对应的图像灰度值为Y(Y是n*1的向量),则x(i)对应的图像灰度值为y(i),y(i)是标量,用0~L之间的正数来初始化阈值T0=L*rand
(1),T0为初始阈值,Ti为进化了i次后得到的阈值(i=1,2,3……),进化了i次后,每条染色体对应的适应值为
f(i)=1/(|yi-T(i-1)|+1),f(i)(0,1],i=1,2,3……,n
其中|yi-T(i-1)|是像素值与阈值的差的绝对值。
计算出适应值后,将适应值进行如下的累加计算,生成新的适应值矩阵Fn。
Fn=[f1,f2,f3,……,fi]
随机产生一个1*n的矩阵,矩阵中的元素值取值0~1,并将矩阵中元素按照值的大小从小到大排列,如下所示。
Ms=[ms1,ms2,……,msn],其中ms1>
ms2>
……msn
接下来进行种群的更新,将新的适应值矩阵元素与产生的随机矩阵的元素做对比,判断是否淘汰不合格的染色体,产生新的种群
X(i);
Ms(i)<
=Fn(i)
NX(i)=
0;
Ms(i)>
Fn(i)
其中X(i)为原始种群,NX(i)为更新后的种群,在更新的过程中淘汰掉了不适合的染色体,是生物进化论中“优胜劣汰”的应用。
使群体向最优化更适应的方向进化。
在更新产生了新的群体后,需要对阈值也进行一次更新,在进化了i次后得到新的阈值的公式为T=(i/(i+1))*T+(1/(i+1))*Ti,Ti是根据新的种群所求得的值,Ti=(NX(i))/n。
交叉变异运算
交叉和变异是有单点和多点的,因为灰度像素值化成二进制后染色体较短,故使用单点交叉变异,进行交叉时,要首先设定好交叉率,根据交叉率选出染色体,然后两个染色体一组进行交叉,每组染色体的交叉点是随机产生的,然后从该点将2条染色体截断,并将截断部分进行交换得到两条新的染色体,例如染色体x1=[00101001],x2=[01000110],交叉点为左起第五个基因,则经交叉运算后得到2个新的染色体,x1’=[00100110],x2’=[01001001]。
交叉进行完后根据变异率选择出染色体,对每个选出的染色体首先随机产生一个变异点,然后将该点对应的基因进行逻辑非运算,即可得到变异后的新个体。
产生了新的种群。
算法流程
本文的算法对灰度图像进行分割处理,所用算法为遗传算法,算法具体进行的流程如下:
1.产生初始种群X;
2.初始化最优阈值T和初始阈值T0,这里T=T0;
3.对种群进行适应度的计算并筛选染色体得到新的种群X´
,计算Ti;
4.对新的种群X´
按照交叉率和变异率进行交叉和变异运算,得到新的种群
5.X´
;
6.更新T的值,T=(i/(i+1))*T+(1/(i+1))*Ti;
7.迭代次数是否到了n次,若足够n次了,就跳出,得到T的值,若不够n次,则继续进行3~5的步骤。
3.算法实现程序说明
如图,为本系统实现的程序清单,共包括九个m文件,其中imasegment.m是算法处理的主程序;
initpop.m是产生初始种群的函数,初始种群值为二进制数;
calfitval.m是计算适应值得函数;
selection.m是根据适应值对种群进行更新;
crossover.m是种群染色体进行交叉的函数;
mutation.m是种群染色体进行变异的函数;
Tvalue.m是对阈值T进行更新的函数;
decodebinary.m和decodechrom.m是将二进制数转化为十进制的函数。
4.程序实验结果分析
对于此算法,我在matlab2011a平台上进行了实现,下面对实验的结果进行展示和分析,试验中所用灰度图片是我在网页上下载下来的三幅图像,如图(a)(b)(c)所示。
(a)(b)
(c)
在此实验中的迭代次数设为800,通过多次运行程序发现若迭代次数太少,得出的阈值的值不稳定,随着迭代次数增多,阈值结果最后逐渐趋于一个稳定的值,但所付出的代价是花费了更多的时间,所以选一个较合适的迭代次数,800次。
实验的初始阈值T0为所用图片的灰度平均值aver,准确的定位初始值,可以使结果更快的达到稳定状态。
aver=()/(M*N)
其中f(i,j)为图像的像素点的像素值,M、N是图像的尺寸。
T初始值等于T0的值。
原始种群的染色体数量为500,当然原始种群的规模越大,所得到的阈值结果越稳定越准确,可是越大的种群规模所要付出的代价也是时间的消耗,故选择合适的种群数量500。
遗传算法中的交叉率和变异率分别为0.8和0.2。
在matlab平台上运行,结果如图(d)(e)(f)所示,为用遗传算法阈值分割后得到的二值图像。
(d)(e)
(f)
上面三幅图为阈值分割后的二值化图像,可以看到图像的特征在进行二值化阈值分割后都凸显了出来,但是从图(e)中看到,图像中还是存在很多噪点,这与原始图像的质量有一定的关系,但也与阈值的选取有关,所得的图像不够理想,但整体来看分割所得到的结果还是比较好的,噪点也可以通过一些去噪的的算法将噪点消除。
在对图像进行处理时分割图像的T的值变化情况如图(g)(h)(m)所示。
(g)
(h)
(m)
从上面的三幅图中可以看出,T的值在迭代次数较低时是很不稳定的跳变幅度较大,随着迭代次数的增多,T值逐渐趋于稳定,所得值即为所要求的阈值结果,可以从图中看出图(a)(b)(c)的阈值分别为133,130,128。
所得结果较理想,可以实现比较好的阈值分割效果。
5.程序清单
imasegment.m
%算法的主程序
clf;
clear;
f=imread('
image.tif'
);
%读取一幅图像
imshow(f);
f0=double(f);
[fwidth,flength,as]=size(f);
fsum=0;
fori=1:
fwidth
forj=1:
flength
fsum=fsum+f0(i,j);
end
end
aver=round(fsum/(fwidth*flength))
popsize=500;
%种群大小
chromlength=10;
%字符串长度
pc=0.8;
%交叉概率
pm=0.2;
%变异概率
T0=aver*1023/255;
%初始阈值aver*1023/255
Ti=T0;
pop=initpop(popsize,chromlength);
800%800为迭代次数
fitval=calfitval(pop,Ti);
%计算适应度
[newpop,Ti]=selection(pop,fitval,Ti);
%选择,复制
Ti*255/1023;
[newpop]=crossover(pop,pc);
%交叉
[newpop]=mutation(pop,pc);
%变异
[T,T0]=Tvalue(Ti,i,T0);
%更新T的值
T*255/1023;
y(i)=T*255/1023;
z(i)=Ti*255/1023;
x(i)=i;
pop=newpop;
figure,plot(x,y)
figure,plot(x,z)
T=round(T*255/1023)
fwidth%将图像背景和前景分离
if(f(i,j)>
T)
f1(i,j)=255;
elsef1(i,j)=0;
figure,imshow(f1);
initpop.m
%实现群体初始化,popsize为群体大小,chromlength为染色体长度
functionpop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));
%rand随机产生每个单元为{0,1}行数为popsize,列数为chromle
calfitval.