%%%利用改进遗传聚类算法和直方图信息进行图像分割
%%%程序开始
%%初始部分,读取图像及计算相关信息
close all;
clear;
clc;
%I=imread('E:\MATLAB6p5\work\我的程序\ga_fcm_levelset\rice.tif');
%I=imread('E:\MATLAB6p5\work\我的程序\ga_fcm_levelset\knee1.tif');
%I=imread('E:\MATLAB6p5\work\我的程序\ga_fcm_levelset\Lenna.bmp');
%I=imread('E:\MATLAB6p5\work\我的程序\ga_fcm_levelset\Lenna_noise.bmp');
%I=imread('K:\MATLAB6p5\work\我的程序\ga_fcm_levelset\11561277179451274.bmp');
I=imread('E:\MATLAB6p5\work\我的程序\ga_fcm_\d1.jpg');
I=rgb2gray(I);
hist=imhist(I);
c=2;%设置聚类数
a_immage=0.5;%设置分割门限
a=size(hist,1);
V0=round(rand(1,c)*(a-1));%聚类中心初始化
%%程序主干部分
t0=clock;
%种群随机初始化,种群数取10,
population=30;
v0=round(rand(a-1,c)*(a-1));
for i=1:a
initV(i,:)=round(rand(1,c)*(a-1));
end
v=initV;
for j=1:population
[v_out(j,:),f(j)]=fcm(hist,c,v(j,:));%计算适应度函数
end
%循环搜索,搜索代数取100
generation=200;
for k=1:generation
s1=select(v0,f,population);%轮盘赌选择
holdm=s1;%保留父代群体
c1=cross1(s1,k,population,c);%交叉,交叉概率为0.6,0.8
v1=mutation1(c1,k,population,a);%变异,变异概率为前0.02,中0.03,后0.02
r1=replace(holdm,v1,hist,c,population,f);%子优代父,基于浓度的群体更新
for i=1:population
[v_out_new(i,:),f1(i)]=fcm(hist,c,r1(i,:));%适应度计算
end
a_max=max(f1);
if a_max<=0.01
break;
end
v0=v_out_new;
f=f1;
end
v_end(1,1)=round(mean(v_out_new(:,1)));
v_end(1,2)=round(mean(v_out_new(:,2)));
fu=belong(c,hist,v_end);
fu_abs=abs(fu-a_immage);
min_a=min(min(fu_abs));%阈值设置
[i,j]=find(fu_abs==min_a);
t_opt=min(i);
%t_opt=mean(mean(i));
t1=clock;
%下面进行阈值分割和显示
threshold_i=t_opt/(a-1);
I1=im2bw(I,threshold_i);
disp('算法分割的效果如图所示:');
disp('源图为:Fifure No.1');
disp('利用直方图信息进行遗传聚类算法分割后的图像为:Fifure No.2');
disp('边缘提取后的图象为为:Fifure No.3');
disp('迭代次数为:');
k
disp('执行所花的时间为:');
search_time=etime(t1,t0);
search_time
figure(1);
imshow(I);
title('源图');
figure(2);
imshow(I1);
title('利用直方图信息进行遗传聚类算法分割后的图像');
BW2 = edge(I1,'canny');%用canny算子提取边缘
figure(3);
imshow(BW2);
disp('利用直方图信息进行遗传聚类算法的阈值为:');
disp(round(t_opt));
%%程序结束