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
看一下大佬的代码 非常好的代码 111111111111 666666666666666666
页:
[1]