可视化 聚类过程的
网上找的 然后改了一下 显示 效果
clear all; close all;clc
I = imread('1.png');%读取图片
[m, n, p] = size(I);
k = 5;% 设定分类个数
[C, label, J2] = kmeans1(I, k);
I_seg2 = reshape(label(:,k), m, n);%转换成图片矩阵的格式
figure
subplot(1, 3, 1), imshow(I, []), title('原图')
subplot(1, 3, 2), imshow(uint8(I_seg2), []), title('2聚类结果1')
subplot(1, 3, 3), imshow(255-uint8(I_seg2), []), title('2聚类结果2')
figure
plot(1:length(J2), J2), xlabel('#iterations')
for k = 1:length(J2)
figure(),
subplot(1,2,1)
imshow(reshape(label(:,k), m, n),[]), title(['第' num2str(k) '次分割结果——区域1']);
subplot(1,2,2)
imshow(255-reshape(label(:,k), m, n),[]), title(['第' num2str(k) '次分割结果——区域2']);
end
function [C, label, J] = kmeans1(I, k)
tic
[m, n, p] = size(I);%图片的大小m*n,p代表RGB三层
X = reshape(double(I), m*n, p);
rng('default');
figure;
plot3(X(:,1),X(:,2),X(:,3),'.');
title('数据X分布')
C = X(randperm(m*n, k), :);%随机选k个聚类中心
% C = [201 23 123; 13 32 31];%自设聚类中心初始点
J_prev = inf;% 用于保留上一次聚类中心之间的距离值
iter = 15; %迭代次数
J = []; % 聚类中心之间的距离值
tol = 1e-11;%聚类中心之间的距离值阈值
hold on
% figure %另开窗口进行初始点更新可视化
plot3(C(:,1),C(:,2),C(:,3),'r*');
nn=0;
while true
nn = nn + 1;
dist = sum(X.^2, 2)*ones(1, k) + (sum(C.^2, 2)*ones(1, m*n))' - 2*X*C';%计算图片中各个点到K个聚类中心的距离
[~,label(:,nn)] = min(dist, [], 2) ; %label记录最小值的行数
for i = 1:k,
C(i, :) = mean(X(label(:,nn) == i , :)); %取新的k个聚类中心
end
pause(0.5)
h = get(gca, 'children'); % 获取坐标轴的children属性
delete(h(1)); % 删除上次绘制的子图形
hold on
% plot(C(1,:),C(2,:),'r*');
plot3(C(:,1),C(:,2),C(:,3),'r*');
J_cur = sum(sum((X - C(label(:,nn), :)).^2, 2));%聚类中心点距离之和
J = [J, J_cur];
display(sprintf('#iteration: %03d, objective fcn: %f', nn, J_cur));
if norm(J_cur-J_prev, 'fro') < tol,% A和A‘的积的对角线和的平方根,即sqrt(sum(diag(A'*A))),本次与上次距离之差
break;
end
if (nn==iter)
break;
end
J_prev = J_cur;
end
toc;
end
带滑动条的k-means 阈值分割
function [idx] = k_means(gray,n)
% gray为待采用k-means算法进行灰度值分割的图像
% n 为灰度图中灰度值分割类数
% idx 为分割后的图像
gray = im2double(gray);
m = size(gray(:,1));
mn = size(gray(1,:));
B = reshape(gray,1,m(1)*mn(2));
[idx1,C] = kmeans(B',n);
idx= reshape(idx1,m(1),mn(2));
end
function kk_mean()
clear
clc
close all
handles.Image = rgb2gray(imread('peppers.png'));% 修改图片
handles.fig = figure;
handles.axes1 = axes('Units','pixels','Position',[50 100 400 400]);
handles.edit = uicontrol('Style','edit','Position',[200 20 100 20]);
handles.slider = uicontrol('Style','slider','Position',[50 50 400 20],'Min',1,'Max',30,'Value',3);
handles.Listener = addlistener(handles.edit,'String','PostSet',@(s,event) kkvalues(handles));
handles.Listener = addlistener(handles.slider,'Value','PostSet',@(s,event) kkmean(handles));
imshow(handles.Image,'Parent',handles.axes1);
guidata(handles.fig);
function kkvalues(handles)
set(handles.slider,'Value',str2num(get(handles.edit,'String')));
end
function kkmean(handles)
slider_value = round(get(handles.slider,'Value'));
set(handles.edit,'String',num2str(slider_value));
handles.Image= k_means(handles.Image,slider_value);
axes(handles.axes1);
imshow(handles.Image,[])
end
end
直接调用 kk_mean()