DIY图像压缩——机器学习实战之K-means 聚类图像压缩:色彩量化

简介: 本文以图像压缩为例,介绍了机器学习的实际应用之一。
更多深度文章,请关注:https://yq.aliyun.com/cloud
作者: ML bot2

这篇文章是K均值聚类算法(K-means clustering)的一个简单应用:压缩图像。

在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * 256 * 256。下图为1280 x 720像素的图像,采用PNG格式(一种无损压缩技术),大小为1.71 MB。 我们的目标是使用颜色量化进一步压缩图像,尽管压缩过程会有损失。

tiger.png?w=1024


K均值聚类

这是一种在给定的数据点集合中找到“K”个簇的优化算法。最初,它随机分配K个簇中心,然后基于一些距离度量(例如,欧几里得距离),使来自簇中心的数据点的距离之和最小化。K均值聚类算法有两个步骤:

a)分配 - 将每个数据点分配给离中心距离最近的簇。

b)更新 - 从指定给新簇的数据点计算新的均值(质心)。

为了描述K均值聚类算法前后的区别,请看下面这个例子(K=3)。

image.png
在图像压缩问题中,K均值聚类算法会把类似的颜色分别放在K个簇中——也就是说,每个簇的颜色都变成了一种。因此,我们只需要保留每个像素的标签(表明该像素在哪个簇中),以及每个簇的颜色编码即可完成图像的压缩。


压缩

我们将编写一个简单的python代码来压缩图像,并将压缩图像与代码本(Codebook)一起存储。这里保存的压缩图像只是原始图像的每个像素的簇标签。代码本是在运行K均值算法后实现的簇中心存储列表的别名。簇标签和代码本都保存在数据类型“无符号整数”中。以下为图像压缩代码:

from skimage import io
from sklearn.cluster import KMeans
import numpy as np

image = io.imread('tiger.png')
io.imshow(image)
io.show()

rows = image.shape[0]
cols = image.shape[1]
 
image = image.reshape(image.shape[0]*image.shape[1],3)
kmeans = KMeans(n_clusters = 128, n_init=10, max_iter=200)
kmeans.fit(image)

clusters = np.asarray(kmeans.cluster_centers_,dtype=np.uint8) 
labels = np.asarray(kmeans.labels_,dtype=np.uint8 )  
labels = labels.reshape(rows,cols); 

np.save('codebook_tiger.npy',clusters.imsave('compressed_tiger.png',labels
我们可以选择足够大的K来表示图像的颜色。示例中K为128,表明原始图像中的所有颜色组合被量化为128种不同的颜色。这些颜色将会在新图片中呈现(解压缩后),并且应在视觉上类似于原始图像。


解压缩

我们还需要解压缩图像,以便可视化重建的图像。以下为图像解压缩代码:

from skimage import io
import numpy as np

centers = np.load('codebook_tiger.npy_image = io.imread('compressed_tiger.png')

image = np.zeros((c_image.shape[0],c_image.shape[1],3),dtype=np.uint8 )
for i in range(c_image.shape[0]):
    for j in range(c_image.shape[1]):
            image[i,j,:] = centers[c_image[i,j],:]
io.imsave('reconstructed_tiger.png',imageo.imshow(image)
io.show()

下图为解压缩后的图像。虽然新图像失去了大量的像素颜色信息,但没有出现任何主要的差异。

reconstructed_tiger.png?w=1024

此外,您可以通过单独查看码本中的颜色来找到新图像的128种颜色。


注意

1. 如果您尝试按照博客文章中的方式来压缩“jpeg”图像,那么您将会发生错误,因为jpeg会进行有损压缩。 jpeg的压缩算法改变了像素的值,因此包含标签的压缩图像中的像素可能会超过K,从而导致错误。
2. K均值算法是在给定数据集中查找指定数量簇的优化问题。图像尺寸增加或K值增加都会增加执行时间。所以,你可以从较低的K值开始,以便快速获得结果。
3. 在压缩时间和压缩比率之间存在折衷。较高的K值将产生更好的压缩图像质量,但压缩时间也会更长。


结论

您可以在这里查看博客文章中的图像所占用的磁盘空间,如下图所示。原始的png图像是1757 KB(tiger.png),而压缩的虎图像和码本总共只有433 KB。新图像也占用更少的空间:由于只有128种独特的颜色,新的压缩比超过2。

spaces.jpg

该压缩方法仅仅减少了图像中的颜色数量,又被称为颜色量化(Colour Quantization)。压缩过程中没有减少图像的大小或像素的取值范围。


完整的Python代码可以在 Github中找到,希望你很容易再现本文的例子。如果您喜欢这篇文章,请follow博客以获取文章更新,并请分享这篇文章。请尽管讨论有关该帖子的任何内容,我很乐意收到您的反馈。祝你机器学习愉快!


本文由北邮 @爱可可-爱生活 老师推荐, 阿里云云栖社区组织翻译。
文章原标题《Image Compression using K-means Clustering : Colour Quantization – Machine Learning in Action》,作者: ML bot2,译者:杨辉,审阅:段志成-海棠,附件为原文的pdf。

文章为简译,更为详细的内容,请查看原文

相关文章
|
1天前
|
机器学习/深度学习 传感器 数据采集
机器学习实战 —— 工业蒸汽量预测(六)
机器学习实战 —— 工业蒸汽量预测(六)
9 0
|
1天前
|
机器学习/深度学习 分布式计算 并行计算
【机器学习】怎样在非常大的数据集上执行K-means算法?
【5月更文挑战第13天】【机器学习】怎样在非常大的数据集上执行K-means算法?
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】列举几种情况,在这些情况下K-means算法难以取得较好效果
【5月更文挑战第13天】【机器学习】列举几种情况,在这些情况下K-means算法难以取得较好效果
|
1天前
|
机器学习/深度学习 传感器 数据采集
机器学习实战 —— 工业蒸汽量预测(五)
机器学习实战 —— 工业蒸汽量预测(五)
4 0
|
1天前
|
机器学习/深度学习 传感器 数据采集
机器学习实战 —— 工业蒸汽量预测(四)
机器学习实战 —— 工业蒸汽量预测(四)
10 1
|
1天前
|
机器学习/深度学习 传感器 数据采集
机器学习实战 —— 工业蒸汽量预测(三)
机器学习实战 —— 工业蒸汽量预测(三)
10 1
|
1天前
|
机器学习/深度学习 数据采集 传感器
机器学习实战 —— 工业蒸汽量预测(二)
机器学习实战 —— 工业蒸汽量预测(二)
8 1
|
1天前
|
机器学习/深度学习 传感器 数据采集
机器学习实战 —— 工业蒸汽量预测(一)
机器学习实战 —— 工业蒸汽量预测(一)
11 1
|
1天前
|
数据采集 机器学习/深度学习 人工智能
【机器学习】在使用K-means算法之前,如何预处理数据?
【5月更文挑战第12天】【机器学习】在使用K-means算法之前,如何预处理数据?
|
1天前
|
机器学习/深度学习 算法 数据可视化
【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
【5月更文挑战第12天】【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法

热门文章

最新文章