1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.cluster import KMeans
  4. from sklearn.utils import shuffle
  5. import mahotas as mh
  6.  
  7. original_img = np.array(mh.imread('Penguins.jpg'), dtype=np.float64) / 255
  8.  
  9. '''
  10. >>> original_img
  11. array([[[ 0.45490196, 0.68627451, 0.81960784],
  12. [ 0.4627451 , 0.68235294, 0.81960784],
  13. [ 0.4627451 , 0.68235294, 0.81960784],
  14. ...,
  15. [ 0.34901961, 0.62352941, 0.81568627],
  16. [ 0.35686275, 0.62352941, 0.81568627],
  17. [ 0.35686275, 0.62352941, 0.81568627]],
  18.  
  19. [[ 0.45490196, 0.69019608, 0.82352941],
  20. [ 0.45490196, 0.68235294, 0.82745098],
  21. [ 0.45882353, 0.68627451, 0.83137255],
  22. ...,
  23. [ 0.34117647, 0.63137255, 0.80784314],
  24. [ 0.34117647, 0.63529412, 0.8 ],
  25. [ 0.34117647, 0.63529412, 0.8 ]],
  26.  
  27. [[ 0.4627451 , 0.69411765, 0.82745098],
  28. [ 0.45882353, 0.68627451, 0.83137255],
  29. [ 0.45882353, 0.68627451, 0.83137255],
  30. ...,
  31. [ 0.33333333, 0.63921569, 0.78823529],
  32. [ 0.3372549 , 0.64313725, 0.78431373],
  33. [ 0.3372549 , 0.64313725, 0.78431373]],
  34.  
  35. ...,
  36. [[ 0.34509804, 0.4745098 , 0.35294118],
  37. [ 0.50588235, 0.54901961, 0.5254902 ],
  38. [ 0.76078431, 0.79215686, 0.56078431],
  39. ...,
  40. [ 0.43921569, 0.54117647, 0.5372549 ],
  41. [ 0.39607843, 0.49803922, 0.50196078],
  42. [ 0.34117647, 0.42352941, 0.42745098]],
  43.  
  44. [[ 0.31764706, 0.44705882, 0.40392157],
  45. [ 0.37647059, 0.46666667, 0.49803922],
  46. [ 0.30196078, 0.40392157, 0.29019608],
  47. ...,
  48. [ 0.44313725, 0.52156863, 0.51372549],
  49. [ 0.43921569, 0.50980392, 0.51764706],
  50. [ 0.36078431, 0.45882353, 0.44705882]],
  51.  
  52. [[ 0.30588235, 0.40784314, 0.37254902],
  53. [ 0.31372549, 0.42352941, 0.47058824],
  54. [ 0.31372549, 0.39607843, 0.36862745],
  55. ...,
  56. [ 0.40784314, 0.50588235, 0.48235294],
  57. [ 0.41568627, 0.49803922, 0.50196078],
  58. [ 0.33333333, 0.40392157, 0.40392157]]])
  59. >>> original_img.shape[0] #宽度
  60. 434
  61. >>> original_img.shape[1] #高度
  62. 1024
  63. >>> original_img.shape[2]
  64. 3
  65. '''

  66. original_dimensions = tuple(original_img.shape)
  67.  
  68. '''
  69. >>> original_dimensions
  70. (434, 1024, 3)
  71. '''

  72. width, height, depth = tuple(original_img.shape)
  73. #文档说,是高度,宽度,Must be of shape (h,w,3)
  74. #http://mahotas.readthedocs.org/en/latest/api.html
  75. image_flattened = np.reshape(original_img, (width * height, depth))
  76. '''
  77. >>> image_flattened.shape
  78. (444416, 3)
  79. '''
  80. #随机选取1000个颜色点
  81. image_array_sample = shuffle(image_flattened, random_state=0)[:1000]
  82. '''
  83. >>> image_array_sample
  84. array([[ 0.2745098 , 0.37254902, 0.4 ],
  85. [ 0.41568627, 0.6627451 , 0.82352941],
  86. [ 0.64705882, 0.75686275, 0.94117647],
  87. ...,
  88. [ 0.11764706, 0.25490196, 0.33333333],
  89. [ 0.7372549 , 0.79607843, 0.96470588],
  90. [ 0.7254902 , 0.78823529, 0.92156863]])
  91. >>> image_array_sample.shape
  92. (1000, 3)
  93. '''
  94.  
  95. #1000个采样点,64个聚簇
  96. estimator = KMeans(n_clusters=64, random_state=0)
  97. estimator.fit(image_array_sample)
  98.  
  99. cluster_assignments = estimator.predict(image_flattened)
  100.  
  101. '''
  102. >>> cluster_assignments
  103. array([ 6, 6, 6, ..., 14, 14, 14])
  104. >>> cluster_assignments.shape
  105. (444416,)
  106. >>>
  107. 这样就给每一个颜色值分配了一个颜色标签(这样的标签共有64个)
  108. '''
  109.  
  110. compressed_palette = estimator.cluster_centers_
  111. compressed_img = np.zeros((width, height, compressed_palette.shape[1]))
  112.  
  113. label_idx = 0
  114. for i in range(width):
  115. for j in range(height):
  116. compressed_img[i][j] = compressed_palette[cluster_assignments[label_idx]] #根据标签,获得颜色值
  117. label_idx += 1
  118. plt.subplot(121) #一行两列第一个位置
  119. plt.title('Original Image')
  120. plt.imshow(original_img)
  121.  
  122. plt.axis('off')
  123. plt.subplot(122) #很神奇的地方,一行两列,第二个位置
  124. plt.title('Compressed Image')
  125. plt.imshow(compressed_img)
  126. plt.axis('off')
  127. plt.show()

