基于K均值聚类算法的图像分割(Matlab)

基于K均值聚类算法的图像分割(Matlab)文章目录一 K 均值聚类算法是什么 1 什么是聚类 2 初探 K 均值聚类算法 3 K 均值算法的原理与理解二 K 均值聚类算法如何在图像分割上应用 三 Matlab 仿真一 K 均值聚类算法是什么 1 什么是聚类 聚类是指通过既定的规则把物理或者抽象的集分成几个由类似特征的样本组成的类的过程 复杂点说 聚类指用一种类似性度为标准 将类似的样本划分到同一个组中 最终得到多个类 下图为聚类的过程 图 1 聚类的过程 2 初探 K 均值聚类算法 K means 算法是一种迭代运算的算法 K means 因其简便 有效的特点

一、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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号