?? 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);
%%程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -