Github个人博客:https://joeyos.github.io
最大类间方差的求解过程,就是在解空间中查找到一个最优的解,使得其方差最大,而遗传算法能非线性快速查找最优解k及最大的方差,其步骤如下:
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(