作者: ML bot2
这篇文章是K均值聚类算法(K-means clustering)的一个简单应用:压缩图像。
在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * 256 * 256。下图为1280 x 720像素的图像,采用PNG格式(一种无损压缩技术),大小为1.71 MB。 我们的目标是使用颜色量化进一步压缩图像,尽管压缩过程会有损失。
K均值聚类
这是一种在给定的数据点集合中找到“K”个簇的优化算法。最初,它随机分配K个簇中心,然后基于一些距离度量(例如,欧几里得距离),使来自簇中心的数据点的距离之和最小化。K均值聚类算法有两个步骤:
a)分配 - 将每个数据点分配给离中心距离最近的簇。
b)更新 - 从指定给新簇的数据点计算新的均值(质心)。
为了描述K均值聚类算法前后的区别,请看下面这个例子(K=3)。
压缩
我们将编写一个简单的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()
下图为解压缩后的图像。虽然新图像失去了大量的像素颜色信息,但没有出现任何主要的差异。
此外,您可以通过单独查看码本中的颜色来找到新图像的128种颜色。
注意
1. 如果您尝试按照博客文章中的方式来压缩“jpeg”图像,那么您将会发生错误,因为jpeg会进行有损压缩。 jpeg的压缩算法改变了像素的值,因此包含标签的压缩图像中的像素可能会超过K,从而导致错误。2. K均值算法是在给定数据集中查找指定数量簇的优化问题。图像尺寸增加或K值增加都会增加执行时间。所以,你可以从较低的K值开始,以便快速获得结果。
3. 在压缩时间和压缩比率之间存在折衷。较高的K值将产生更好的压缩图像质量,但压缩时间也会更长。
结论
您可以在这里查看博客文章中的图像所占用的磁盘空间,如下图所示。原始的png图像是1757 KB(tiger.png),而压缩的虎图像和码本总共只有433 KB。新图像也占用更少的空间:由于只有128种独特的颜色,新的压缩比超过2。
该压缩方法仅仅减少了图像中的颜色数量,又被称为颜色量化(Colour Quantization)。压缩过程中没有减少图像的大小或像素的取值范围。
文章原标题《Image Compression using K-means Clustering : Colour Quantization – Machine Learning in Action》,作者: ML bot2,译者:杨辉,审阅:段志成-海棠,附件为原文的pdf。