背景

最近看到其他公众号发的一篇文章《三个印度人改变压缩算法,一意孤行整个暑假,却因“太简单”申不到经费》,DCT是最原始的图像压缩算法

全称为Discrete Cosine Transform,即离散余弦变换

刚好小编之前做过图像、视频处理相关的研发工作,对图像处理比较感兴趣,之前也看过利用聚类进行图片颜色压缩的内容,索性就再回顾一下,分享出来供大家参考学习

聚类算法本文不再赘述,不会的同学记住核心思想即可:人以类聚,物以群分

《三个印度人改变压缩算法,一意孤行整个暑假,却因“太简单”申不到经费》https://mp.weixin.qq.com/s/l3EPCNlE0Ne3wU5YFQ65dg

题外话,三角函数中余弦函数运用的比较多,在计算向量(文本、语音向量化)的相似度,这里的离散余弦变换

原始图片,4.47MB

本文演示的图片数据,均基于该张图片,故宫.jpg

颜色压缩效果

4032*3024 行=12192768 行,也就是1219万个像素点、1219万个颜色点
压缩为10个颜色点、128个颜色点

图片数据介绍

大家都知道一个像素可以表示为R(红色 Red)、G(绿色 Green)、B(蓝色 Blue)三个数值组成,照片是一个颜色矩阵,可以理解为每行由指定的像素点排成一行组成,这样由很多行就组合成了一个图片,千万别被高级名词:三维矩阵吓到

我们可以对该图片颜色矩阵进行变换,转换为我们熟悉的二维矩阵,RGB每个颜色是一个特征列,这个矩阵一共有4032*3024 行=12192768 行,也就是1219万个像素点、1219万个颜色点

先放第一行的点,再放第二行的点,以此类推,然后每个点展开为3列,这个就是numpy里面矩阵变换时数据的变化规则

变换后结果如下图所示:

转换为二维矩阵后,是不是和平时分析的数据样式就一样了,这样就可以用来进行聚类,特征列只有3个,分别为R、G、B

确定运用的颜色个数(聚类中簇的个数)

一共有 4032*3024 行=12192768 行 数据,我们要聚为几类呢?我们可以先大概取一些值,比如聚为2类、3类、5类 等等,然后使用肘部法则,来大概确定一个合适的分类数(簇数)

利用SSE指标,结合肘部法则,可以确定聚为10类时,比较合适

然后用这10类的中心点坐标颜色来还原图片,相当于用10种颜色来对图片进行上色,可以看到图片基本与原图一直,除了天空有锯齿外,图片其他的地方完美显示,这时图片大小为 997KB

极端情况,聚类为2种颜色

由于原图里面蓝色较多,聚为2类时,除了有蓝色,还有暗棕色

脑洞大开,用黑白色表示

由于上面可以用2种颜色来表示,于是脑洞大开,可以用黑色与白色来试试,效果如下图所示,有点类似手绘风格的图片

完整代码

from skimage import io
# from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans  #提升聚类速度
import numpy as np
import sklearn.metrics as sm
import matplotlib.pyplot as pltnp.set_printoptions(threshold=np.inf)image = io.imread('故宫.jpg')
io.imshow(image)data=image/255.0
data=data.reshape(-1,3)SSE = []
silhouette_score = []
k = []
#簇的数量
colors=[2,3,5,10,16,32,64,128]
for n_clusters in colors:cls = MiniBatchKMeans(n_clusters,batch_size=2048).fit(data)score1 = cls.inertia_SSE.append(score1)#肘部法则,确定聚类个数
fig, ax1 = plt.subplots(figsize=(10, 6))ax1.scatter(range(1,9), SSE)
ax1.plot(range(1,9), SSE)
ax1.set_xlabel("colors",fontdict={'fontsize':15})
ax1.set_ylabel("SSE",fontdict={'fontsize':15})
ax1.set_xticks(range(1,9))
for i in range(8):plt.text(i+1, SSE[i],colors[i])plt.show()#运用10个聚类色表示图片
colors_use=10
km = MiniBatchKMeans(colors_use,batch_size=2048)
km.fit(data)
new_data = km.cluster_centers_[km.predict(data)]   #利用np.array 的整数索引(高级索引知识),用聚类中心点值 代替原来点的值image_new = new_data.reshape(image.shape)
image_new_convert = np.array(np.round(image_new * 255),dtype='uint8')
io.imsave('colors_use_10.jpg',image_new_convert)#黑白色表示
new_data =np.array([[255,255,255],[0,0,0]])[kmeans.predict(data)]
image_new = new_data.reshape(image.shape)
image_new_convert = np.array(np.round(image_new * 255),dtype='uint8')
io.imsave('黑白色.jpg',image_new_convert)

