基于最大类间方差遗传算法的道路分割
2018-01-06 22:10
274 查看
最大类间方差的求解过程,就是在解空间中查找到一个最优的解,使得其方差最大,而遗传算法能非线性快速查找最优解k及最大的方差,其步骤如下:
1) 为了使用遗传算法,首先必须对实现解空间的数值编码,产生染色体单元。由于所采集到的道路图像的灰度图由0-255个灰度值组成,正好对应着一个8位二进制即一个字节,因此使用一个字节作为染色体。对于染色体的解码正好是编码的逆过程,就是这个字节的十进制数。
2)初始化种群,产生一个规模的染色体种群,并随机初始化每一染色体,得到多个不同的染色体,这个过程实际上决定了解的起始值,如果其选取过偏,则会造成最优解收敛慢,计算时间长的缺点。
3)对每个染色体进行解码。由最大类方差的分割阈值方法,可以设定其方差作为每一个染色体的评价函数,染色体的方差越大,就越有可能逼近最优解。求出每个染色体的适应值,对于所求得的适应值,求出每一个染色体的选择概率及累计概率并产生多个随机数。选择出随机概率对应的染色体作为遗传运算的一种种子,其中适应值打的被选取的可能性大,优胜劣汰。被选中的染色体作为遗传种子,进行遗传运算,这样一代一代地进行,每一代所得到的适应值都不相同,新一代中的染色体得到的适应值较高,因此,其解也更逼近于最大的值。
4)接下来进行遗传运算。首先进行杂交运算,杂交运算就是对染色体中的某些基因进行交换,此过程中为了控制交换的位数,必须给定一个杂交率。杂交率越大,其交换的基因越多,其值变化越快,解的收敛速度就越快;但杂交率太大,不利于求得最优解。
由最大类间方差分割法可知,对于每一个灰度值k,必须求得以下几个参数:w0、w1、u0、u1。不难发现对于每一个表达式都要求出pi的值,因此,可先求出每个pi的值。
1) 为了使用遗传算法,首先必须对实现解空间的数值编码,产生染色体单元。由于所采集到的道路图像的灰度图由0-255个灰度值组成,正好对应着一个8位二进制即一个字节,因此使用一个字节作为染色体。对于染色体的解码正好是编码的逆过程,就是这个字节的十进制数。
2)初始化种群,产生一个规模的染色体种群,并随机初始化每一染色体,得到多个不同的染色体,这个过程实际上决定了解的起始值,如果其选取过偏,则会造成最优解收敛慢,计算时间长的缺点。
3)对每个染色体进行解码。由最大类方差的分割阈值方法,可以设定其方差作为每一个染色体的评价函数,染色体的方差越大,就越有可能逼近最优解。求出每个染色体的适应值,对于所求得的适应值,求出每一个染色体的选择概率及累计概率并产生多个随机数。选择出随机概率对应的染色体作为遗传运算的一种种子,其中适应值打的被选取的可能性大,优胜劣汰。被选中的染色体作为遗传种子,进行遗传运算,这样一代一代地进行,每一代所得到的适应值都不相同,新一代中的染色体得到的适应值较高,因此,其解也更逼近于最大的值。
4)接下来进行遗传运算。首先进行杂交运算,杂交运算就是对染色体中的某些基因进行交换,此过程中为了控制交换的位数,必须给定一个杂交率。杂交率越大,其交换的基因越多,其值变化越快,解的收敛速度就越快;但杂交率太大,不利于求得最优解。
由最大类间方差分割法可知,对于每一个灰度值k,必须求得以下几个参数:w0、w1、u0、u1。不难发现对于每一个表达式都要求出pi的值,因此,可先求出每个pi的值。
function main() clear all; close all; clc; %定义全局变量 global chrom oldpop fitness lchrom popsize cross_rate mutation_rate yuzhisum global maxgen m n fit gen yuzhi A B C oldpop1 popsize1 b b1 fitness1 yuzhi1 %读入道路图像 A=imread('road1.jpg'); A=imresize(A,0.4); B=rgb2gray(A); %将RGB图像转化成灰度图像 C=imresize(B,0.1); %将读入的图像缩小 lchrom=8; %染色体长度 popsize=10; %种群大小 cross_rate=0.7; %杂交概率 mutation_rate=0.4; %变异概率 %最大代数 maxgen=150; [m,n]=size(C); '计算中,请稍等...' %初始种群 initpop; %遗传操作 for gen=1:maxgen generation; end findresult; %图像分割结果 %%%%%%输出进化各曲线%%%%%% figure; gen=1:maxgen; plot(gen,fit(1,gen)); title('最佳适应度值进化曲线'); figure; plot(gen,yuzhi(1,gen)); title('每一代的最佳阈值进化曲线'); %%%%%%初始化种群%%%%%% function initpop() global lchrom oldpop popsize chrom C imshow(C); for i=1:popsize chrom=rand(1,lchrom); for j=1:lchrom if chrom(1,j)<0.5 chrom(1,j)=0; else chrom(1,j)=1; end end oldpop(i,1:lchrom)=chrom; end %%%%%%子函数:产生新一代个体%%%%%% function generation() fitness_order; %计算适应度值及排序 select; %选择操作 crossover; %交叉 mutation; %变异 %%%%%%计算适度值并且排序%%%%%% function fitness_order() global lchrom oldpop fitness popsize chrom fit gen C m n fitness1 yuzhisum global lowsum higsum u1 u2 yuzhi gen oldpop1 popsize1 b1 b yuzhi1 if popsize>=5 popsize=ceil(popsize-0.03*gen); end %当进化到末期的时候调整种群规模和交叉、变异概率 if gen==75 cross_rate=0.3; %交叉概率 mutation_rate=0.3; %变异概率 end %如果不是第一代则将上一代操作后的种群根据此代的种群规模装入此代种群中 if gen>1 t=oldpop; j=popsize1; for i=1:popsize if j>=1 oldpop(i,:)=t(j,:); end j=j-1; end end %计算适度值并排序 for i=1:popsize lowsum=0; higsum=0; lownum=0; hignum=0; chrom=oldpop(i,:); c=0; for j=1:lchrom c=c+chr 4000 om(1,j)*(2^(lchrom-j)); end %转化到灰度值 b(1,i)=c*255/(2^lchrom-1); for x=1:m for y=1:n if C(x,y)<=b(1,i) lowsum=lowsum+double(C(x,y)); %统计低于阈值的灰度值的总和 lownum=lownum+1; %统计低于阈值的灰度值的像素的总个数 else higsum=higsum+double(C(x,y)); %统计高于阈值的灰度值的总和 hignum=hignum+1; %统计高于阈值的灰度值的像素的总个数 end end end if lownum~=0 %u1、u2为对应于两类的平均灰度值 u1=lowsum/lownum; else u1=0; end if hignum~=0 u2=higsum/hignum; else u2=0; end %计算适度值 fitness(1,i)=lownum*hignum*(u1-u2)^2; end %如果为第一代,从小往大排序 if gen==1 for i=1:popsize j=i+1; while j<=popsize if fitness(1,i)>fitness(1,j) tempf=fitness(1,i); tempc=oldpop(i,:); tempb=b(1,i); b(1,i)=b(1,j); b(1,j)=tempb; fitness(1,i)=fitness(1,j); oldpop(i,:)=oldpop(j,:); fitness(1,j)=tempf; oldpop(j,:)=tempc; end j=j+1; end end for i=1:popsize fitness1(1,i)=fitness(1,i); b1(1,i)=b(1,i); oldpop1(i,:)=oldpop(i,:); end popsize1=popsize; %大于一代时进行如下从小到大排序 else for i=1:popsize j=i+1; while j<=popsize if fitness(1,i)>fitness(1,j) tempf=fitness(1,i); tempc=oldpop(i,:); tempb=b(1,i); b(1,i)=b(1,j); b(1,j)=tempb; fitness(1,i)=fitness(1,j); oldpop(i,:)=oldpop(j,:); fitness(1,j)=tempf; oldpop(j,:)=tempc; end j=j+1; end end end %下边对上一代群体进行排序 for i=1:popsize1 j=i+1; while j<=popsize1 if fitness1(1,i)>fitness1(1,j) tempf=fitness1(1,i); tempc=oldpop1(i,:); tempb=b1(1,i); b1(1,i)=b1(1,j); b1(1,j)=tempb; fitness1(1,i)=fitness1(1,j); oldpop1(i,:)=oldpop1(j,:); fitness1(1,j)=tempf; oldpop1(j,:)=tempc; end j=j+1; end end %下边统计每一代中的最佳阈值和最佳适应度值 if gen==1 fit(1,gen)=fitness(1,popsize); yuzhi(1,gen)=b(1,popsize); yuzhisum=0; else if fitness(1,popsize)>fitness1(1,popsize1) yuzhi(1,gen)=b(1,popsize); %每一代中的最佳阈值 fit(1,gen)=fitness(1,popsize); %每一代中的最佳适应度 else yuzhi(1,gen)=b1(1,popsize1); fit(1,gen)=fitness1(1,popsize1); end end %%%%%%子函数:精英选择%%%%%% function select() global fitness popsize oldpop temp popsize1 oldpop1 gen b b1 fitness1 %统计前一个群体中适应值比当前群体适应值大的个数 s=popsize1+1; for j=popsize1:-1:1 if fitness(1,popsize)<fitness1(1,j) s=j; end end for i=1:popsize temp(i,:)=oldpop(i,:); end if s~=popsize1+1 %小于50代用上一代中用适应度值大于当前代的个体随机代替当前代中的个体 if gen<50 for i=s:popsize1 p=rand; j=floor(p*popsize+1); temp(j,:)=oldpop1(i,:); b(1,j)=b1(1,i); fitness(1,j)=fitness1(1,i); end else %50~100代用上一代中用适应度值大于当前代的个体代替当前代中的最差个体 if gen<100 j=1; for i=s:popsize1 temp(j,:)=oldpop1(i,:); b(1,j)=b1(1,i); fitness(1,j)=fitness1(1,i); j=j+1; end %大于100代用上一代中的优秀的一半代替当前代中的最差的一半,加快寻优 else j=popsize1; for i=1:floor(popsize/2) temp(i,:)=oldpop1(j,:); b(1,i)=b1(1,j); fitness(1,i)=fitness1(1,j); j=j-1; end end end end %将当前代的各项数据保存 for i=1:popsize b1(1,i)=b(1,i); end for i=1:popsize fitness1(1,i)=fitness(1,i); end for i=1:popsize oldpop1(i,:)=temp(i,:); end popsize1=popsize; %%%%%%交叉%%%%%% function crossover() global temp popsize cross_rate lchrom j=1; for i=1:popsize p=rand; if p<cross_rate parent(j,:)=temp(i,:); a(1,j)=i; j=j+1; end end j=j-1; if rem(j,2)~=0 j=j-1; end if j>=2 for k=1:2:j cutpoint=round(rand*(lchrom-1)); f=k; for i=1:cutpoint temp(a(1,f),i)=parent(f,i); temp(a(1,f+1),i)=parent(f+1,i); end for i=(cutpoint+1):lchrom temp(a(1,f),i)=parent(f+1,i); temp(a(1,f+1),i)=parent(f,i); end end end %%%%%%变异%%%%%% function mutation() global popsize lchrom mutation_rate temp newpop oldpop sum=lchrom*popsize; %总基因个数 mutnum=round(mutation_rate*sum); %发生变异的基因数目 for i=1:mutnum s=rem((round(rand*(sum-1))),lchrom)+1; %确定所在基因的位数 t=ceil((round(rand*(sum-1)))/lchrom); %确定变异的是哪个基因 if t<1 t=1; end if t>popsize t=popsize; end if s>lchrom s=lchrom; end if temp(t,s)==1 temp(t,s)=0; else temp(t,s)=1; end end for i=1:popsize oldpop(i,:)=temp(i,:); end %%%%%%查看结果%%%%%% function findresult() global maxgen yuzhi m n C B A %result为最佳阈值 result=floor(yuzhi(1,ma b370 xgen)) C=imresize(B,0.3); imshow(A); title('原始道路图像') figure; subplot(1,2,1) imshow(C); title('原始道路的灰度图') [m,n]=size(C); %用所找到的阈值分割图象 for i=1:m for j=1:n if C(i,j)<=result C(i,j)=0; else C(i,j)=255; end end end subplot(1,2,2) imshow(C); title('阈值分割后的道路图');
相关文章推荐
- matlab基于遗传算法的最大熵值法的双阈值图像分割
- OpenCV - 最大间方差分割
- 最大方差阈值分割--OTSU
- 基于二进制编码的遗传算法求解函数最大值
- 基于SVM的道路简单分割
- 基于遗传算法计算函数最大值--JavaScript实现
- 基于遗传算法的Ostu法在图像分割中的应用
- 基于最大稳定区域的图像分割算法
- 大津法(最大类间方差、自适应阈值)图像分割
- 基于最大一致性上下文的广域车辆跟踪
- Python实现基于BIC的语音对话分割(一)
- 基于最大最小距离的分类数目上限K确定的聚类方法
- 图像分割—基于图的图像分割(Graph-Based Image Segmentation)
- 医学图像处理笔记(6)-基于能量的分割
- Android平台上基于OpenCV的道路循迹
- 眼底图像血管增强与分割--(5)基于Hessian矩阵的Frangi滤波算法
- 基于阈值图像分割
- Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图
- 主成分分析(Principal components analysis)-最大方差解释