|
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 [minDist,index] = 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);
- end
复制代码 Kmeans_fun函数(适应度函数)如下:
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);
- [M,N]=size(R); % 行、列
- ClusterData = get_cluster_data(R,G,B);
- % 分类数
- [len, depth]= 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_minDist,center_index] = 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);
- [M,N]=size(R); % 行、列
- ClusterData = get_cluster_data(R,G,B);
- % 分类数
- [len, depth]= 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(:);
- [fitness(i), center_new]= Kmeans_fun( pop(i,:), ClusterData, Kc );
- pop(i,:) = center_new(:);
- end
- %% 记录一组最优值
- [bestfitness,bestindex]=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 ); % 确定方向
- % 确定步长
- [maxfitness,index] = 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
- % 适应度更新
- [fitness(j), newpop]= 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',[1,1,1])
- plot(fitness_iter,'ro-','linewidth',2);
- xlabel('迭代次数'); ylabel('适应度值');
- axis tight;grid on;
- %% 分割显示
- % 计算 每一个待分类的数据隶属于的中心编号
- [center_minDist,center_index] = 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
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|