持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
平时我们使用手机最多的一个功能之一就是拍照吧,而我们如果要拍下一张好看的图片,自然是少不了对各种色彩的呈现。因此一张图片能够显示图片色彩越多,最后呈现的结果也就会越好看。
我们可以是试着使用之前学习的K-Means来进行图像的分割,他能做的其实很简单,就是将相同的颜色都分配到同一个中心点(分割区域)。
from matplotlib.image import imread
# 首先需要imread导入图片
image = imread(os.path.join(images_path, image_name))
image.shape
# 输出 (531, 800, 3)
解释一下上面的输出:
- 第一个
531表示图片高度 - 第二个
800表示图片宽度 - 第三个
3表示颜色通道的数量
imread这边输出的是每个实例像素点组成的三维数组,数据就是上面讲到的,但是我们想要需要分割颜色。因此我们只需要其中的颜色部分,也就是一个包含了实例像素点的RGB信息的二维数组,每一行就是一个点的颜色信息,如:
[[0.94417286 0.94573116 0.9537585 ]
[0.94417286 0.94573116 0.9537585 ]
[0.94417286 0.94573116 0.9537585 ]
...
[0.09720129 0.2657329 0.03306919]
[0.09720129 0.2657329 0.03306919]
[0.09720129 0.2657329 0.03306919]]
嗯哼,这样的数据集看上去就很熟悉了,我们就只需要把这个变形后的数据集代入到K-Means的算法中就可以。
X = image.reshape(-1, 3)首先转型,把原来的三维数据,改成包含RGB的3列信息的二维数据集。kmeans = KMeans(n_clusters=n_clusters, random_state=42).fit(X)接下来就是不断地执行不同的n_clusters(也就是分割了多少个颜色)的算法。segmented_img = kmeans.cluster_centers_[kmeans.labels_].reshape(image.shape)如果要可视化训练出来的图像,只需要重新转型回图像格式
这边展示不同颜色分割后的图像样子:
图1 各种数量的颜色图像分割(图片来自网络,如有侵权联系本人删除!)
我们会发现使用聚类的算法分割图像后有以下变化:
- 如果颜色相近的,且颜色分类比较少时,就会被分割到同一个类中,这样返回的图像在细节的显示上明显是不如原始图像那么细致。
- 随着颜色数量的减少,如果颜色比较少的,会越早被同类称别的颜色中,如画上的瓢虫,在只有4色是就被分到别的颜色中。