利用 K-Means 聚类进行色彩量化

简介: K-Means 聚类算法的目标是将 n 个样本划分(聚类)为 K 个簇,该算法通过找到簇的中心并将输入样本分组到簇周围。在本文中,利用 K-Means 聚类进行色彩量化,以减少图像中颜色数量。

前言

K-Means 聚类算法的目标是将 n 个样本划分(聚类)为 K 个簇,我们可以利用 OpenCV 提供的 cv2.kmeans() 函数实现 K-Means 聚类算法,该算法通过找到簇的中心并将输入样本分组到簇周围。在本文中,我们将学习如何利用 K-Means 聚类进行色彩量化,以减少图像中颜色数量。

利用 K-Means 聚类进行色彩量化

色彩量化问题可以定义为减少图像中颜色数量的过程。色彩量化对于某些设备显示图像非常关键,这些设备可能由于内存限制等原因只能显示有限颜色,因此,在这些设备上显示色彩通常需要在准确性和减少颜色数量之间进行权衡,在利用 K-Means 聚类进行色彩量化时,权衡两者是通过正确设置 K 参数来进行的。

利用 K-Means 聚类算法来执行色彩量化,簇中心数据由 3 个特征组成,它们对应于图像每个像素的 B、G 和 R 值。因此,关键是将图像转换为数据:

data=np.float32(image).reshape((-1, 3))

为了观察如何权衡准确性和颜色数,我们使用不同 K 值 (3 、 5 、 10 、 20 和 40) 执行聚类过程,以查看生成的图像如何变化,如果我们想要只有 3 种颜色 (K = 3) 的结果图像,需要执行以下操作:

1. 加载 BGR 图像:

img=cv2.imread('example.jpg')

2. 使用 color_quantization() 函数执行色彩量化:

defcolor_quantization(image, k):
# 将图像转换为数据data=np.float32(image).reshape((-1, 3))
# 算法终止条件criteria= (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
# K-Means 聚类ret, label, center=cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# 簇中心center=np.uint8(center)
# 将具有 k 颜色中心的图像转换为 uint8result=center[label.flatten()]
result=result.reshape(img.shape)
returnresultcolor_3=color_quantization(img, 3)

color_quantization() 函数中,关键点是利用 cv2.kmeans() 方法。最后,可以用 k 种颜色来构建图像,用它们对应的中心值替换每个像素值,程序的运行结果如下所示:

绘图163.png

绘图162.png

显示色彩量化后的色彩分布

可以扩展以上程序使其显示色彩量化后的色彩分布,该色彩分布显示了分配给每个聚类中心的像素数。只需扩展 color_quantization() 函数已被修改为包含所需功能:

importcollectionsdefcolor_quantization(image, k):
# 将图像转换为数据data=np.float32(image).reshape((-1, 3))
# 算法终止条件criteria= (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
# K-Means 聚类ret, label, center=cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# 簇中心center=np.uint8(center)
# 将具有 k 颜色中心的图像转换为 uint8result=center[label.flatten()]
result=result.reshape(img.shape)
# 统计分配给每个聚类中心的像素数counter=collections.Counter(label.flatten())
print(counter)
# 计算输入图像的总像素数total=img.shape[0] *img.shape[1]
# 为色彩分布图像指定宽度和高度:desired_width=img.shape[1]
desired_height=70desired_height_colors=50# 初始化色彩分布图像color_distribution=np.ones((desired_height, desired_width, 3), dtype='uint8') *255start=0forkey, valueincounter.items():
# 归一化value_normalized=value/total*desired_widthend=start+value_normalized# 绘制与当前颜色对应的矩形cv2.rectangle(color_distribution, (int(start), 0), (int(end), desired_height_colors), center[key].tolist(), -1)
start=endreturnnp.vstack((color_distribution, result))

上述代码中,使用 collections.Counter() 来统计分配给每个聚类中心的像素数:

counter=collections.Counter(label.flatten())

例如,如果 K = 10,则可以得到如下结果:

Counter({7: 37199, 3: 36302, 0: 29299, 5: 23987, 6: 23895, 1: 20077, 9: 19814, 8: 18427, 4: 16221, 2: 14779})

构建色彩分布图像后,将其与色彩量化后的图像连接在一起:

np.vstack((color_distribution, result))

程序的输出如下所示:

绘图164.png

从上图可以看出,使用 K-Means 聚类算法应用色彩量化后改变参数 k (10、20、30、40、50、60 和 70) 的结果,k 值越大产生的图像越逼真。

相关文章
|
算法 数据挖掘 计算机视觉
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
1802 0
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
862 0
|
机器学习/深度学习 资源调度 监控
深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。
深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。
|
7月前
|
数据采集 JSON 自然语言处理
Python爬取淘宝评论:从数据采集到情感分析的全流程指南
淘宝评论是用户对商品的真实反馈,包含产品优缺点、使用体验、满意度等关键信息。通过Python爬取并分析评论,可帮助商家优化产品、制定营销策略,或为消费者提供决策参考。本文将介绍如何用Python高效获取淘宝评论,并进行基础的情感分析。
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1893 6
|
机器学习/深度学习 自然语言处理 物联网
从零开始的DeepSeek微调训练实战(SFT)
本文重点介绍使用微调框架unsloth,围绕DeepSeek R1 Distill 7B模型进行高效微调,并介绍用于推理大模型高效微调的COT数据集的创建和使用方法,并在一个medical-o1-reasoning-SFT数据集上完成高效微调实战,并最终达到问答风格优化&知识灌注目的。
从零开始的DeepSeek微调训练实战(SFT)
|
12月前
|
机器学习/深度学习 资源调度 计算机视觉
I-ViT: 用于高效视觉Transformer推理的纯整数量化——论文阅读
I-ViT是首个专为视觉Transformer设计的纯整数量化方案,通过Shiftmax、ShiftGELU和I-LayerNorm实现全整数推理,避免浮点运算。在保持模型精度的同时,显著提升推理效率,实现3.7倍以上加速,推动ViT在边缘设备的高效部署。
977 9
I-ViT: 用于高效视觉Transformer推理的纯整数量化——论文阅读
|
机器学习/深度学习 数据可视化 算法
【2023美赛】C题Wordle预测27页中文论文及Python代码详解
本文提供了2023年美赛C题Wordle预测的27页中文论文及Python代码的详细解读,涵盖了时间序列预测、特征工程、模型选择与评估、聚类分析等多个方面,并提供了相关数据和代码的下载方式。
889 3
|
前端开发 C# Windows
WPF基础:在Canvas上绘制图形
WPF基础:在Canvas上绘制图形
715 0
|
物联网 5G 数据中心