基于K-means的图像分割(python代码详解)

这篇具有很好参考价值的文章主要介绍了基于K-means的图像分割(python代码详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要借鉴了下面文章,对下文的一些代码在本文进行了详细解释

机器学习十大经典算法之K-means (图像分割,python)_Mr.Q的博客-CSDN博客_kmeans图像分割python十大经典算法分别为:K-means K均值(无监督算法,聚类算法,随机算法)KNN(K Nearest Neighbor) K近邻(有监督算法,分类算法)逻辑回归(分类算法)决策树(有监督算法,概率算法)随机森林(集成算法中最简单的,模型融合算法)朴素贝叶斯EM算法Adaboost(集成算法之一)SVM马尔可夫一、算法过程(1)随机选择...https://blog.csdn.net/jizhidexiaoming/article/details/89214614?spm=1001.2014.3001.5506

一、“  K”和“means”

        K:有k个质心(簇)。

        means:质心是一个簇所有点的均值。

        K-means属于硬聚类。硬聚类指数据只能属于一个簇,与软聚类:数据可以不同程度的属于多个类相反。

二、算法步骤

        S1:选取初始质心:从样本点中随机抽取K个点作为质心。

        S2:所有样本点归类:计算所有样本点到K个质心的距离,将其划分到与其距离最近的簇中心所在簇。

        S3:重新确定质心:新质心 = 簇内所有点的均值。

        S4:循环更新:重复步骤S2,S3,直到质心不再变化。

三、流程图

基于K-means的图像分割(python代码详解)

四、代码

import numpy as np
import matplotlib.pyplot as plt
img = plt.imread('1.jpg')
row = img.shape[0]
col = img.shape[1]
plt.subplot(121)
plt.imshow(img)
	

def knn(data, iter, k):
    data = data.reshape(-1, 3)
    data = np.column_stack((data, np.ones(row*col)))
    # 1.随机产生初始簇心
    cluster_center = data[np.random.choice(row*col, k)]
    # 2.分类
    distance = [[] for i in range(k)]
    for i in range(iter):
        print("迭代次数:", i)
        # 2.1距离计算
        for j in range(k):
            distance[j] = np.sqrt(np.sum((data - cluster_center[j])**2, axis=1))
        # 2.2归类
        data[:, 3] = np.argmin(distance, axis=0)
        # 3.计算新簇心
        for j in range(k):
            cluster_center[j] = np.mean(data[data[:, 3] == j], axis=0)
    return data[:, 3]


if __name__ == "__main__":
    image_show = knn(img, 100, 2)
    image_show = image_show.reshape(row, col)
    plt.subplot(122)
    plt.imshow(image_show, cmap='gray')
    plt.show()

五、代码怎么使用?

        第一步,需要把待分割图片放入项目文件,like this:

基于K-means的图像分割(python代码详解)

         第二步,代码的第三行:'img = plt.imread()',在括号里加入图片路径:“图片名.文件格式”,比如,1.jpeg、2.bmp等等。

六、运行结果

1.迭代100次,簇总数=5 

基于K-means的图像分割(python代码详解)

2.迭代10次,簇总数=2

基于K-means的图像分割(python代码详解)

七、核心代码解释

7.1图片信息处理过程 

7.1.1图片 三维数组(图片高,图片宽,3)

	img = plt.imread(‘path’)

7.1.2 三维数组(图片高,图片宽,3)二维数组(图片宽*高,3)

	img = img.reshape(-1, 3)

7.1.3(-1, 3)数组 (-1,4)数组

新增1列用来存储分类信息

	img = np.column__stack((img, np.ones(row*col)))

7.1.4 kmeans算法返回结果

只返回所有像素点的分类结果

	return img[:, 3]

7.2用数组表示图片

7.2.1描述像素点

        一维数组[R, G, B]就可以表示一个像素点,数组内容是三原色的取值,数组元素大小∈[0, 255]。

7.2.2描述图片

        一个三维数组就可表示一张图片,如果图片的分辨率为m*n,那么数组形状为(n, m, 3)。这个三维数组描述了图片所有像素点(共m*n个)的RGB信息。

(n, m, 3):n个形状为(m, 3)的2维数组。
n:图片的高
m:图片的宽
3:[RGB]长=3

7.3plt.imread()

7.3.1语法

img = plt.read(‘图片路径’)

7.3.2功能

        把图片的信息提取到数组中(将图片转化为数组)。

7.3.3返回值类型

        返回值类型:numpy数组

 <class 'numpy.ndarray'>

7.3.4返回值内容

        假设图片分辨率=m*n,宽*高

  1. 如果是灰度图,返回(n, m)形状2维数组。
  2. 如果是RGB图像,返回(n, m, 3)形状的三维数组。

7.3.5例

        读取照片,并获取包含该图片所有信息的3维矩阵。

        该照片的分辨率=371*543

import numpy as np
import matplotlib.pyplot as plt
img = plt.imread('1.jpg')   # 读入图片
print(img.shape, type(img))
print(img) 
plt.imshow(img) # 利用数组显示图片
plt.show()
输出:(543, 371, 3) <class 'numpy.ndarray'>
输出:img记录着所有像素点的RGB值:

基于K-means的图像分割(python代码详解)

 7.4plt.imshow()

7.4.1功能:数组->图片

        将数组存储的RGB信息映射为彩色图片。

7.4.2语法

plt.imshow(img,  cmap='gray') 
plt.imshow(img) # hsv图片
plt.show()

        img是包含图片所有信息的三维数组。

        plt.imshow()中的cmap参数有两种取值:gray(灰度表示),hsv(hsv颜色空间),默认值是hsv。

7.4.3数组形状

        (1)三维:从图片提取的数组是三维,可以由plt.imshow()正常显示。

        (2)二维: 图像分割的结果是二维数组,数组每个元素对应一个像素点的种类。如果图像有3种簇,那么二维数组的取值是[0, 1, 2],代表归属不同的种类。

7.4.4不同数组形状显示的图片特点

        不论是二维还是三维数组,用plt.imshow(img)表示时,如果不设置cmap参数,默认都是hsv。

        特别地,二维数组显示的图片的颜色种类和二维数组元素可取值的数量是一样的,这样就可以区分分割的结果。下面,是两种簇的分割。

基于K-means的图像分割(python代码详解)

7.5plt.show()

7.5.1作用

        显示图片。

7.5.2特点:阻塞

        plt.show()被执行时,程序就被阻塞在这一行不向下进行,直到图像窗口被关闭时,程序才往下进行。

7.6随机产生簇心

7.6.1二维数组索引

        一般情况下,对于二维数组,用1个或者1对数字分别索引数组某行或者某个元素。

        也可以用向量进行索引,得到的是指定行构成的数组。

        下面,用向量对二维数组进行索引:

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
print( x[0] ) #[1, 2]
print( x[0,0,] ) # 1
print( x[[0, 1, 2]] ) #[[1, 2], [3, 4], [5, 6]]

7.6.2随机产生k个簇心

        先从[0, row*col-1]中随机产生长度为k的向量,再在data中索引该向量,得到k个随机点

distance = np.sqrt(np.sum((x - y)**2, axis=1))

作为簇心。

cluster_center = data[np.random.choice(row*col, k)]
#row = data.shape[0]
#col = data.shape[1]

7.7.欧氏距离

7.7.1欧氏距离定义

基于K-means的图像分割(python代码详解)

7.7.2实现

distance = np.sqrt(np.sum((x - y)**2, axis=1))

7.7.3注意:同列不同行的数组可以进行加减法。

        计算图片RGB数组和一个簇心距离,二者形状分别为:[n, 3]和[1, 3]。

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([1, 2])
print(x-y)
输出:
 

基于K-means的图像分割(python代码详解)

 

7.8归类

7.8.1思路

        将三维数组另起一列,放像素点的归类信息。属于第k个簇,归类信息就存储为k。

        最终K-means返回的结果:每个像素点对应的信息只有它属于哪个类,取值范围为[0, k-1]。

7.8.2实现

        np.argmin:返回一行/列中最小元素的索引。

data[:, 3] = np.argmin(distance, axis=0)

7.9计算新簇心

7.9.1原理

        簇心 = 簇内所有点的平均值,簇心并不一定是实际存在的像素点的RGB取值。

7.9.2实现

for j in range(k): # k为簇的个数
	cluster.center[j] = np.mean(data[data[:, 3] == j], axis=0)

        其中,data[data[:, 3] == j]:返回全部有指定元素的行。文章来源地址https://www.toymoban.com/news/detail-401163.html

到了这里,关于基于K-means的图像分割(python代码详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k-means聚类算法 心得分享(含python实现代码)

    目录 1.K-means聚类算法 1.1 引言: 1.2 K-Means 算法的基本思想 1.3 K-Means 算法的优缺点: 1.4 K-Means 算法的应用: 2.K-means聚类算法的实现具体步骤 2.1初始化聚类中心 2.2计算每个数据点到聚类中心的距离 2.3确定每个数据点所属聚类簇 2.4更新聚类中心 2.5循环执行步骤2-4,直到达到最

    2024年02月02日
    浏览(45)
  • K-Means聚类算法及其python实现(已附上代码至本博客)

    觉得有用的,一腚要先点赞后收藏!!!气死人了,40多个收藏0点赞!! 对于 n代表了x有n维,x上标j表示第j维的特征,下标i表示该向量是第i个样本 簇中心坐标为:(当然,这也是重新计算簇中心坐标的方法!!) 向量 u i = ( u i ( 1 ) , u i ( 2 ) , ⋅ ⋅ ⋅ , u i ( j ) , ⋅ ⋅ ⋅ , u i ( n )

    2024年02月08日
    浏览(40)
  • 机器学习实战:Python基于K均值K-means进行聚类(九)

    1.1 K-means的介绍 K均值( K-means )是一种基于距离度量的聚类算法,其主要思想是将数据集划分为k个不同的簇,每个簇代表一个相似度较高的数据组。该算法通过迭代优化来最小化所有数据点与其所属簇的欧氏距离之和,从而找到最佳的簇划分。 需要区分一下,K-means和KNN是两

    2024年02月16日
    浏览(34)
  • 【机器学习实战】Python基于K均值K-means进行聚类(九)

    1.1 K-means的介绍 K均值( K-means )是一种基于距离度量的聚类算法,其主要思想是将数据集划分为k个不同的簇,每个簇代表一个相似度较高的数据组。该算法通过迭代优化来最小化所有数据点与其所属簇的欧氏距离之和,从而找到最佳的簇划分。 需要区分一下,K-means和KNN是两

    2024年02月06日
    浏览(39)
  • 毕业设计:基于python微博舆情分析系统+可视化+Django框架 K-means聚类算法(源码)✅

    毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅 感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。

    2024年01月19日
    浏览(49)
  • 四种确定K-means最佳聚类个数的方法(K-means++)——附代码

    目录 摘要: 1.K-means算法 2.Calinski-Harabasz Criterion(卡林斯基-哈拉巴斯指标,CH值) 3.Davies-Bouldin Criterion(戴维斯-博尔丁指标,DB值) 4.Gap Value(Gap值) 5.Silhouette Coefficient(轮廓系数) 6.基于Matlab的K-means聚类及最佳聚类数选取结果: 7.本文Matlab代码实现: Kmeans算法中,K值所决

    2024年01月17日
    浏览(46)
  • k-means聚类算法详解

    什么是特征向量? 用来描述样本点的一组数据,要和我们数学中的向量区别一下,本质来说就是个数组,数组中的每个元素代表从不同角度描述样本点的值。 K-means 是我们最常用的基于 欧式距离 的聚类算法,其认为两个目标的距离越近,相似度越大。 聚类就是对大量末知标

    2024年02月16日
    浏览(33)
  • 基于weka手工实现K-means

    K均值聚类(K-means clustering)是一种常见的无监督学习算法,用于将数据集中的样本划分为K个不同的类别或簇。它通过最小化样本点与所属簇中心点之间的距离来确定最佳的簇划分。 K均值聚类的基本思想如下: 随机选择K个初始聚类中心(质心)。 对于每个样本,计算其与各

    2024年02月13日
    浏览(34)
  • Python实现简单k-means聚类

    目录 1.导入原始数据集  2.首次计算中心点 3.进行迭代循环,不断优化样本中心点和聚类结果 4.聚类可视化 通过手动书写k-means聚类算法的逻辑实现聚类(而非使用python内置的sklearn) 不了解k-means聚类算法的话可以先去了解以下这种算法的原理,下面就直接进入正题啦~ 首先我

    2024年02月03日
    浏览(42)
  • 基于K-Means聚类与RFM模型分析顾客消费情况【500010102】

    本数据集是生成式模拟数据,本项目通过可视化分析对数据进行初步探索,再通过时间序列针对店铺的销售额进行分析,对时序图进行分解,发现数据存在季节性,并且通过auto_arima自动选择参数建立了SARIMA模型,对未来7天的销售额进行预测,并利用聚类分析将消费者分为不

    2024年01月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包