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。 我们的目标是使用颜色量化进一步压缩图像,尽管压缩过程会有损失。


K均值聚类

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

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

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

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


在图像压缩问题中,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()

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

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


注意

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


结论

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

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


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


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

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

相关文章
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1567 6
|
机器学习/深度学习 算法 数据可视化
机器学习的核心功能:分类、回归、聚类与降维
机器学习领域的基本功能类型通常按照学习模式、预测目标和算法适用性来分类。这些类型包括监督学习、无监督学习、半监督学习和强化学习。
1424 0
|
机器学习/深度学习 数据采集 人工智能
【机器学习】QLoRA:基于PEFT亲手量化微调Qwen2大模型
【机器学习】QLoRA:基于PEFT亲手量化微调Qwen2大模型
1286 0
【机器学习】QLoRA:基于PEFT亲手量化微调Qwen2大模型
|
机器学习/深度学习 数据采集 算法
【机器学习】K-Means聚类的执行过程?优缺点?有哪些改进的模型?
K-Means聚类的执行过程、优缺点,以及改进模型,包括K-Means++和ISODATA算法,旨在解决传统K-Means算法在确定初始K值、收敛到局部最优和对噪声敏感等问题上的局限性。
481 2
|
机器学习/深度学习 算法 数据挖掘
【机器学习】聚类算法中的距离度量有哪些及公式表示?
聚类算法中常用的距离度量方法及其数学表达式,包括欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、余弦相似度等多种距离和相似度计算方式。
1498 1
|
机器学习/深度学习 算法 数据挖掘
【机器学习】Python详细实现基于欧式Euclidean、切比雪夫Chebyshew、曼哈顿Manhattan距离的Kmeans聚类
文章详细实现了基于不同距离度量(欧氏、切比雪夫、曼哈顿)的Kmeans聚类算法,并提供了Python代码,展示了使用曼哈顿距离计算距离矩阵并输出k=3时的聚类结果和轮廓系数评价指标。
454 1
|
机器学习/深度学习 人工智能 自然语言处理
机器学习算法入门:从K-means到神经网络
【6月更文挑战第26天】机器学习入门:从K-means到神经网络。文章涵盖了K-means聚类、逻辑回归、决策树和神经网络的基础原理及应用场景。K-means用于数据分组,逻辑回归适用于二分类,决策树通过特征划分做决策,神经网络则在复杂任务如图像和语言处理中大显身手。是初学者的算法导览。
|
机器学习/深度学习 算法 搜索推荐
机器学习中的聚类
**文章摘要:** 本文介绍了聚类算法的基本概念、应用、实现流程和评估方法。聚类是一种无监督学习技术,用于将数据分为相似的组,如K-means、层次聚类、DBSCAN和谱聚类。K-means算法通过迭代优化质心,将数据点分配到最近的簇,直至质心不再变化。模型评估包括误差平方和(SSE)、肘部方法(确定最佳簇数)和轮廓系数法(Silhouette Coefficient),以量化聚类的紧密度和分离度。应用场景涵盖用户画像、广告推荐和图像分割等。在Python的sklearn库中,可以使用KMeans API进行聚类操作。
|
机器学习/深度学习 分布式计算 算法
在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)
【6月更文挑战第28天】在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)、数据规模与特性(大数据可能适合分布式算法或深度学习)、性能需求(准确性、速度、可解释性)、资源限制(计算与内存)、领域知识应用以及实验验证(交叉验证、模型比较)。迭代过程包括数据探索、模型构建、评估和优化,结合业务需求进行决策。
299 0
|
机器学习/深度学习 算法 数据可视化
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
662 0