Halcom 发表于 2019-10-21 23:58:27

SOA下的kmeans图像分割

SOA下的kmeans图像分割
链接:https://pan.baidu.com/s/1hjGrKwBi56hhqT6l91w7ow 提取码:1tah

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1\

数据获取(get_cluster_data函数):链接:https://pan.baidu.com/s/1r2AngQUwp8AP_8Qh89py_g 提取码:ejpf
聚类中心center_nearest:
function = center_nearest(center,ClusterData)
% ClusterData:待聚类的数据
% center:聚类的中心
% 函数目的:求解每一个数据隶属于的中心
minDist = zeros(size(ClusterData,1),1);
index = zeros(size(ClusterData,1),1);
dist = zeros(size(center,1),1);
for i=1:length(ClusterData)
    for j=1:size(center,1)
      dist(j) = norm(ClusterData(i,:) - center(j,:), 2);
    end
    [ minDist(i), index(i) ]=min(dist);
endKmeans_fun函数(适应度函数)如下:**** Hidden Message *****
kmeans分割函数如下:ClusterData是一个75088x2的矩阵;也就是图像数据;
% K均值聚类算法
clc,clear,close all;
warning off;
I_rgb=imread('2.jpg');
I_rgb=im2double(I_rgb);   %双精度
if size(I_rgb,3)==1
    msgbox('请输入一张彩色图像!!!');
    return;
end
R=I_rgb(:,:,1);
G=I_rgb(:,:,2);
B=I_rgb(:,:,3);
=size(R);   % 行、列
ClusterData = get_cluster_data(R,G,B);
% 分类数
= size(ClusterData);
Kc = 3;
% 初始化中心
index = ceil( unifrnd(1,len, 1, Kc) );   % 均匀分布
center = ClusterData(index,:);
center_new = center;   % 初始化新的中心
% maim loop
maxgen = 1e3;% 最大迭代次数
for i=1:maxgen
    % 计算 每一个待分类的数据隶属于的中心编号
    = center_nearest(center,ClusterData);
    % 更新center
    for j=1:Kc
      index = find(center_index==j);
      center_new(j, :) = mean( ClusterData(index,:) );
    end
    error = norm( center_new-center, 2 );% 相连两次中心点的距离值
    center = center_new;   % 更新中心
    if error<0.000001
      fprintf('\n');
      disp(['收敛迭代次数:', num2str(i)])
      disp( '聚类中心为:' )
      disp( num2str(center) )
      break;
    end
end
%% 分割显示
% a = reshape(ClusterData(:,1),M,N);% 第1列
% b = reshape(ClusterData(:,2),M,N);% 第2列
A = zeros(M*N, 1);
A(find(center_index==1), :) = 1;
A1 = reshape(A,M,N);% 第1类

A = zeros(M*N, 1);
A(find(center_index==2), :) = 1;
A2 = reshape(A,M,N);% 第2类

A = zeros(M*N, 1);
A(find(center_index==3), :) = 1;
A3 = reshape(A,M,N);% 第3类

A4 = reshape(center_index,M,N);% 第2列

figure(1),
subplot(221),imshow(A1,[]);xlabel('第1类')
subplot(222),imshow(A2,[]);xlabel('第2类')
subplot(223),imshow(A3,[]);xlabel('第3类')
subplot(224),imshow(A4,[]);xlabel('整体显示')

% 重构显示彩色图
R1 = immultiply(R, logical(A1));
G1 = immultiply(G, logical(A1));
B1 = immultiply(B, logical(A1));
RGB1 = cat(3,R1,G1,B1);

R2 = immultiply(R, logical(A2));
G2 = immultiply(G, logical(A2));
B2 = immultiply(B, logical(A2));
RGB2 = cat(3,R2,G2,B2);

R3 = immultiply(R, logical(A3));
G3 = immultiply(G, logical(A3));
B3 = immultiply(B, logical(A3));
RGB3 = cat(3,R3,G3,B3);
figure(2),
subplot(221),imshow(I_rgb,[]);xlabel('原始图像')
subplot(222),imshow(RGB1,[]);xlabel('第1类')
subplot(223),imshow(RGB2,[]);xlabel('第2类')
subplot(224),imshow(RGB3,[]);xlabel('第3类')SOA优化下的Kmeans图像分割:
ClusterData是一个75088x2的矩阵;也就是图像数据
clc,clear,close all;
warning off;
format longG;
%% 获取图像数据
I_rgb=imread('2.jpg');
I_rgb=im2double(I_rgb);   %双精度
if size(I_rgb,3)==1
    msgbox('请输入一张彩色图像!!!');
    return;
end
R=I_rgb(:,:,1);
G=I_rgb(:,:,2);
B=I_rgb(:,:,3);
=size(R);   % 行、列
ClusterData = get_cluster_data(R,G,B);
% 分类数
= size(ClusterData);
Kc = 3;
%% SOA 参数
maxiter = 20;% 迭代次数
sizepop = 20;% 种群数量
Umax=0.9500;   % 最大隶属度值
Umin=0.0111;   % 最小隶属度值
popmin = min(min(ClusterData));popmax = max(max(ClusterData)); % x