历史相关文章

  • 利用Python 自己动手制作动漫效果图片
  • 利用Python对图片进行马赛克处理
  • 利用Python生成手绘效果的图片

以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货

Python 利用聚类算法对图片进行颜色压缩相关推荐

  1. 大数据项目13(Python实现聚类算法)

    Python实现聚类算法 一.k-means 聚类算法思想 1. 分步解析 2. 代码 3.结果 一.k-means 聚类算法思想 先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到 ...

  2. Python基于聚类算法实现密度聚类(DBSCAN)计算

    本文实例讲述了Python基于聚类算法实现密度聚类(DBSCAN)计算.分享给大家供大家参考,具体如下: 算法思想 基于密度的聚类算法从样本密度的角度考察样本之间的可连接性,并基于可连接样本不断扩展聚 ...

  3. Python数据挖掘:利用聚类算法进行航空公司客户价值分析

    无小意丶 个人博客地址:无小意 知乎主页:无小意丶 公众号: 数据路(shuju_lu) 刚刚开始写博客,希望能保持关注,会继续努力. 以数据相关为主,互联网为辅进行文章发布. 本文是<Pyth ...

  4. python多维向量聚类_机器学习:Python实现聚类算法(三)之总结

    考虑到学习知识的顺序及效率问题,所以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作 ...

  5. python谱聚类算法_谱聚类Spectral clustering(SC)

    在之前的文章里,介绍了比较传统的K-Means聚类.Affinity Propagation(AP)聚类.比K-Means更快的Mini Batch K-Means聚类以及混合高斯模型Gaussian ...

  6. python DBSCAN聚类算法

    文章目录 DBSCAN聚类算法 基本思想 基本概念 工作流程 参数选择 DBSCAN的优劣势 代码分析 ==Matplotlib Pyplot== ==make_blobs== ==StandardS ...

  7. python谱聚类算法_谱聚类(spectral clustering)原理总结

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  8. python网管系统_IT外包网管服务,Python密度聚类算法-DBSCAN实践

    蓝盟 IT小贴士,来喽! 可以看出,a点附近的点密度大,红色的圆按照一定的规则在这里滚动,最终收纳a点附近的5点,标记为红色是同一个簇. 其他没有收纳的东西,按照相同的规则进行集群化. 从图像上来看, ...

  9. python谱聚类算法_谱聚类 - python挖掘 - 博客园

    谱聚类(Spectral Clustering,SC)是一种基于图论的聚类方法,将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量远.能够识别任意形状的样本空间且收敛于全 ...

最新文章

  1. 69.2. wget - retrieves files from the web
  2. java的mythread_java多线程 - myShadow - OSCHINA - 中文开源技术交流社区
  3. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)
  4. SSH配置启动后Could not instantiate bean class [org.hibernate.cfg.AnnotationConfiguration
  5. linux卸载nomachine,NoMachine 安装与配置及使用
  6. python计算两个时间间隔准确的天、月、年之差
  7. c语言列出1~100所有素数_一次找出范围内的所有素数,埃式筛法是什么神仙算法?...
  8. postgresql基本命令操作
  9. 牛客多校第三场J LRU management(双向链表)题解
  10. 日期插件(jedate)
  11. 修改文件 火车票买下铺_12306修改代码买下铺?12306码农太弱了吧 (转载)
  12. 应用wps对证件照进行更改颜色,更换只需三步。
  13. android sqlite同时读写,SQLite同时读写
  14. CDN是什么?为何要用CDN加速网站?
  15. 批量修改WORD文档密码
  16. 2015年换工作感想
  17. Kyligence Zen 产品体验 — “人人都是数据分析师”
  18. 做微信还是做APP,两种选择的不同风险
  19. JScrollPane的使用
  20. 心理测评数据分析系统(Java毕业设计)

热门文章

  1. 相干采样 FFT python
  2. 用Postgis算最短路径(在任意位置选择起点终点)
  3. 网红创业潮来袭 网红经济还能红多久?
  4. 这是毕业生们唯一的信念;我所看到最好的毕业纪念文
  5. 赛扬处理器_【推仔说新闻】Intel 奔腾和赛将处理器即将支持傲腾产品
  6. [典故收集]氪金狗眼
  7. 借助onenet平台,温湿度远端采集
  8. 落地零售智能体,百联集团全力打造面向未来的数字化商业体
  9. 【large bin 】源码解析
  10. 网站标准/CMS/ADS....