图像分割基于最大类间方差阈值与遗传算法的道路分割

Posted MatlabQQ1575304183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像分割基于最大类间方差阈值与遗传算法的道路分割相关的知识,希望对你有一定的参考价值。

最大类间方差的求解过程,就是在解空间中查找到一个最优的解,使得其方差最大,而遗传算法能非线性快速查找最优解k及最大的方差,其步骤如下:

 

1) 为了使用遗传算法,首先必须对实现解空间的数值编码,产生染色体单元。由于所采集到的道路图像的灰度图由0-255个灰度值组成,正好对应着一个8位二进制即一个字节,因此使用一个字节作为染色体。对于染色体的解码正好是编码的逆过程,就是这个字节的十进制数。

 

2)初始化种群,产生一个规模的染色体种群,并随机初始化每一染色体,得到多个不同的染色体,这个过程实际上决定了解的起始值,如果其选取过偏,则会造成最优解收敛慢,计算时间长的缺点。

 

3)对每个染色体进行解码。由最大类方差的分割阈值方法,可以设定其方差作为每一个染色体的评价函数,染色体的方差越大,就越有可能逼近最优解。求出每个染色体的适应值,对于所求得的适应值,求出每一个染色体的选择概率及累计概率并产生多个随机数。选择出随机概率对应的染色体作为遗传运算的一种种子,其中适应值打的被选取的可能性大,优胜劣汰。被选中的染色体作为遗传种子,进行遗传运算,这样一代一代地进行,每一代所得到的适应值都不相同,新一代中的染色体得到的适应值较高,因此,其解也更逼近于最大的值。

 

4)接下来进行遗传运算。首先进行杂交运算,杂交运算就是对染色体中的某些基因进行交换,此过程中为了控制交换的位数,必须给定一个杂交率。杂交率越大,其交换的基因越多,其值变化越快,解的收敛速度就越快;但杂交率太大,不利于求得最优解。

 

由最大类间方差分割法可知,对于每一个灰度值k,必须求得以下几个参数:w0、w1、u0、u1。不难发现对于每一个表达式都要求出pi的值,因此,可先求出每个pi的值。

clear allclose allclc%定义全局变量global chrom oldpop fitness lchrom  popsize cross_rate mutation_rate yuzhisumglobal 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;  endfindresult; %图像分割结果%%%%%%输出进化各曲线%%%%%%figure;gen=1:maxgen;plot(gen,fit(1,gen)); title('最佳适应度值进化曲线');figure;plot(gen,yuzhi(1,gen));title('每一代的最佳阈值进化曲线');%%%%%%初始化种群%%%%%%function initpop()global lchrom oldpop popsize chrom Cimshow(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 yuzhisumglobal 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;    endend%计算适度值并排序for i=1:popsize    lowsum=0;    higsum=0;    lownum=0;    hignum=0;    chrom=oldpop(i,:);    c=0;    for j=1:lchrom        c=c+chrom(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    endend %下边对上一代群体进行排序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;    endend%下边统计每一代中的最佳阈值和最佳适应度值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);    endend%%%%%%子函数:精英选择%%%%%%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;    endendfor i=1:popsize    temp(i,:)=oldpop(i,:);endif 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    endend%将当前代的各项数据保存for i=1:popsize    b1(1,i)=b(1,i); end    for i=1:popsize    fitness1(1,i)=fitness(1,i); endfor i=1:popsize    oldpop1(i,:)=temp(i,:);endpopsize1=popsize;%%%%%%交叉%%%%%%function crossover()global temp popsize cross_rate lchromj=1;for i=1:popsize    p=rand;    if p<cross_rate        parent(j,:)=temp(i,:);        a(1,j)=i;        j=j+1;    endendj=j-1;if rem(j,2)~=0    j=j-1;endif 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    endend%%%%%%变异%%%%%%function mutation()global popsize lchrom mutation_rate temp newpop oldpopsum=lchrom*popsize;    %总基因个数mutnum=round(mutation_rate*sum);    %发生变异的基因数目for i=1:mutnums=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;    endendfor i=1:popsize    oldpop(i,:)=temp(i,:);end%%%%%%查看结果%%%%%%function findresult()global maxgen yuzhi m n C B A %result为最佳阈值result=floor(yuzhi(1,maxgen)) 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    endendsubplot(1,2,2)imshow(C);title('阈值分割后的道路图');

以上是关于图像分割基于最大类间方差阈值与遗传算法的道路分割的主要内容,如果未能解决你的问题,请参考以下文章

图像分割基于最大类间方差阈值与遗传算法的道路分割

图像分割基于类间方差阈值图像分割与腐蚀膨胀matlab源码

图像分割基于类间方差阈值图像分割与腐蚀膨胀matlab源码含GUI

图像分割基于类间方差阈值图像分割与腐蚀膨胀matlab源码含GUI

图像分割基于灰狼算法优化Otsu图像实现多阈值分割matlab源码

大津法---OTSU算法