等待下一个秋

  • Spark
  • Flink
  • Hive
  • 数据仓库
  • ClickHouse
  • 收徒弟
  • Java
    • Spring
    • Mybatis
    • SpringBoot
    • 面试题
  • Python
    • Python基础
    • 爬虫
    • Numpy
    • matplotlib
    • Flask
  • 技术杂谈
    • Linux知识
    • Docker
    • Git教程
    • Redis教程
    • mysql
    • 前端
    • R语言
    • 机器学习
  • 关于我
  • 其它
    • 副业挣钱
    • 资料下载
    • 资料文档
专注于Hadoop/Spark/Flink/Hive/数据仓库等
关注公众号:大数据技术派,获取更多学习资料。
  1. 首页
  2. 技术杂谈
  3. 机器学习
  4. 正文

K-Means算法、非负矩阵分解(NMF)与图像压缩

2019年4月10日 10355点热度 0人点赞 0条评论

K-Means算法是最基础的聚类算法、也是最常用的机器学习算法之一。 本教程中,我们利用K-Means对图像中的像素点进行聚类,然后用每个像素所在的簇的中心点来代替每个像素的真实值,从而达到图像压缩的目的。

非负矩阵分解(Non-negative Matrix Factorization, NMF)是一种对非负矩阵进行低维近似逼近的常见方法,同样也能达到图像压缩的目的。

预计学习用时:30分钟。
本教程基于Python 3.5。
原创者:SofaSofa TeamM | 修改校对:SofaSofa TeamC |

前言

K Means算法比NMF算法慢很多,尤其是当聚类数较大时,所以实验时请耐心等待。此外,由于两者重建图像的原理不同,所以两者的视觉也相差很大,k Means牺牲了颜色的个数而保留了边界和形状,而NMF牺牲了形状以及边界却尽量保留颜色。整个实验过程中会产生一些有趣风格的图像,注意留意哦!

完整的代码在第4节。

  1. 图像的读取
    本教程以台湾省台北市最高建筑“台北101”大厦的夜景图为例,该图的分辨率为600 * 800。
    点击这里下载实验图片。
    我们需要skimage、numpy、matplotlib.pyplot这三个库来实现图像的读取以及显示。

    import numpy as np
    import matplotlib.pyplot as plt
    from skimage import io
    

    利用io.imread直接读取图像文件,并存入np.ndarray类型的变量d。注意:为了图像在plt中无色差地显示,请一定要将d中的元素转成0到1的浮点数。

    d = io.imread('taibei101.jpg')
    d = np.array(d, dtype=np.float64) / 255
    

    d是三维array,第一个维度代表行数,第二个维度代表列数,第三个维度代表该图像是RGB图像,每个像素点由三个数值组成。

    d.shape
    (600, 800, 3)
    

    调用plt.imshow函数便可以显示图像。

    plt.axis('off')
    plt.imshow(d); plt.show()
    

    K Means 压缩图像

    在我们的例子当中,每个像素点都是一个数据;每个数据拥有三个特征,分别代表R(红色),G(绿色),B(蓝色)。 K Means是一种常见的聚类方法,其思想就是让“距离”近的数据点分在一类。这里的“距离”就是指两个像素点RBG差值的平方和的根号。
    Dist(P1,P2)=∥P1−P2∥2
    K Means压缩图像的原理是,用每个聚类(cluster)的中心点(center)来代替聚类中所有像素原本的颜色,所以压缩后的图像只保留了K个颜色。

假如这个600×800的图像中每个像素点的颜色都不一样,那么我们需要
800×600×3=1440000
个数来表示这个图像。对于K Means压缩之后的图像,我们只需要
800×600×1+K×3
个数来表示。800×600×1是因为每个像素点需要用一个数来表示其归属的簇,K×3是因为我们需要记录K个中心点的RGB数值。所以经过K Means压缩后,我们只需要三分之一左右的数就可以表示图像。

下面的函数KMeansImage(d, n_colors)就可以用来生成n_colors个颜色构成的图像。

from sklearn.cluster import KMeans
def KMeansImage(d, n_colors):
    w, h, c = d.shape
    dd = np.reshape(d, (w * h, c))
    km = KMeans(n_clusters=n_colors)
    km.fit(dd)
    labels = km.predict(dd)
    centers = km.cluster_centers_
    new_img = d.copy()
    for i in range(w):
        for j in range(h):
            ij = i * h + j
            new_img[i][j] = centers[labels[ij]]
    return {'new_image': new_img, 'center_colors': centers}

运行以上函数,我们可以看看在不同的K的取值之下,图像压缩的效果。

plt.figure(figsize=(12, 9))
plt.imshow(d); plt.axis('off')
plt.show()
for i in [2, 3, 5, 10, 30]:
    print('Number of clusters:', i)
    out = KMeansImage(d, i)
    centers, new_image = out['center_colors'], out['new_image']
    plt.figure(figsize=(12, 1))
    plt.imshow([centers]); plt.axis('off')
    plt.show()
    plt.figure(figsize=(12, 9))
    plt.imshow(new_image); plt.axis('off')
    plt.show()

Number of clusters: 2


Number of clusters: 3


Number of clusters: 5


Number of clusters: 10


Number of clusters: 30


标签: 算法
最后更新:2020年10月10日

等待下一个秋

待我代码写成,便娶你为妻!专注于Hadoop/Spark/Flink/Hive/数据仓库等,关注公众号:大数据技术派,获取更多学习资料。

打赏 点赞
下一篇 >

文章评论

取消回复

等待下一个秋

待我代码写成,便娶你为妻!专注于Hadoop/Spark/Flink/Hive/数据仓库等,关注公众号:大数据技术派,获取更多学习资料。

搜一搜
微信
最新 热点 随机
最新 热点 随机
ChatGPT可以做什么 ClickHouse 自定义分区键 ClickHouse数据副本引擎 ClickHouse ReplacingMergeTree引擎 ClickHouse MergeTree引擎 clickhouse简介
特斯拉可能增加哪种“绿色”加密货币用于支付? Spark SQL知识点大全与实战 买了个公众号 程序员必备的一些数学基础知识 Python批量删除mysql中千万级大量数据 黑客与画家 7.关注贫富分化
标签聚合
Flink Python 算法 mysql 挣钱 书籍 大数据 数据仓库 R语言 Java Redis Hive
文章归档
  • 2023年2月
  • 2022年12月
  • 2022年11月
  • 2022年9月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年5月
  • 2020年4月
  • 2020年1月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年1月
  • 2018年12月
  • 2017年5月

©2022 ikeguang.com. 保留所有权利。

鄂ICP备2020019097号-1

鄂公网安备 42032202000160号