isodata聚类提取图片主色并生成主色聚类图(matlab)
代码如下,能运行。
聚类函数:
function[index,class,mean] = ISODATA(x,K,theta_N,theta_S,theta_c,L,I)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%input parameters%%%%%%
% x : data
% K : 预期的聚类中心数
% theta_N : 每一聚类中心中最少的样本数,少于此数就不作为一个独立的聚类
% theta_S :一个聚类中样本距离分布的标准差
% theta_c : 两聚类中心之间的最小距离,如小于此数,两个聚类进行合并
% L : 在一次迭代运算中可以和并的聚类中心的最多对数
% I :迭代运算的次数序号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% step1
n = size(x,1);
N_c = K;
mean = cell(K,1);
for i=1:K
mean{
i} = x(i,:);
end
ite = 1;
while ite<I
flag = 1;
while flag
%% step2
class = cell(size(mean));
for i=1:n
num = Belong2(x(i,:),mean);
class{
num} = [class{
num};x(i,:)];
end
%% step3
for i=1:N_c
size_i = size(class{
i},1);
if size_i<theta_N
class_i = class{
i};
mean = DeleteRow(mean,i);
class = DeleteRow(class,i);
N_c = N_c-1;
for j=1:size_i
class_ij = class_i(j,:);%the j'th row of class{
i}
num = Belong2(class_ij,mean);
class{
num} = [class{
num};class_ij];
end
end
end
%% step4
for i=1:N_c
if ~isempty(mean{
i})
mean{
i} = sum(class{
i})./size(class{
i},1);
end
end
%% step5
Dis = zeros(N_c,1)