KMeans的数据压缩的更多相关文章

  1. PCA and kmeans MATLAB实现

    MATLAB基础知识 l  Imread:  读取图片信息: l  axis:轴缩放:axis([xmin xmax ymin ymax zmin zmax cmin cmax]) 设置 x.y 和  ...

  2. 机器学习公开课笔记(8):k-means聚类和PCA降维

    K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis ...

  3. K-means Algorithm

    在监督学习中,有标签信息协助机器学习同类样本之间存在的共性,在预测时只需判定给定样本与哪个类别的训练样本最相似即可.在非监督学习中,不再有标签信息的指导,遇到一维或二维数据的划分问题,人用肉眼就很容易 ...

  4. Andrew Ng机器学习课程笔记--week8(K-means&PCA)

    Unsupervised Learning 本周我们讲学习非监督学习算法,会学习到如下概念 聚类(clustering) PCA(Principal Componets Analysis主成分分析), ...

  5. Coursera在线学习---第八节.K-means聚类算法与主成分分析(PCA)

    一.K-means聚类中心初始化问题. 1)随机初始化各个簇类的中心,进行迭代,直到收敛,并计算代价函数J. 如果k=2~10,可以进行上述步骤100次,并分别计算代价函数J,选取J值最小的一种聚类情 ...

  6. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  7. 当我们在谈论kmeans(1)

    本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 简书:建设中... 知乎:建设中... 当我们在谈论 ...

  8. K-Means 聚类算法

    K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...

  9. 用scikit-learn学习K-Means聚类

    在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...

随机推荐

  1. Springmvc注解启用

      http://www.blogbus.com/wanping-logs/235898637.html 使用注解的原因 最方便的还是启用注解 注解方便,而且项目中很流行. 配置文件尽量减少,主要使用 ...

  2. jQuery 中的 Deferred 和 Promises(转)

    转自:http://www.css88.com/archives/4750/comment-page-1 看前首先了解:Promises/A规范,具体可以看这里,http://www.css88.co ...

  3. Broadcast Intent & Broadcast Receiver

    当Android系统发生某种状况,必须通知所有程序进行处理时,例如电量不足等,可利用Broadcast Intent对象的功能来进行信息广播. 运行机制包括两部:送出Intent对象的程序:监听广播信 ...

  4. 【TFS】解决TFS编译中文乱码问题

    前言; TFS2018做程序集成非常方便,线上编译然后直接生成docker镜像,但是在使用过程中遇到编译窗口中文乱码的问题,这个问题找了好久没人知道怎么解决.如下: 这个问题不解决,每次编译失败,研发 ...

  5. rest-client restclient get post写法

    get url = "https://api.weixin.qq.com/sns/jscode2session" data = { appid: "××××", ...

  6. 每天一个Linux命令(29)du命令

        du命令是对文件和目录磁盘使用的空间的查看.     (1)用法:     用法:  du  [选项]  [文件]     (2)功能:     功能:  报告磁盘空间使用情况     (3) ...

  7. inline 元素的特性

    http://www.maxdesign.com.au/articles/inline/ http://www.w3.org/TR/CSS2/visuren.html#inline-boxes htt ...

  8. CentOS下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. 当磁盘大小超过标准时会有报警提示,这时如 ...

  9. java: jsp:param中文乱码

    java: jsp:param中文乱码 假如a.jsp/b.jsp文件中 a.jsp代码: 需要加入:request.setCharacterEncoding("UTF-8")  ...

  10. django 实现分页功能

    分页效果: 视图代码: # -*- coding: utf-8 -*- from django.shortcuts import render,get_object_or_404 from djang ...