美文网首页
Python 利用聚类算法对图片进行颜色压缩

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

作者: 数据人阿多 | 来源:发表于2022-07-12 17:02 被阅读0次

背景

最近看到其他公众号发的一篇文章《三个印度人改变压缩算法,一意孤行整个暑假,却因“太简单”申不到经费》,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

10类

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

由于原图里面蓝色较多,聚为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 plt

np.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)

历史相关文章


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

相关文章

  • Python 利用聚类算法对图片进行颜色压缩

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

  • 【机器学习】无监督学习 K-means(K-均值聚类算法)

    任务 利用K-均值聚类算法对未标注数据分组 对聚类得到的簇进行后处理 二分K-均值聚类算法 思想 聚类算法几乎可以...

  • 02-17

    今天看的是EM聚类最大期望算法。通过初始化参数,生成预期结果,并对其进行重新估计,再利用不同的混合模型进行聚类操作...

  • 09 聚类算法 - 层次聚类 - CF-Tree、BIRCH、C

    08 聚类算法 - 聚类算法的衡量指标 五、层次聚类概述 层次聚类方法对给定的数据集进行层次的分解,直到满足某种条...

  • 机器学习实战Py3.x填坑记10—利用K-均值聚类算法对未标注数

    本章内容:K-均值聚类算法对聚类得到的簇进行后处理二分K-均值聚类算法对地理位置进行聚类 在运行程序清单10-1的...

  • 2018-12-19

    文本聚类算法之K-means算法的python实现 一、文本聚类定义 文本聚类主要是依据著名的聚类假设:同类...

  • 原型聚类(k 均值、学习向量量化、高斯混合聚类)

    算法释义 原型聚类算法假设聚类结构可以通过一组原型刻画,通常算法选会对原型进行初始化,然后对原型进行迭代更新求解。...

  • 主要聚类算法的分类

    一、基于原型的聚类 基于原型的聚类,简称原型聚类。此类算法假设聚类结构能通过一组原型刻画,算法先对原型进行初始化,...

  • WebGL 几何压缩

    利用Draco几何压缩库压缩顶点、法线、UV、颜色等数据; Draco提供了对obj、gltf格式的模型进行压缩,...

  • 闲谈数据压缩

    1.数据压缩算法你用过几种?之前知道压缩有文件类ZIP,GZIP,图片类,质量压缩,采样率压缩等,当然图片也是文件...

网友评论

      本文标题:Python 利用聚类算法对图片进行颜色压缩

      本文链接:https://www.haomeiwen.com/subject/jnwnbrtx.html