一、人工魚群算法圖像分割簡介
最大熵多門檻值圖像分割算法主要為求解最大熵對應的門檻值,熵E實質是關于門檻值(T1,T2,… ,TK) 的函數,即可視為E=f(T1,T2,…,TK),求取最大熵即為多元函數求最大值,因為0≤T1≤T2≤,…,≤TK≤ L-1,是以這是一個帶限制的優化問題。 若用全局搜尋政策求得最優門檻值速度很慢,為加快基于全局搜尋的最大熵多門檻值圖像分割算法的搜尋速度,而且AFSA算法已在組合優化問題求解中有着良好性能,将AFSA算法應用于最大熵多門檻值尋優,為友善将基于全局搜尋的最大熵多門檻值圖像分割算法簡記為GSMEMT算法。
1 彩色圖像的灰階化
因為處理的對象是RGB模式的彩色圖像,而OTSU、AFSAMEMT等算法适用于灰階圖像的門檻值分割,是以首先應将RGB模式的彩色圖像轉化為灰階圖像, 考慮到彩色圖像中主要對象色彩分量對比背景物體應具有更強的區分度,更有利于各算法的分割,是以僅提取彩色圖像的R分量作為灰階圖像進行各算法的圖像分割,後續試驗也驗證了這一點,R分量作為灰階圖像進行圖像分割的效果要優于G分量和B分量圖像。
2 多門檻值人工魚編碼
用1×K維的整數編碼ai表示第i條人工魚,即ai=[Ti1,Ti2,… ,Ti K],其中Tij(j=1,2,… ,K)為整數 ,且滿足0≤Ti1≤Ti2≤,…,≤Ti K≤L-1,即Tij代表“1.2” 中的門檻值Tj。
3 不可行人工魚編碼及其修複
在AFSA的執行過程中, 有時會産生不可行人工魚編碼,不可行人工魚編碼即為人工魚編碼不滿足的0≤Ti1≤Ti2≤,…,≤Ti K≤L-1的限制條件。 不可行人工魚編碼不僅對算法的存儲産生備援,而且無效搜尋增加了算法的計算複雜度。 采用實時修複政策對每一個人工魚編碼進行檢測,在人工魚的生成過程中若為可行編碼則輸出, 反之則進行修複, 使其滿足0≤Ti1≤Ti2≤,…,≤Ti K≤L-1的限制條件, 成為可行編碼,修複過程主要用于後續的“3.4”中算法的步驟4)。
4 圖像分割的AFSAMEMT算法步驟
1)彩色圖像的灰階化和圖像特征提取。 提取各彩色圖像的R分量作為灰階圖像,統計灰階圖像的直方圖及每個灰階的機率。
2)算法參數的設定。 設定AFSA算法的基本參數,如人工魚群的規模、人工魚的感覺距離、移動步長、擁擠度因子、試探次數、人工魚編碼的維數和算法的疊代次數等。
3)初始化人工魚群。 初始化人工魚群包括生成所有的人工魚編碼及其對應的目标函數值,公告牌的初始化。
4)對每條人工魚執行聚群和追尾行為 ,選擇較優行為生成新的人工魚,預設行為均為覓食行為。
5)更新公告牌。
6)判斷疊代次數是否達到最大 , 若滿足 , 則輸出結果;反之,轉4)。
二、部分源代碼
%人工魚群算法
clear all
format long
I = imread('op5.bmp');
N=512;
gailv = imhist(im2uint8(I(:)),256);
for i=1:N
for j=1:N
for k=1:256
if I(i,j)==k
counts(i,j)=gailv(k);
end
end
end
end
p = counts / sum(sum(counts));
omega0 = cumsum(cumsum(p)');
omega1 = 1 - omega0;
for i=1:N
end
mu_t_y=cumsum(cumsum(mu_x));
mu_t_x=cumsum(cumsum(mu_y));
global sigma_b_squared;
sigma_b_squared=((mu_t_x.*omega0-mu_x).^2 +(mu_t_y.*omega0-mu_y).^2) ./ omega0 * omega1;
global maxY;
Try_number=5;
a1=0;
b1=255;
a2=0;
b2=255;
d=[];
h=1e-1;
Friend_number=0.5;
k=0;
m=30;
X=[X1 X2];%人工魚數量
for i=1:N
wwww=[X(i,1),X(i,2)];
d(i)=maxf(wwww);
end
[w,i]=max(d);
maxX=[X(i,1),X(i,2)];%初始公告闆記錄
maxY=w;%初始公告闆記錄
figurex=[];
figurey=[];
figurez=[];
figurex(numel(figurex)+1)=maxX(1);
figurey(numel(figurey)+1)=maxX(2);
figurez(numel(figurez)+1)=maxY;
kkk=0;
while(k<m)
for i=1:N
XX=[X(i,1),X(i,2)];%人工魚目前狀态Xi
nf=0;
Xc=0;
for j=1:N %聚群行為開始
XXX=[X(j,1),X(j,2)];
if(norm(XXX-XX)<Visual)
nf=nf+1;
Xc=Xc+XXX;
end
end
Xc=Xc/nf;
if((maxf(Xc))>maxf(XX))
XXnext1=XX+rand*Step*(Xc-XX)/norm(Xc-XX);
if(XXnext1(1)>b1)
XXnext1(1)=b1;
end
if(XXnext1(1)<a1)
XXnext1(1)=a1;
end
if(XXnext1(2)>b2)
XXnext1(2)=b2;
end
if(XXnext1(2)<a2)
XXnext1(2)=a2;
end
else
XXnext1=gmjprey(XX,Try_number,Visual,Step);
if(XXnext1(1)>b1)
XXnext1(1)=b1;
end
if(XXnext1(1)<a1)
XXnext1(1)=a1;
end
if(XXnext1(2)>b2)
XXnext1(2)=b2;
end
if(XXnext1(2)<a2)
XXnext1(2)=a2;
end
end%聚群行為結束
%maxX=XX;%追尾行為開始
%maxY=maxf(XX);
if((maxY)>maxf(XX))
XXnext2=XX+rand*Step*(maxX-XX)/norm(maxX-XX);
if(XXnext2(1)>b1)
XXnext2(1)=b1;
end
if(XXnext2(1)<a1)
XXnext2(1)=a1;
end
if(XXnext2(2)>b2)
XXnext2(2)=b2;
end
if(XXnext2(2)<a2)
XXnext2(2)=a2;
end
else
XXnext2 =gmjprey(XX,Try_number,Visual,Step);
if(XXnext2(1)>b1)
XXnext2(1)=b1;
end
if(XXnext2(1)<a1)
XXnext2(1)=a1;
end
if(XXnext2(2)>b2)
XXnext2(2)=b2;
end
if(XXnext2(2)<a2)
XXnext2(2)=a2;
end
end%追尾行為結束
if(maxf(XXnext1)>maxf(XXnext2))
X(i,1)=XXnext1(1);
X(i,2)=XXnext1(2);
else
X(i,1)=XXnext2(1);
X(i,2)=XXnext2(2);
end
end %一次疊代結束
for i=1:N
XXXX=[X(i,1),X(i,2)];
if maxf(XXXX)>maxY
maxY=maxf(XXXX);
maxX=XXXX;
figurex(numel(figurex)+1)=maxX(1);
figurey(numel(figurey)+1)=maxX(2);
figurez(numel(figurez)+1)=maxY;
end
end
k=k+1; %進入下一次疊代
end
if Q1<=0
Q1=1;
end
if Q2<=0
Q2=1;
end
if Q1>512
Q1=512;
end
if Q2>512
Q2=512;
end
fprintf('ostu魚群運作時間:%.6fs\n',cputime-t);
level1=double(I(Q1,Q2))/256;
BW1 = im2bw(I,level1);
subplot(2,2,1),imshow(I)
title('原圖');
subplot(2,2,2),imshow(BW1)
title('ostu人工魚群');
level2=graythresh(I);
BW2 = im2bw(I,level2);
subplot(2,2,3),imshow(BW2)
title('一維ostu');