gusucode.com > 利用遗传算法进行图像分割matlab源码程序 > segment_ga/ksw_2d_ga.m
%%%利用二维最佳直方图熵法(KSW熵法)及传统遗传算法实现灰度图像阈值分割 %%%主程序 %%初始部分,读取图像及计算相关信息 clear; close all; clc; %format long; I=imread('Lenna.bmp'); windowsize=3; I_temp=I; for i=2:255 for j=2:255 I_temp(i,j)=round(mean2(I(i-1:i+1,j-1:j+1))); end end I_average=I_temp; I_p=imadd(I,1); I_average_p=imadd(I_average,1); hist_2d(1:256,1:256)=zeros(256,256); for i=1:256 for j=1:256 hist_2d(I_p(i,j),I_average_p(i,j))=hist_2d(I_p(i,j),I_average_p(i,j))+1; end end total=256*256; hist_2d_1=hist_2d/total; %%%%%% Hst=0; for i=0:255 for j=0:255 if hist_2d_1(i+1,j+1)==0 temp=0; else temp=hist_2d_1(i+1,j+1)*log(1/hist_2d_1(i+1,j+1)); end Hst=Hst+temp; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%程序主干部分 %种群随机初始化,种群数取20,染色体二进制编码取16位 t0=clock; population=20; X00=round(rand(1,population)*255); X01=round(rand(1,population)*255); for i=1:population X0(i,:)=[X00(i) X01(i)]; end for i=1:population adapt_value0(i)=ksw_2d(X0(i,1),X0(i,2),0,255,hist_2d_1,Hst); end adapt_average0=mean(adapt_value0); X1=X0; adapt_value1=adapt_value0; adapt_average1=adapt_average0; %循环搜索,搜索代数取100 generation=100; for k=1:generation s1=select_2d(X1,adapt_value1); s_code10=dec2bin(s1(:,1),8); s_code11=dec2bin(s1(:,2),8); [c10,c11]=cross_2d(s_code10,s_code11); [v10,v11]=mutation_2d(c10,c11); X20=(bin2dec(v10))'; X21=(bin2dec(v11))'; for i=1:population X2(i,:)=[X20(i) X21(i)]; end for i=1:population adapt_value2(i)=ksw_2d(X2(i,1),X2(i,2),0,255,hist_2d_1,Hst); end adapt_average2=mean(adapt_value2); if abs(adapt_average2-adapt_average1)<=0.03 break; else X1=X2; adapt_value1=adapt_value2; adapt_average1=adapt_average2; end end max_value=max(adapt_value2); number=find(adapt_value2==max_value); opt=X2(number(1),:); s_opt=opt(1); t_opt=opt(2); t1=clock; search_time=etime(t1,t0); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%阈值分割及显示部分 opt_tt=round((s_opt+t_opt)/2); threshold_opt=opt_tt/255; I1=im2bw(I,threshold_opt); disp('灰度图像阈值分割的效果如图所示:'); disp('源图为:Fifure No.1'); disp('二维最佳直方图熵法及传统遗传算法阈值分割后的图像为:Fifure No.2'); figure(1); imshow(I); title('源图'); figure(2); imshow(I1); title('二维最佳直方图熵法及传统遗传算法阈值分割后的图像'); disp('二维最佳直方图熵法及传统遗传算法阈值为(s,t):'); disp(s_opt); disp(t_opt); disp('二维最佳直方图熵法及传统遗传算法阈值搜索所用时间(s):'); disp(search_time); %%程序结束