fai1 = 0.5;
fai2 = 0.5;
w1 = 0.5;
% w2 = 0.5;
w2max = 0.7;
w2min = 0.2;
nvar = 2*Kc;      % 变量的个数
%% 初始化种群
for i=1:sizepop
    index = ceil( unifrnd(1,len, 1, Kc) );   % 均匀分布
    center = ClusterData(index,:);
    pop(i,:) = center(:);
    = Kmeans_fun( pop(i,:), ClusterData, Kc );
    pop(i,:) = center_new(:);
end
%% 记录一组最优值
=min(fitness); % 索引最小值
zbest=pop(bestindex,:);   % 全局最佳
gbest=pop;                % 个体最佳
fitnessgbest=fitness;   % 个体最佳适应度值
fitnesszbest=bestfitness; % 全局最佳适应度值
Frontpop = pop;
%% 迭代寻优
for i=1:maxiter
    disp(['当前迭代次数: ', num2str(i)])
    for j=1:sizepop
       dego = gbest(j,:)-pop(j,:);
       dalt = zbest-pop(j,:);
       dpro = Frontpop(j,:) - pop(j,:);
       Frontpop = pop;% 记录上一时刻的最优种群
       dij = sign( w1*dpro+fai1*dego+fai2*dalt );   % 确定方向
       % 确定步长
       = sort(fitness,'descend');
       u = Umax - index(j)/sizepop *(Umax-Umin);
       u = u.*rand(1,nvar);       % nvar个变量
       T = sqrt(-log(u) );
       xmin = pop(index(1),:);    % 最差的个体
       xmax = pop(index(end),:);% 最优的个体
      
       w2 = w2max - j/sizepop*(w2max-w2min);
       delta = w2*abs( xmin-xmax );
      
       alpha = delta.*T;
      
       % 步长进行限制
       for k=1:length(alpha)
         if alpha(k)>0.6
               alpha(k)=0.6;
         elseif alpha(k)<-0.6
               alpha(k) = -0.6;
         end
       end
      
       % 位置更新
       pop(j,:) = pop(j,:) + dij.*alpha;      

      % x 越界限制
      for k =1:nvar
            if pop(j,k)>popmax
                pop(j,k)=popmax;
            end
            if pop(j,k)<popmin
                pop(j,k)=popmin;
            end
      end

      % 适应度更新
      = Kmeans_fun(pop(j,:), ClusterData, Kc );
      pop(j,:) = newpop(:);
      
      % 比较个体间比较
      if fitness(j)<fitnessgbest(j)
            fitnessgbest(j) = fitness(j);
            gbest(j,:) = pop(j,:);
      end
      if fitness(j)<bestfitness
            bestfitness = fitness(j);
            zbest =pop(j,:);
      end
      
    end
    fitness_iter(i) = bestfitness;
end
%% 结果显示
fprintf('\n')
disp(['最优适应度值: ', num2str(bestfitness)])
fprintf('\n')
zbest_center = reshape(zbest, Kc, 2 );
disp( '聚类中心为:' )
disp( num2str(zbest_center) );

figure('color',)
plot(fitness_iter,'ro-','linewidth',2);
xlabel('迭代次数'); ylabel('适应度值');
axis tight;grid on;

%% 分割显示
% 计算 每一个待分类的数据隶属于的中心编号
= center_nearest(zbest_center,ClusterData);
% a = reshape(ClusterData(:,1),M,N);% 第1列
% b = reshape(ClusterData(:,2),M,N);% 第2列
A = zeros(M*N, 1);
A(find(center_index==1), :) = 1;
A1 = reshape(A,M,N);% 第1类

A = zeros(M*N, 1);
A(find(center_index==2), :) = 1;
A2 = reshape(A,M,N);% 第2类

A = zeros(M*N, 1);
A(find(center_index==3), :) = 1;
A3 = reshape(A,M,N);% 第3类

A4 = reshape(center_index,M,N);% 第2列

figure(1),
subplot(221),imshow(A1,[]);xlabel('第1类')
subplot(222),imshow(A2,[]);xlabel('第2类')
subplot(223),imshow(A3,[]);xlabel('第3类')
subplot(224),imshow(A4,[]);xlabel('整体显示')

% 重构显示彩色图
R1 = immultiply(R, logical(A1));
G1 = immultiply(G, logical(A1));
B1 = immultiply(B, logical(A1));
RGB1 = cat(3,R1,G1,B1);

R2 = immultiply(R, logical(A2));
G2 = immultiply(G, logical(A2));
B2 = immultiply(B, logical(A2));
RGB2 = cat(3,R2,G2,B2);

R3 = immultiply(R, logical(A3));
G3 = immultiply(G, logical(A3));
B3 = immultiply(B, logical(A3));
RGB3 = cat(3,R3,G3,B3);
figure(2),
subplot(221),imshow(I_rgb,[]);xlabel('原始图像')
subplot(222),imshow(RGB1,[]);xlabel('第1类')
subplot(223),imshow(RGB2,[]);xlabel('第2类')
subplot(224),imshow(RGB3,[]);xlabel('第3类')
输出:收敛迭代次数:19
聚类中心为:
21.515      32.6575
3.61474       4.6504
15.0719      16.9821
















余坤键 发表于 2020-1-25 18:02:58

看一下大佬的代码

wal1985 发表于 2020-6-20 21:55:51

非常好的代码

wwmwwmwwm 发表于 2021-1-10 11:40:44

111111111111

regislei 发表于 2021-12-19 01:55:10

666666666666666666
页: [1]
查看完整版本: SOA下的kmeans图像分割