基于花授粉的模糊聚类的图像分割(MATLAB)

基于花授粉的模糊聚类

(自学整理代码,如有错误之处,还望各位大神留言指导)

function [best,fmin,U,N_iter]=C_FPA(para, data, k, expo, min_impro)

% min_impro:隶属度最小变化量,迭代终止条件
% expo: 隶属度矩阵U的加权指数

n=para(1);           % Population size, typically 10 to 25
p=para(2);           % 转换概率

% Iteration parameters
N_iter=1000;            % Total number of iterations

% Dimension of the search variables
d=2;
Lb=min(data)*ones(1,d);
Ub=max(data)*ones(1,d);
% Initialize the population/solutions
for i=1:n
%   Sol(i,:)=Lb+(Ub-Lb).*rand(1,d);
  Fitness1 = [];
  U = rand(k,size(data,1));
  col_sum = sum(U);
  U = U./col_sum(ones(k,1),:);
  mf = U.^expo;
  center(:,i) = mf*data./((ones(size(data,2),1)*sum(mf'))');
  Fitness1 = distfcm(center,data);
  Fitness(i) = sum(sum((Fitness1.^2)*mf'));
end

% Find the current best
[fmin,I]=min(Fitness);
best=center(:,I);
S=center; 

% Start the iterations -- Flower Algorithm 
for t=1:N_iter
        % Loop over all bats/solutions
        for i=1:n
          if rand>p %局部授粉
          L=Levy(d);
          dS=L'.*(center(:,i)-best);
          S(:,i)=center(:,i)+dS;
          S(:,i)=simplebounds(S(:,i),Lb,Ub);
          
          else  %全局授粉
              epsilon=rand;
              JK=randperm(n);
              S(:,i)=S(:,i)+epsilon*(center(:,JK(1))-center(:,JK(2)));
              S(:,i)=simplebounds(S(:,i),Lb,Ub);
          end
          
          % 更新新一代的花朵与适应度(函数变量和函数值)
            Fitness1 = [];
            Fitness1 = distfcm(S(:,i),data);
            Fnew(i) = sum(sum((Fitness1.^2)*mf'));
         
          if (Fnew(i)<=Fitness(i))
               center(:,i)=S(:,i);
               Fitness(i)=Fnew(i);
          end
           
          if Fnew(i)<=fmin
                best=S(:,i)   ;
                fmin=Fnew(i)   ;
          end
        end

        if round(t/10)==t/10
        best
        fmin
        end
        %终止条件判别
       if i>1
           if abs(Fnew(i)-Fnew(i-1))<min_impro
               break;
           end 
       end 
       tmp = Fitness1.^(-2/(expo-1));
       U = tmp./sum(tmp);   %隶属度矩阵
end


disp(['Total number of evaluations: ',num2str(N_iter*n)]);
disp(['fmin=', num2str(fmin)]);

% Application of simple constraints
function s=simplebounds(s,Lb,Ub)
  % Apply the lower bound
  ns_tmp=s;
  I=ns_tmp<Lb;
  ns_tmp(I)=Lb(I);
  
  % Apply the upper bounds 
  J=ns_tmp>Ub;
  ns_tmp(J)=Ub(J);
  % Update this new move 
  s=ns_tmp;


% 飞行参数
function L=Levy(d)
beta=3/2;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
    u=randn(1,d)*sigma;
    v=randn(1,d);
    step=u./abs(v).^(1/beta);
L=0.01*step; 

%%子函数 计算距离
function out=distfcm(center,data)
out=zeros(size(center,1),size(data,1));
   for k=1:size(center,1)
       out(k,:)=sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
   end 



调用

close all
clc;
clear;
I=imread('3096.jpg');
%  figure; imshow(I,[]);title('yuan图像'); 
 if size(I,3) == 3
  I=rgb2gray(I);
   else
end
% figure;imshow(I);title('图像'); %imwrite(I,'1.tiff','tiff','Resolution',300);%保存为tif
g = double(I);
[p q] = size(g);
data = g(:);
data_n = size(data,1);
in_n = size(data,2);
k = 2;%类别数
expo = 2;
min_impro = 1e-5;
para = [25 0.8];  

[best,fmin,U,N_iter] = C_FPA(para, data, k, expo, min_impro);

maxU = max(U);
for j=1:k
    index = find(U(j, :) == maxU);
    fcm_label(index) = j;     
end
fcm_result=reshape(fcm_label,[p q]);
figure, imshow(fcm_result,[]);
title('fpa_fcm分割结果');
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值