看腻了关于深度学习的图像分割算法,今天搞一篇基于萤火虫优化算法的图像分割文章,关于现在的各种优化算法(人群搜索算法、人工蜂群算法、帝国竞争算法、智能水滴算法、生物地理优化算法、萤火虫算法、布谷鸟搜索算法、引力搜索算法、觅食搜索算法、蝙蝠算法、风驱动优化算法、手榴弹爆炸算法、头脑风暴优化算法、基于教与学的优化算法、花授粉算法、果蝇优化算法、磷虾群算法、狼群算法、海豚回声定位算法、鸽群优化算法、灰狼优化算法、物体碰撞优化算法、水波优化算法、闪电搜索算法、Jaya算法、蜻蜓算法、鲸鱼优化算法、多元宇宙优化算法、乌鸦搜索算法、蝴蝶算法、雷电附着优化算法、斑鬣狗优化算法、松鼠搜索算法,看的我真是。。。),真是食之无味,弃之也不可惜,和故障诊断类一样,也都是大水泛滥,一发不可收拾
关于优化算法,可参考知乎上的一些文章
现有的各种群智能优化算法(比如遗传算法,粒子群算法,萤火虫算法等)有什么区别吗,其实质是不是相同的? - 知乎 https://www.zhihu.com/question/30326374
现在模拟退火算法、粒子群优化算法、遗传算法和蚁群优化算法现在用的还多吗? - 知乎 https://www.zhihu.com/question/316175486
关于萤火虫优化算法,可比遗传算法什么的简单多了,可适当参考如下文章,本文不再赘述
第2回:萤火虫算法 (Firefly algorithm) - 陈星星的文章 - 知乎 https://zhuanlan.zhihu.com/p/67065319
直接进入主题,首先导入一幅水果图片
img=imread('fruit.jpg');
img=im2double(img);
gray=rgb2gray(img);
gray=imadjust(gray);
将图片转化为向量
X=gray(:)
萤火虫算法聚类
k = 6; %设置聚类个数
CostFunction=@(m) ClusterCost(m, X); % 代价函数
VarSize=[k size(X,2)]; % 决策变量矩阵大小
nVar=prod(VarSize); % 决策变量矩阵个数
VarMin= repmat(min(X),k,1); % 变量下界
VarMax= repmat(max(X),k,1); % 变量上界
萤火虫优化算法的参数
MaxIt = 100; % 最大迭代次数
nPop = 10; % 萤火虫种群数量
gamma = 1; % 光吸收系数
beta0 = 2; % 吸引力系数值
alpha = 0.2; % 突变系数
alpha_damp = 0.98; % 突变系数阻尼比
delta = 0.05*(VarMax-VarMin); %突变范围
m = 2;
if isscalar(VarMin) && isscalar(VarMax)
dmax = (VarMax-VarMin)*sqrt(nVar);
else
dmax = norm(VarMax-VarMin);
end
% 设置一个空萤火虫结构
firefly.Position = [];
firefly.Cost = [];
firefly.Out = [];
% 初始化种群
pop = repmat(firefly, nPop, 1);
% 初始化最优解
BestSol.Cost = inf;
% 创建初始萤火虫
for i = 1:nPop
pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
[pop(i).Cost, pop(i).Out] = CostFunction(pop(i).Position);
if pop(i).Cost <= BestSol.Cost
BestSol = pop(i);
end
end
% 保存最佳代价函数值的数组
BestCost = zeros(MaxIt, 1);
萤火虫算法主循环
for it = 1:MaxIt
newpop = repmat(firefly, nPop, 1);
for i = 1:nPop
newpop(i).Cost = inf;
for j = 1:nPop
if pop(j).Cost < pop(i).Cost
rij = norm(pop(i).Position-pop(j).Position)/dmax;
beta = beta0.*exp(-gamma.*rij^m);
e = delta.*unifrnd(-1, +1, VarSize);
%e = delta*randn(VarSize);
newsol.Position = pop(i).Position ...
+ beta.*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
+ alpha.*e;
newsol.Position = max(newsol.Position, VarMin);
newsol.Position = min(newsol.Position, VarMax);
[newsol.Cost newsol.Out] = CostFunction(newsol.Position);
if newsol.Cost <= newpop(i).Cost
newpop(i) = newsol;
if newpop(i).Cost <= BestSol.Cost
BestSol = newpop(i);
end
end
end
end
end
% 合并
pop = [pop
newpop];
% 排列
[~, SortOrder] = sort([pop.Cost]);
pop = pop(SortOrder);
% 截断
pop = pop(1:nPop);
BestCost(it) = BestSol.Cost;
BestRes(it)=BestSol.Cost;
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
% 突变系数
alpha = alpha*alpha_damp;
end
FAlbl=BestSol.Out.ind;
训练图绘制
figure;
plot(BestRes,'--k','linewidth',1);
title('FA Train');
xlabel('FA Iteration Number');
ylabel('FA Best Cost Value');
将聚类中心及其索引转换为图像,并作出分割结果图
算法的详细代码及数据参见如下链接
https://mianbaoduo.com/o/bread/YpyWlppx
gray2=reshape(FAlbl(:,1),size(gray));
segmented = label2rgb(gray2);
figure;
subplot(1,2,1);
imshow(img);title('Original');
subplot(1,2,2);
imshow(segmented,[]);title('Segmented Image');