k-means 图像分割 maltab程序

可视化 聚类过程的

网上找的 然后改了一下 显示 效果

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,% AA‘的积的对角线和的平方根,即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()
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值