在网上看到了一个图像l,a,b空间的l通道的模糊C均值聚类的MATLAB程序,但是没接触过MATLAB程序,有没有哪位高手能把他转换成VB的的啊???
模糊C均值聚类算法如下:1) 从n个数据集data = ( x1 , x2 , ..., xn ) 中,确定聚类域个数c ,随机选取初始的聚类中心集V0 = ( v1 , v2 ,..., vc ) ,确定隶属度矩阵U的加权指数expo 、最大迭代次数max_iter、终止误差ε> 0。
2) 重复下列操作,直到‖Vb+1 - Vb ‖ <ε为止, b为当前迭代次数。    a) 使用当前的Vb ,计算隶属度矩阵Ub。    b) 使用当前的Ub ,计算聚类中心Vb+1。%%%%%定义距离函数%%%%%%%%%%%function out = distfcm(center, data)
% 计算样本点到聚类中心的距离
% 输入:
%   center     ---- 聚类中心
%   data       ---- 样本点
% 输出:
%   out        ---- 距离
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));
en%%%%%定义迭代函数%%%%%%function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
% 模糊C均值聚类时迭代的一步
% 输入:
%   data        ---- nxm矩阵,表示n个样本,每个样本具有m维特征值
%   U           ---- 隶属度矩阵
%   cluster_n   ---- 标量,表示聚合中心数目,即类别数
%   expo        ---- 隶属度矩阵U的指数                     
% 输出:
%   U_new       ---- 迭代计算出的新的隶属度矩阵
%   center      ---- 迭代计算出的新的聚类中心
%   obj_fcn     ---- 聚类中心集
mf = U.^expo;       % 隶属度矩阵进行指数运算结果
center = (mf*data)'./sum(mf'); % 新聚类中心
dist = distfcm(center', data);       % 计算距离矩阵
obj_fcn = center';  % 计算聚类中心集
tmp = dist.^(-2/(expo-1));    
U_new = tmp./(ones(cluster_n, 1)*sum(tmp));  % 计算新的隶属度矩阵%%%%%%%模糊模糊C均值聚类%%%%%%%figure(1);
Ag=imread('2.bmp');   %待聚类图像
Ag=Ag(1:260,1:250,:);
subplot(211);imagesc(Ag,[0 1]); colormap(gray);title('聚类原图像');
Ag=double(Ag);labAg=rgblab(Ag,0);%%%%-------分离lab通道------
labAg1=labAg(:,:,1);[m n]=size(labAg1);
%%%%--------将l通道的像素转换成一列----labAg11=im2col(labAg1,[m n],'distinct');%%%%----——确定样本点数和聚类中心个数————
data_ng = m*n;
cluster_ng=3;     %确定聚类个数expo=2;      % 隶属度矩阵U的指数
max_iter = 100;  % 最大迭代次数
min_impro = 1e-5;  % 隶属度最小变化量,迭代终止条件
%%%--------初始化聚类中心----------
center=[Ag(83,45,1),Ag(25,47,1),Ag(132,245,1)];  %初始化聚类中心
dist=distfcm(center',labAg11);  %计算像素点到聚类中心的距离
tmp = dist.^(-2/(expo-1));
Ug = tmp./(ones(cluster_ng, 1)*sum(tmp));  %初始化隶属度矩阵
obj_fcn_Ag = zeros(3,max_iter); % 初始化输出参数obj_fcn_Ag% ----------Main loop  主要循环--------
for i = 1:max_iter,
    %在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值;
 [Ug, center_Ag, obj_fcn_Ag(:,i)] = stepfcm(labAg11, Ug, cluster_ng, expo);
 if i > 1,
  if ((obj_fcn_Ag(1,i) - obj_fcn_Ag(1,i-1))^2+(obj_fcn_Ag(2,i) - obj_fcn_Ag(2,i-1))^2+(obj_fcn_Ag(3,i) - obj_fcn_Ag(3,i-1))^2)^1/2 < min_impro,
            break;
        end,
 end
end
%-----------将转换成一列的l通道的像素重新转换成数组------
x=size(Ug,2);
temp_Cg=zeros(m*n,4);
for i=1:x
    [ma ii]=max(Ug(:,i));
    temp_Cg(i,1)=ii;
end
Agd_num=col2im(temp_Cg(:,1),[m n],[m n],'distinct');
Agd_num1=Agd_num.*20;
figure(1);
subplot(212);image(Agd_num1);