一、K均值聚类算法是什么?
1、什么是聚类?
2、初探K均值聚类算法
3、K均值算法的原理与理解
二、K均值聚类算法如何在图像分割上应用?
三、Matlab仿真
K均值聚类算法程序
function [C, label, J] = kmeans(I, k) [m, n, p] = size(I);%图片的大小m*n,p代表RGB三层 X = reshape(double(I), m*n, p); rng('default'); C = X(randperm(m*n, k), :);%随机选三个聚类中心 J_prev = inf; iter = 0; J = []; tol = 1e-11;%容忍度tol,inf为无穷大 while true, iter = iter + 1; dist = sum(X.^2, 2)*ones(1, k) + (sum(C.^2, 2)*ones(1, m*n))' - 2*X*C';%计算图片中各个点到K个聚类中心的距离 [~,label] = min(dist, [], 2) ; %label记录最小值的行数 for i = 1:k, C(i, :) = mean(X(label == i , :)); %取新的k个聚类中心 end J_cur = sum(sum((X - C(label, :)).^2, 2));%距离之和 J = [J, J_cur]; display(sprintf('#iteration: %03d, objective fcn: %f', iter, J_cur)); if norm(J_cur-J_prev, 'fro') < tol,% A和A‘的积的对角线和的平方根,即sqrt(sum(diag(A'*A))),本次与上次距离之差 break; end if (iter==10),% A和A‘的积的对角线和的平方根,即sqrt(sum(diag(A'*A))),本次与上次距离之差 break; end J_prev = J_cur; end
主程序
clear all; close all; I = imread('C:\Users\Administrator\Desktop\K_medoids分类\de.jpg');%读取图片数据编程矩阵 [m, n, p] = size(I); %figure(); %I=imnoise(I1,'salt & pepper',0.1);%椒盐噪声,通常是由图像传感器,传输信道,解压处理等产生的黑白相间的亮暗点噪声(椒-黑,盐-白)。通常出现在灰度图中。 I1 = imnoise(I,'gaussian',0,0.1) ;% 高斯噪声,顾名思义是指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和高温引起的传感器噪声。通常在RGB图像中,显现比较明显。 %imshow(I);%显示图片I %title('加噪图像'); k = 2; [C, label, J2] = kmeans1(I, k); I_seg2 = reshape(C(label, :), m, n, p);%转换成图片矩阵的格式 k = 3; [C, label1, J3] = kmeans2(I, k); I_seg3 = reshape(C(label1, :), m, n, p); k = 4; [C, label, J2] = kmeans1(I1, k); I_seg4 = reshape(C(label, :), m, n, p); k = 8; [C, label1, J3] = kmeans2(I1, k); I_seg5 = reshape(C(label1, :), m, n, p); figure subplot(2, 3, 1), imshow(I, []), title('原图') subplot(2, 3, 2), imshow(uint8(I_seg2), []), title('2聚类') subplot(2, 3, 3), imshow(uint8(I_seg3), []), title('3聚类') subplot(2, 3, 4), imshow(uint8(I_seg4), []), title('4聚类') subplot(2, 3, 5), imshow(uint8(I_seg5), []), title('8聚类') figure subplot(3, 3, 1),plot(1:length(J2), J2), xlabel('#iterations') subplot(3, 3, 2),plot(1:length(J3), J3), xlabel('#iterations') subplot(3, 3, 3),plot(1:length(J4), J4), xlabel('#iterations') subplot(3, 3, 4),plot(1:length(J5), J5), xlabel('#iterations') segmented_images = cell(1,3);%1*3矩阵 rgb_label = repmat(label1,[1 1 3]);%把label矩阵编程[1 1 3]的矩阵 for k = 1:10 color = I; color(rgb_label ~= k) = 0;%把label不等于K的点除去 segmented_images{
k} = color; end figure(),imshow(segmented_images{
1}), title('分割结果——区域1'); figure(),imshow(segmented_images{
2}), title('分割结果——区域2'); figure(),imshow(segmented_images{
3}), title('分割结果——区域3');
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232059.html原文链接:https://javaforall.net
