gusucode.com > 利用遗传算法进行图像分割matlab源码程序 > segment_ga/ksw_ga_improve.m
%%%利用最佳直方图熵法(KSW熵法)及改进遗传算法实现灰度图像阈值分割 %%%主程序 %%初始部分,读取图像及计算相关信息 clear; close all; clc; I=imread('rice_noise.tif'); hist=imhist(I); total=0; for i=0:255 total=total+hist(i+1); end hist1=hist/total; HT=0; for i=0:255 if hist1(i+1)==0 temp=0; else temp=hist1(i+1)*log(1/hist1(i+1)); end HT=HT+temp; end %%程序主干部分 %种群随机初始化,种群数取10,染色体二进制编码取8位 t0=clock; population=10; X0=round(rand(1,population)*255); for i=1:population adapt_value0(i)=ksw(X0(i),0,255,hist1,HT); end adapt_average0=mean(adapt_value0); X1=X0; adapt_value1=adapt_value0; adapt_average1=adapt_average0; %循环搜索,搜索代数取100 generation=100; for k=1:generation s1=select1(X1,adapt_value1); s_code1=dec2bin(s1,8); c1=cross1(s_code1,k); v1=mutation1(c1,k); X2=(bin2dec(v1))'; for i=1:population adapt_value2(i)=ksw(X2(i),0,255,hist1,HT); end adapt_average2=mean(adapt_value2); if abs(adapt_average2-adapt_average1)<=0.01 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); t_opt=round(mean(X2(number))); t1=clock; search_time=etime(t1,t0); %%阈值分割及显示部分 threshold_opt=t_opt/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('最佳直方图熵法及改进遗传算法阈值为:'); disp(t_opt); disp('最佳直方图熵法及改进遗传算法阈值搜索所用时间(s):'); disp(search_time); %%程序结束