基于萤火虫优化算法的图像分割

基于萤火虫优化算法的图像分割_第1张图片

看腻了关于深度学习的图像分割算法,今天搞一篇基于萤火虫优化算法的图像分割文章,关于现在的各种优化算法(人群搜索算法、人工蜂群算法、帝国竞争算法、智能水滴算法、生物地理优化算法、萤火虫算法、布谷鸟搜索算法、引力搜索算法、觅食搜索算法、蝙蝠算法、风驱动优化算法、手榴弹爆炸算法、头脑风暴优化算法、基于教与学的优化算法、花授粉算法、果蝇优化算法、磷虾群算法、狼群算法、海豚回声定位算法、鸽群优化算法、灰狼优化算法、物体碰撞优化算法、水波优化算法、闪电搜索算法、Jaya算法、蜻蜓算法、鲸鱼优化算法、多元宇宙优化算法、乌鸦搜索算法、蝴蝶算法、雷电附着优化算法、斑鬣狗优化算法、松鼠搜索算法,看的我真是。。。),真是食之无味,弃之也不可惜,和故障诊断类一样,也都是大水泛滥,一发不可收拾

关于优化算法,可参考知乎上的一些文章

现有的各种群智能优化算法(比如遗传算法,粒子群算法,萤火虫算法等)有什么区别吗,其实质是不是相同的? - 知乎 https://www.zhihu.com/question/30326374

现在模拟退火算法、粒子群优化算法、遗传算法和蚁群优化算法现在用的还多吗? - 知乎 https://www.zhihu.com/question/316175486

关于萤火虫优化算法,可比遗传算法什么的简单多了,可适当参考如下文章,本文不再赘述

第2回:萤火虫算法 (Firefly algorithm) - 陈星星的文章 - 知乎 https://zhuanlan.zhihu.com/p/67065319

直接进入主题,首先导入一幅水果图片

基于萤火虫优化算法的图像分割_第2张图片

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');

基于萤火虫优化算法的图像分割_第3张图片

将聚类中心及其索引转换为图像,并作出分割结果图

算法的详细代码及数据参见如下链接

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');

基于萤火虫优化算法的图像分割_第4张图片

你可能感兴趣的:(大数据,matlab,聚类,机器学习,人工智能)