【实战】K-Means聚类进行颜色量化:实用图片压缩、分割技巧【附完整源码】
【实战】K-Means聚类进行颜色量化:实用图片压缩、分割技巧【附完整源码】
《------往期经典推荐------》
一、AI应用软件开发实战专栏【链接】
项目名称 项目名称
1.【人脸识别与管理系统开发】 2.【车牌识别与自动收费管理系统开发】
3.【手势识别系统开发】 4.【人脸面部活体检测系统开发】
5.【图片风格快速迁移软件开发】 6.【人脸表表情识别系统开发】
7.【YOLOv8多目标识别与自动标注软件开发】 8.【基于YOLOv8深度学习的行人跌倒检测系统】
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】 10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】
11.【基于YOLOv8深度学习的安全帽目标检测系统】 12.【基于YOLOv8深度学习的120种犬类检测与识别系统】
13.【基于YOLOv8深度学习的路面坑洞检测系统】 14.【基于YOLOv8深度学习的火焰烟雾检测系统】
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】 16.【基于YOLOv8深度学习的舰船目标分类检测系统】
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】 18.【基于YOLOv8深度学习的血细胞检测与计数系统】
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】 20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】 22.【基于YOLOv8深度学习的路面标志线检测与识别系统】
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】 24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】 26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】
27.【基于YOLOv8深度学习的人脸面部表情识别系统】 28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】
29.【基于YOLOv8深度学习的智能肺炎诊断系统】 30.【基于YOLOv8深度学习的葡萄簇目标检测系统】
31.【基于YOLOv8深度学习的100种中草药智能识别系统】 32.【基于YOLOv8深度学习的102种花卉智能识别系统】
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】 34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】 36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】 38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】 40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】 42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】 44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】 46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】 48.【基于深度学习的车辆检测追踪与流量计数系统】
49.【基于深度学习的行人检测追踪与双向流量计数系统】 50.【基于深度学习的反光衣检测与预警系统】
51.【基于深度学习的危险区域人员闯入检测与报警系统】 52.【基于深度学习的高密度人脸智能检测与统计系统】
53.【基于深度学习的CT扫描图像肾结石智能检测系统】 54.【基于深度学习的水果智能检测系统】
55.【基于深度学习的水果质量好坏智能检测系统】 56.【基于深度学习的蔬菜目标检测与识别系统】
57.【基于深度学习的非机动车驾驶员头盔检测系统】 58.【太基于深度学习的阳能电池板检测与分析系统】
59.【基于深度学习的工业螺栓螺母检测】 60.【基于深度学习的金属焊缝缺陷检测系统】
61.【基于深度学习的链条缺陷检测与识别系统】 62.【基于深度学习的交通信号灯检测识别】
63.【基于深度学习的草莓成熟度检测与识别系统】 64.【基于深度学习的水下海生物检测识别系统】
65.【基于深度学习的道路交通事故检测识别系统】 66.【基于深度学习的安检X光危险品检测与识别系统】
67.【基于深度学习的农作物类别检测与识别系统】 68.【基于深度学习的危险驾驶行为检测识别系统】
69.【基于深度学习的维修工具检测识别系统】 70.【基于深度学习的维修工具检测识别系统】
71.【基于深度学习的建筑墙面损伤检测系统】 72.【基于深度学习的煤矿传送带异物检测系统】
73.【基于深度学习的老鼠智能检测系统】
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
- 引言
- 什么是K-Means聚类?
- 为什么使用K-Means进行颜色量化?
- 彩色量化的分步实现
- 1.加载和准备图片
- 2.转换图像数据
- 3.定义K-Means聚类标准
- 4.应用K-Means聚类
- 5.重建量化图像
- 6.量化图像的保存与恢复
- 观察不同K值的结果
- 结论
- 颜色量化的完整Python代码
引言
颜色量化是图像处理中的一项基本技术,旨在减少图像中不同颜色的数量。这个过程对于在色彩容量有限的设备上有效显示图像至关重要,对于艺术效果、数据压缩等也很有用。最流行的颜色量化方法之一是k-means聚类。
在这篇博客中,我们将探讨如何使用k-means聚类算法来实现颜色量化。我们将深入研究使用OpenCV的Python实现,解释分步过程,并检查结果。
下图是聚类后分别使用2、4、16个像素点的值进行图像展示的示例,可以看到使用少量的像素点值即可比较好的表达一张图片。主要适用场景是图片的压缩或者同类颜色区域分割。
什么是K-Means聚类?
K-means聚类是一种简单而强大的无监督机器学习算法。它将数据集划分为
K
个聚类,每个聚类包含的数据点彼此之间比其他聚类中的数据点更相似。在颜色量化的上下文中,数据集由图像中的像素颜色组成,每个聚类表示一组相似的颜色。
为什么使用K-Means进行颜色量化?
K-means聚类对于颜色量化是有效的,因为它将相似的颜色分组在一起,减少图像中唯一颜色的数量,同时保持其整体视觉外观。通过调整参数
K
,它定义了量化图像中聚类(或颜色)的数量,我们可以控制颜色保真度和减少之间的平衡。
彩色量化的分步实现
让我们一步一步地通过使用k-means聚类进行颜色量化的过程。
1.加载和准备图片
第一步是使用OpenCV加载图像,并将其转换为适合聚类的格式。
import cv2
import numpy as np
# Load the image
img = cv2.imread('image.jpg')
2.转换图像数据
我们需要将图像表示为用于k-means算法的一组数据点。图像中的每个像素都被视为三维空间中的一个点,其蓝色(B)、绿色(G)和红色(R)值表示坐标。
data = np.float32(img).reshape((-1, 3))
- np.float32(img)
:将图像数据转换为
float 32
,一种适合数学运算的格式。 - .reshape((-1,3))
:将图像展平为2D阵列,其中每行表示一个像素,每列表示B、G和R颜色通道。
3.定义K-Means聚类标准
我们定义了k-means算法的终止条件,它决定了算法何时应该停止迭代。标准是根据达到一定的精度或最大迭代次数来设置的。
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
- cv2.TERM_CRITERIA_EPS
:当达到规定的准确度
(
)时,算法停止。 - cv2.TERM_CRITERIA_MAX_ITER
:当达到最大迭代次数时,算法停止。 - 20
:允许的最大迭代次数。 - 1.0
:所需的精度。如果迭代之间聚类中心的变化小于或等于1.0,则算法将提前停止。
4.应用K-Means聚类
现在,我们将k-means聚类算法应用于图像数据。
ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
- data
:整形后的图像数据。 - k
:量化图像中我们想要的聚类(颜色)数量。 - 无
:不提供初始标签;算法将随机选择它们。 - criteria
:前面定义的终止条件。 - 10
:使用不同初始聚类中心执行算法的次数。将选择最佳结果(具有最低紧凑性)。 - cv2.KMEANS_RANDOM_CENTERS
:此标志表示初始聚类中心应随机选择。
5.重建量化图像
应用k-means聚类后,
center
数组包含聚类中心(代表性颜色),
label
包含每个像素的聚类分配。我们使用这些来重建量化的图像。
# Convert the cluster centers to uint8 format
center = np.uint8(center)
# Replace pixel values with their corresponding cluster center value
result = center[label.flatten()]
result = result.reshape(img.shape)
- np.uint8(center)
:将聚类中心从
float32格式
转换为
uint8
格式,这是图像数据所需的。 - flatten()
:将标签数组展平为一维数组,使其更容易索引。 - center[label.flatten()]
:使用扁平化的标签数组创建一个新数组(
结果
),其中每个像素都被其聚类中心的颜色替换。 - result.reshape(img.shape)
:将1D数组重新整形为原始图像尺寸,以生成量化图像。
6.量化图像的保存与恢复
最后,我们将量化的图像保存到一个文件中,并显示原始图像和量化的图像进行比较。
# Save the quantized image
cv2.imwrite('quantized.png', result)
- cv2.imwrite('3.png',result)
:将量化后的图像重定向到名为
3.png
的文件中。 - cv2.imshow()
:在单独的窗口中显示图像。 - cv2.waitKey(0)
:无限期等待,直到按下某个键。 - cv2.destroyAllWindows()
:关闭所有OpenCV窗口。
观察不同K值的结果
要了解不同
K
值的影响,您可以使用各种值进行试验(例如,
K = 3,5,10,20,40
),并观察所得图像的不同之处:
- 低K值(例如,K = 3或5):图像将具有更少的颜色,从而产生更抽象和简化的外观。这对于艺术效果或当期望极简主义表示时是有用的。
- 高K值(例如,K = 20或40):图像保留了更多的原始颜色细节,与原始图像非常相似。当您想要减少颜色同时保留更多细节时,这很有用。
结论
使用k-means聚类的颜色量化是一种功能强大的技术,可以减少图像中的颜色数量,同时保持其整体外观。通过调整
K
参数,可以控制色彩保真度和还原度之间的平衡,使其适用于图像压缩、显示优化和艺术效果等各种应用。
大家随意尝试不同的图像和
K
值,探索色彩量化的创造性可能性!
颜色量化的完整Python代码
下面是完整的代码片段,以供参考:
import cv2
import numpy as np
# Load the image
img = cv2.imread('landscape_1.jpg')
# Define the color quantization function
def color_quantization(image, k):
"""Performs color quantization using K-means clustering algorithm."""
# Transform image into 'data'
data = np.float32(image).reshape((-1, 3))
# Define the algorithm termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
# Apply K-means clustering
ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
# Convert center to uint8
center = np.uint8(center)
# Replace pixel values with their center value
result = center[label.flatten()]
result = result.reshape(image.shape)
return result
# Perform color quantization with K = 3
color_3 = color_quantization(img, 3)
# Save the quantized image
cv2.imwrite('quantized.png', color_3)
通过遵循这些步骤并使用提供的代码,您将能够对自己的图像应用颜色量化,并创建视觉上有趣的结果。编码愉快!
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!