kmeans-图像分割代码
- 格式:docx
- 大小:15.15 KB
- 文档页数:2
k-means算法k-means算法是无监督学习领域最为经典的算法之一。
接触聚类算法,首先需要了解k-means算法的实现原理和步骤。
本文将对k-means算法的基本原理和实现实例进行分析。
希望对喜欢机器学习的童鞋们,有一定的帮助和启发。
首先看看wiki上对k-means算法的基本阐述。
k-means clustering is a method of vectorquantization, originally from signalprocessing, that is popular for clusteranalysis in data mining. k-means clusteringaims to partition n observations into kclusters in which each observation belongs tothe cluster with the nearest mean, serving asa prototype of the cluster.可以看出,k-means算法就是将 n 个数据点进行聚类分析,得到 k 个聚类,使得每个数据点到聚类中心的距离最小。
而实际上,这个问题往往是NP-hard的,以此有许多启发式的方法求解,从而避开局部最小值。
值得注意的是,k-means算法往往容易和k-nearest neighbor classifier(k-NN)算法混淆。
后者是有监督学习的分类(回归)算法,主要是用来判定数据点属于哪个类别中心的。
A simple example for k-means clusteringk-means算法有很多应用:•图像分割(Image Segmentation)•基因分割数据聚类分析(Clustering GeneSegementation Data)•新闻聚类分析(News Article Clustering)•语言聚类分析(Clustering Languages)•物种分析(Species Clustering)•异常检测(Anomaly Detection)•\cdots数学描述给定数据集 X=\{x^{(1)},x^{(2)},\cdots,x^{(n)}\} ,其中每个数据样本 x^{(i)}\in \mathbb{R}^d . k-mean算法旨在将 n 个数据点划分为 k(k\leq n) 个聚类集合\bm{S}=\{S_1,S_2,\cdots,S_k\} ,使得每个聚类集合中的样本点与聚类中心的距离平方和最小(WCSS, within-cluster sum of squares),i.e. 方差最小。
kmeans算法代码摘要:1.K-means 算法简介2.K-means 算法的基本原理3.K-means 算法的代码实现4.K-means 算法的应用示例5.总结正文:一、K-means 算法简介K-means 算法是一种聚类算法,用于将一组数据分成K 个簇(cluster),使得每个数据点与其所属簇的中心点(均值)距离最小。
该算法是由J.MacQueen 在1967 年提出的,是数据挖掘和机器学习领域中常用的聚类方法之一。
二、K-means 算法的基本原理K-means 算法的基本原理可以概括为两个步骤:初始化中心点和迭代计算。
1.初始化中心点:在数据集中选择K 个数据点作为初始中心点,可以随机选择,也可以通过一定策略进行选择。
2.迭代计算:根据当前中心点,将数据集划分为K 个簇,每个数据点与其所属簇的中心点距离最小。
然后计算每个簇的中心点,并重复上述过程,直到中心点不再发生变化,聚类结果稳定。
三、K-means 算法的代码实现下面是一个简单的Python 实现,使用numpy 库进行计算:```pythonimport numpy as npdef kmeans(data, K, max_iters=100):# 初始化中心点centroids = data[np.random.choice(data.shape[0], K,replace=False)]for _ in range(max_iters):# 根据中心点划分簇labels = np.argmin(np.sum((data[:, np.newaxis] - centroids) ** 2, axis=2), axis=1)# 计算新的中心点new_centroids = np.array([data[labels == k].mean(axis=0) for k in range(K)])# 判断收敛条件,中心点变化小于1e-4 时停止迭代if np.linalg.norm(new_centroids - centroids) < 1e-4:breakcentroids = new_centroidsreturn centroids, labels# 示例数据data = np.random.rand(100, 2)# 进行K-means 聚类,K=2,最大迭代次数为100centroids, labels = kmeans(data, 2, max_iters=100)print("聚类结果:", labels)print("簇中心点:", centroids)```四、K-means 算法的应用示例K-means 算法广泛应用于数据挖掘、机器学习、图像处理等领域。
k-means 算法一.算法简介k -means 算法,也被称为k -平均或k -均值,是一种得到最广泛使用的聚类算法。
它是将各个聚类子集内的所有数据样本的均值作为该聚类的代表点,算法的主要思想是通过迭代过程把数据集划分为不同的类别,使得评价聚类性能的准则函数达到最优,从而使生成的每个聚类内紧凑,类间独立。
这一算法不适合处理离散型属性,但是对于连续型具有较好的聚类效果。
二.划分聚类方法对数据集进行聚类时包括如下三个要点:(1)选定某种距离作为数据样本间的相似性度量k-means 聚类算法不适合处理离散型属性,对连续型属性比较适合。
因此在计算数据样本之间的距离时,可以根据实际需要选择欧式距离、曼哈顿距离或者明考斯距离中的一种来作为算法的相似性度量,其中最常用的是欧式距离。
下面我给大家具体介绍一下欧式距离。
假设给定的数据集 ,X 中的样本用d 个描述属性A 1,A 2…A d 来表示,并且d 个描述属性都是连续型属性。
数据样本x i =(x i1,x i2,…x id ), x j =(x j1,x j2,…x jd )其中,x i1,x i2,…x id 和x j1,x j2,…x jd 分别是样本x i 和x j 对应d 个描述属性A 1,A 2,…A d 的具体取值。
样本xi 和xj 之间的相似度通常用它们之间的距离d(x i ,x j )来表示,距离越小,样本x i 和x j 越相似,差异度越小;距离越大,样本x i 和x j 越不相似,差异度越大。
欧式距离公式如下:(2)选择评价聚类性能的准则函数k-means 聚类算法使用误差平方和准则函数来评价聚类性能。
给定数据集X ,其中只包含描述属性,不包含类别属性。
假设X 包含k 个聚类子集X 1,X 2,…X K ;{}|1,2,...,m X x m total ==(),i j d x x =各个聚类子集中的样本数量分别为n 1,n 2,…,n k ;各个聚类子集的均值代表点(也称聚类中心)分别为m 1,m 2,…,m k 。
语义分割中的图像超像素算法研究概述:语义分割是计算机视觉领域的重要研究方向,其目标是将图像中的每个像素分配给不同的语义类别。
图像超像素算法能够有效地将图像分割成具有语义关联的区域,进一步提高语义分割的准确性和效率。
本文将研究语义分割中的图像超像素算法,并探讨其在计算机视觉领域的应用前景。
1. 引言语义分割是图像分割的一种高级形式,其目标是将图像中的每个像素分配给不同的语义类别,如人、车、建筑物等。
然而,传统的图像分割方法存在一些问题,如过度分割、缺乏语义上下文等。
为了解决这些问题,图像超像素算法成为了一种有效的解决方案。
2. 图像超像素算法的原理图像超像素算法将图像分割成具有语义关联的区域,每个区域被称为超像素。
它基于图像中的颜色、纹理和边缘等特征将相邻像素组合在一起,形成具有语义一致性的区域。
常见的图像超像素算法包括SLIC、Felzenszwalb和Huttunen等。
3. SLIC算法SLIC算法是一种基于k-means聚类的图像超像素算法。
它将图像分割成具有较为均匀大小的超像素,同时保持超像素与语义区域的一致性。
SLIC算法采用了两个重要的策略:超像素初始种子的选择和超像素的紧凑性约束。
该算法的时间复杂度较低,并且在提高图像分割的准确性方面表现出色。
4. Felzenszwalb算法Felzenszwalb算法是一种基于图的聚类的图像超像素算法。
它使用图的分割和合并策略将像素组合成连通的区域,并且考虑了在颜色、纹理和边缘等方面的相似性。
该算法的主要优势在于能够处理复杂的图像背景和不规则的目标形状。
5. Huttunen算法Huttunen算法是一种基于支持向量机的图像超像素算法。
它使用支持向量机来学习图像中像素的语义关系,并根据学习到的模型将图像分割成具有语义一致性的超像素。
该算法在保持超像素边界清晰的同时,能够更好地捕捉图像中的语义信息。
6. 图像超像素算法的应用图像超像素算法在计算机视觉领域有着广泛的应用。
一、引言在机器学习和数据分析中,聚类是一种常用的数据分析技术,它可以帮助我们发现数据中的潜在模式和结构。
而k均值(k-means)聚类算法作为一种经典的聚类方法,被广泛应用于各种领域的数据分析和模式识别中。
本文将介绍matlab中k均值聚类算法的实现和代码编写。
二、k均值(k-means)聚类算法简介k均值聚类算法是一种基于距离的聚类算法,它通过迭代的方式将数据集划分为k个簇,每个簇内的数据点与该簇的中心点的距离之和最小。
其基本思想是通过不断调整簇的中心点,使得簇内的数据点与中心点的距离最小化,从而实现数据的聚类分布。
三、matlab实现k均值聚类算法步骤在matlab中,实现k均值聚类算法的步骤如下:1. 初始化k个簇的中心点,可以随机选择数据集中的k个点作为初始中心点。
2. 根据每个数据点与各个簇中心点的距离,将数据点分配给距离最近的簇。
3. 根据每个簇的数据点重新计算该簇的中心点。
4. 重复步骤2和步骤3,直到簇的中心点不再发生变化或者达到预定的迭代次数。
在matlab中,可以通过以下代码实现k均值聚类算法:```matlab设置参数k = 3; 设置簇的个数max_iter = 100; 最大迭代次数初始化k个簇的中心点centroids = datasample(data, k, 'Replace', false);for iter = 1:max_iterStep 1: 计算每个数据点与簇中心点的距离distances = pdist2(data, centroids);Step 2: 分配数据点给距离最近的簇[~, cluster_idx] = min(distances, [], 2);Step 3: 重新计算每个簇的中心点for i = 1:kcentroids(i, :) = mean(data(cluster_idx == i, :)); endend得到最终的聚类结果cluster_result = cluster_idx;```四、代码解释上述代码实现了k均值聚类算法的基本步骤,其中包括了参数设置、簇中心点的初始化、迭代过程中的数据点分配和中心点更新。
专利名称:基于k-means与水平集超像素分割的图像显著性目标检测方法
专利类型:发明专利
发明人:金星,黄锦雕,王祥国,莫代力
申请号:CN201911036279.8
申请日:20191029
公开号:CN110866896A
公开日:
20200306
专利内容由知识产权出版社提供
摘要:本发明公开了一种基于k‑means与水平集超像素分割的图像显著性目标检测方法,该方法使用水平集图像分割与k‑means聚类相结合的方法,将给定目标图像分割为多个具有相似特征的超像素区域,以抽象图像中不必要的细节,然后使用直方图加速的方法量化所有超像素内的颜色特征,减少颜色数量,提高计算效率,全局对比所有超像素区域在Lab色彩空间下的距离和平面空间的距离计算区域显著值,并结合背景先验和多尺度空间融合进一步优化检测效果。
对于后期的机器视觉处理具有重要的意义,而且其成本远低于后续的复杂图像处理。
申请人:中国地质大学(武汉)
地址:430000 湖北省武汉市洪山区鲁磨路388号
国籍:CN
代理机构:武汉知产时代知识产权代理有限公司
代理人:金慧君
更多信息请下载全文后查看。
matlab中的kmeans函数MATLAB是一个广泛使用的数学软件,其机器学习算法库完全支持k-means。
k-means 是聚类算法的基本形式之一,用于将数据集分成k个簇或组。
K-means算法的目标是最小化每个簇内数据点的方差或欧几里得距离。
MATLAB中的kmeans函数是一个实用的工具,可以帮助用户轻松实现k-means算法。
本文将从以下方面介绍MATLAB中的kmeans函数:函数基本结构、函数参数说明、算法流程和示例代码。
一。
函数基本结构:kmeans函数的基本结构如下:[idx, C] = kmeans (X, k)idx是一个列向量,指示数据点属于哪个簇,C是一个k x n矩阵,其中每行都是一个簇的质心。
二。
函数参数说明:kmeans函数的主要输入参数是数据集X和所需簇的数量k。
其他可用的选项还包括:Distance:指定所需距离度量的类型。
默认情况下,此选项设置为欧几里得距离。
Replicates:指定要运行的簇的数量。
kmeans函数默认运行一次,但是通过设置此选项可以运行任意数量的副本,并根据最小方差选择一个最佳结果。
此选项的值必须是正整数,建议设置为至少10。
Start:指定初始簇质心的算法。
默认情况下,此选项设置为“簇中心”方法,但也可以使用其他算法,例如随机初始化或指定初始质心。
Display:设置显示每次迭代时结果的详细程度。
默认情况下,此选项的值为'off'(不显示任何内容),但也可以设置为'true'(在MATLAB命令行窗口中显示迭代信息)或'final'(仅在计算完成时显示结果)。
三。
算法流程:下面是kmeans算法的流程:1. 设置k值(所需簇的数量),并选择每个簇的初始质心。
2. 循环以下步骤,直到满足停止标准:(a)将每个数据点分配到最近的质心。
(b)重新计算每个簇的质心。
(c)如果当前方案已经满足停止标准,则停止算法。
K-means算法是一种常用的聚类算法,在数据挖掘和机器学习领域有着广泛的应用。
它的主要思想是将数据分成K个簇,使得同一簇内的数据相似度较高,不同簇之间的数据相似度较低。
在本文中,我们将介绍K-means算法的原理,并给出其在Matlab中的实现代码。
下面是K-means算法在Matlab中的代码实现:1. 初始化簇中心```function [centroids] = initCentroids(X, K)随机初始化K个簇中心[m, n] = size(X);centroids = X(randperm(m, K), :);end```2. 分配样本到最近的簇```function [idx] = findClosestCentroids(X, centroids)根据当前簇中心,将每个样本分配到最近的簇中K = size(centroids, 1);idx = zeros(size(X,1), 1);m = size(X,1);for i=1:mmin_dist = inf;for j=1:Kdist = sum((X(i,:) - centroids(j,:)).^2);if dist < min_distmin_dist = dist;idx(i) = j;endendendend```3. 更新簇中心```function [centroids] =puteCentroids(X, idx, K) 对每个簇重新计算簇中心[m, n] = size(X);centroids = zeros(K, n);for i=1:Kcentroids(i, :) = mean(X(idx == i, :));endend```4. K-means算法主函数```function [centroids, idx] = runkMeans(X, initial_centroids,max_iters)K-means算法的主函数[m, n] = size(X);K = size(initial_centroids, 1);centroids = initial_centroids;previous_centroids = centroids;idx = zeros(m, 1);for i=1:max_iters计算每个样本到簇中心的最短距离idx = findClosestCentroids(X, centroids);更新簇中心centroids =puteCentroids(X, idx, K);endend```通过以上代码,我们可以在Matlab中实现K-means算法,并对数据进行聚类分析。
K-means 聚类算法是一种常用的无监督学习方法,可以将数据分成多个类别。
在实际应用中,为了评估 K-means 算法的性能,需要使用一些评价指标来衡量聚类的效果。
MATLAB 作为一种强大的数学建模和数据分析工具,可以用于实现 K-means 聚类算法,并且提供了丰富的评价指标计算函数。
本文将探讨如何使用 MATLAB 实现 K-means 算法,并且介绍常用的评价指标。
一、K-means 算法简介K-means 算法是一种迭代的聚类算法,其基本思想是将数据点分为 K 个不同的类别,使得每个数据点到其所属类别的中心的距离最小化。
算法的具体步骤如下:1. 初始化 K 个类别的中心点。
2. 将每个数据点分配到与其最近的类别。
3. 更新每个类别的中心点。
4. 重复步骤 2 和 3,直到类别中心点不再发生变化或者达到预定的迭代次数。
K-means 算法的优点是简单易理解,计算速度快,适用于大规模数据集。
然而,K-means 算法也存在一些缺点,例如对初始中心点的敏感性、对异常值的敏感性等。
二、MATLAB 实现 K-means 算法MATLAB 提供了 kmeans() 函数来实现 K-means 聚类算法。
该函数的基本语法为:[idx, C] = kmeans(X, k)其中,X 是输入的数据矩阵,每一行代表一个数据点;k 是指定的类别数;idx 是每个数据点所属的类别索引;C 是最终的类别中心点。
通过调用 kmeans() 函数,可以方便地实现 K-means 算法并得到聚类的结果。
三、常用的 K-means 聚类评价指标在对 K-means 算法的效果进行评估时,常用的评价指标包括以下几种:1. 轮廓系数(Silhouette Coefficient):用于衡量类别之间的分离程度和类别内部的紧密程度。
轮廓系数的取值范围在 -1 到 1 之间,值越大表示聚类效果越好。
2. Calinski-Harabasz 指数:用于衡量类别内部数据的离散程度和类别间数据的分散程度,值越大表示聚类效果越好。
rknn分割算法RKNN分割算法是一种用于图像分割的算法,它能够将一张图像分割成不同的区域,并将每个区域标记为不同的类别。
它被广泛应用于计算机视觉领域,例如图像识别、目标检测和语义分割等任务中。
传统的图像分割算法通常基于边缘、颜色、纹理等特征进行分割,而RKNN分割算法则采用了一种全新的思路,即以像素为中心,将图像分割成一组子图像,然后通过神经网络对这些子图像进行分类,最终得到图像分割的结果。
在RKNN分割算法中,首先需要对输入图像进行预处理,将它转换成适合神经网络处理的格式,例如将RGB图像转换成灰度图像、将图像进行裁剪或缩放等。
然后,将预处理后的图像输入到神经网络中进行特征提取。
神经网络通常由多个卷积层、池化层和全连接层组成,它能够学习到图像中的高级特征。
在特征提取完成后,RKNN分割算法将使用一种叫做k块均值迭代(K-means Iterative Algorithm,KIA)的方法将特征图像分割成若干个块。
KIA首先将特征图像分为k个类别,然后计算每个类别的均值,将每个像素点重新标记为与其最近的均值所属的类别。
然后,重新计算每个类别的均值,再次将每个像素点重新标记。
如此迭代,直至每个像素点都不再改变其类别为止。
在分割完成后,RKNN分割算法还需要对每个区域进行后处理,例如去除面积较小的区域、填充空洞、合并相邻的区域等。
最终,得到的分割结果即为输入图像的像素级别的标记。
RKNN分割算法相比于传统的图像分割算法具有以下几点优势:首先,它可以学习到更高级的特征表示。
传统的图像分割算法通常基于低级特征,例如颜色和纹理,而RKNN分割算法基于神经网络可以学习到更高级的特征表示,例如物体的形状和结构。
其次,它的分割结果更加准确。
传统的图像分割算法通常基于手工设计的规则,而RKNN分割算法基于深度学习可以自动学习到更好的规则,从而得到更准确的分割结果。
最后,它的分割速度更快。
传统的图像分割算法通常需要进行大量的计算和迭代,而RKNN分割算法基于神经网络可以通过并行计算加速分割的速度,从而提高分割的效率。
基于超像素和K-means的图像分割算法作者:苏建菖马燕来源:《计算机时代》2019年第02期摘; 要:传统的简单线性迭代聚类(SLIC)超像素算法在图像细节处容易产生欠分割问题,文章对超像素块采用K-means算法进一步聚类,并按聚类中心定义了相似度,对于相似度大于预设阈值的超像素块,视其为欠分割区域,对该超像素块保留K-means聚类结果。
实验结果表明,本文算法在分割准确率等各项指标上均优于SLIC算法。
关键词:超像素; SLIC; K-means; 图像分割中图分类号:TP317.4; ; ; ; ; 文献标志码:A; ; ;文章编号:1006-8228(2019)02-58-03Image segmentation algorithm based on superpixel and K-meansSu Jianchang, Ma Yan(The College of Information, Mechanical and Electrical Engineering, Shanghai Normal University, Shanghai 201418, China)Abstract: The traditional simple linear iterative clustering (SLIC) superpixel algorithm will lead to the issue of under-segmentation in the detail of image. This paper proposes to cluster the superpixel with K-means algorithm, the similarity degree is defined according to the cluster centers. For the superpixel whose similarity degree is greater than the predefined threshold, it will be seen as under-segmentation region and the clustering result of K-means will retain. The experimental results show that the proposed algorithm is superior to the SLIC algorithm with respect to the accuracy of segmentation.Key words: superpixel; SLIC; K-means; image segmentation0 引言近年来,超像素的研究在计算机视觉与图像处理等领域备受关注。
k-means 算法***************************************************************************一.算法简介k -means 算法,也被称为k -平均或k -均值,是一种得到最广泛使用的聚类算法。
它是将各个聚类子集内的所有数据样本的均值作为该聚类的代表点,算法的主要思想是通过迭代过程把数据集划分为不同的类别,使得评价聚类性能的准则函数达到最优,从而使生成的每个聚类内紧凑,类间独立。
这一算法不适合处理离散型属性,但是对于连续型具有较好的聚类效果。
二.划分聚类方法对数据集进行聚类时包括如下三个要点:(1)选定某种距离作为数据样本间的相似性度量k-means 聚类算法不适合处理离散型属性,对连续型属性比较适合。
因此在计算数据样本之间的距离时,可以根据实际需要选择欧式距离、曼哈顿距离或者明考斯距离中的一种来作为算法的相似性度量,其中最常用的是欧式距离。
下面我给大家具体介绍一下欧式距离。
假设给定的数据集 ,X 中的样本用d 个描述属性A 1,A 2…A d 来表示,并且d 个描述属性都是连续型属性。
数据样本x i =(x i1,x i2,…x id ), x j =(x j1,x j2,…x jd )其中,x i1,x i2,…x id 和x j1,x j2,…x jd 分别是样本x i 和x j 对应d 个描述属性A 1,A 2,…A d 的具体取值。
样本xi 和xj 之间的相似度通常用它们之间的距离d(x i ,x j )来表示,距离越小,样本x i 和x j 越相似,差异度越小;距离越大,样本x i 和x j 越不相似,差异度越大。
欧式距离公式如下:(2)选择评价聚类性能的准则函数{}|1,2,...,m X x m total ==(),i j d x x =k-means 聚类算法使用误差平方和准则函数来评价聚类性能。
给定数据集X ,其中只包含描述属性,不包含类别属性。
K均值算法(K-means algorithm)是一种常用的聚类算法,它在医疗影像分析中有着广泛的应用。
本文将介绍K均值算法在医疗影像分析中的使用教程。
K均值算法是一种无监督学习算法,它通过将数据点分成K个簇,使得每个数据点都属于离它最近的簇中心所代表的类别。
在医疗影像分析中,K均值算法可以用来对影像数据进行聚类,从而帮助医生更好地理解和诊断疾病。
首先,我们需要准备医疗影像数据。
这些数据可以是来自MRI、CT、X射线等不同类型的医疗影像。
每个医疗影像通常都包含了大量的像素点,我们需要将这些像素点作为数据点来进行K均值算法的处理。
接下来,我们需要对医疗影像数据进行预处理。
这包括对影像进行去噪、分割、特征提取等操作,以便将影像数据转换成可以用于K均值算法的数据点形式。
预处理的过程非常重要,它会直接影响到最终聚类的效果。
然后,我们可以使用K均值算法对预处理后的医疗影像数据进行聚类。
在使用K均值算法之前,我们需要确定K的取值,也就是要将数据分成多少个簇。
通常情况下,这需要结合具体的医疗影像数据和应用场景来进行调整。
在应用K均值算法进行聚类时,我们需要考虑到算法的收敛性和初始中心点的选择。
K均值算法的核心是不断迭代更新簇中心点的位置,直到满足停止条件为止。
而初始中心点的选择对聚类结果也有着重要的影响,通常情况下可以采用随机选择或者基于数据点的一些启发式方法来确定初始中心点。
聚类完成后,我们可以对每个簇进行进一步的分析和解释。
通过观察不同簇的特征,我们可以更好地理解医疗影像数据中的不同结构和区域,从而为医生提供更多的诊断信息。
除了对医疗影像数据进行聚类外,K均值算法还可以用于其他一些医疗影像分析的任务。
例如,可以将K均值算法用于影像分割,从而实现对影像中不同区域的分离和识别。
此外,K均值算法还可以用于对影像数据的特征提取和降维,从而帮助医生更好地理解和处理大规模的医疗影像数据。
总之,K均值算法在医疗影像分析中有着广泛的应用。
基于聚类K-Means⽅法实现图像分割”“”K-Means to realize Image segmentation “”“import numpy as npimport PIL.Image as imagefrom sklearn.cluster import KMeans#Define loadDato to solve my imagedef loadData(filePath):f = open(filePath,'rb')#deal with binarydata = []img = image.open(f)#return to pixel(像素值)m,n = img.size#the size of imagefor i in range(m):for j in range(n):x,y,z = img.getpixel((i,j))#deal with pixel to the range 0-1 and save to datadata.append([x/256.0,y/256.0,z/256.0])f.close()return np.mat(data),m,nimgData,row,col = loadData("./picture/apple.png")#setting clusers(聚类中⼼) is 3label = KMeans(n_clusters=3).fit_predict(imgData)#get the label of each pixellabel = label.reshape([row,col])#create a new image to save the result of K-Meanspic_new = image.new("L",(row,col))#according to the label to add the pixelfor i in range(row):for j in range(col):pic_new.putpixel((i,j),int(256/(label[i][j]+1)))pic_new.save("./picture/km.jpg","JPEG")K-Means算法:我们常说的K-Means算法属于⽆监督分类(训练样本的标记信息是未知的,⽬标是通过对⽆标记训练样本的学习来揭⽰数据的内在性质和规律,为进⼀步的数据分析提供基础),它通过按照⼀定的⽅式度量样本之间的相似度,通过迭代更新聚类中⼼,当聚类中⼼不再移动或移动差值⼩于阈值时,则就样本分为不同的类别。
he = imread('02.png'); % 读入图像
imshow(he), title('H&E image');
text(size(he,2),size(he,1)+15,...
'Image courtesy of Alan Partin, Johns Hopkins University', ...
'FontSize',7,'HorizontalAlignment','right');
cform = makecform('srgb2lab'); % 色彩空间转换
lab_he = applycform(he,cform);
ab = double(lab_he(:,:,2:3)); % 数据类型转换
nrows = size(ab,1); % 求矩阵尺寸
ncols = size(ab,2); % 求矩阵尺寸
ab = reshape(ab,nrows*ncols,2); % 矩阵形状变换
nColors = 3;
% 重复聚类3次,以避免局部最小值
[cluster_idxcluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ... 'Replicates',3);
pixel_labels = reshape(cluster_idx,nrows,ncols); % 矩阵形状改变
imshow(pixel_labels,[]); % 显示图像
title('image labeled by cluster index'); % 设置图像标题
segmented_images = cell(1,3); % 细胞型数组
rgb_label = repmat(pixel_labels,[1 1 3]); % 矩阵平铺
for k = 1:nColors
color = he;
color(rgb_label ~= k) = 0;
segmented_images{k} = color;
end
imshow(segmented_images{1}), % 显示处理后的图像
title('objects in cluster 1'); % 设置图像标题
imshow(segmented_images{2}), % 显示处理后的图像
title('objects in cluster 2'); % 设置图像标题
imshow(segmented_images{3}), % 显示处理后的图像
title('objects in cluster 3'); % 设置图像标题
mean_cluster_value = mean(cluster_center,2);
[tmp, idx] = sort(mean_cluster_value);
blue_cluster_num = idx(1);
L = lab_he(:,:,1);
blue_idx = find(pixel_labels == blue_cluster_num);
L_blue = L(blue_idx);
is_light_blue = im2bw(L_blue,graythresh(L_blue)); % 图像黑白转换nuclei_labels = repmat(uint8(0),[nrowsncols]); % 矩阵平铺
nuclei_labels(blue_idx(is_light_blue==false)) = 1;
nuclei_labels = repmat(nuclei_labels,[1 1 3]); % 矩阵平铺
blue_nuclei = he;
blue_nuclei(nuclei_labels ~= 1) = 0;
imshow(blue_nuclei), title('blue nuclei'); % 显示处理后的图像。