如何使用 KMeans 在 RED、GREEN 和 BLUE 通道上进行主色提取的聚类

Posted

技术标签:

【中文标题】如何使用 KMeans 在 RED、GREEN 和 BLUE 通道上进行主色提取的聚类【英文标题】:How does clustering happen over RED,GREEN AND BLUE Channels for dominant color extraction using KMeans 【发布时间】:2020-10-17 20:26:51 【问题描述】:

我有一个尺寸为 (500,500,3) 的 rgb 图像。我试图从中提取假设 k 主色(为了理解让我们假设 k 为 4)。我已将图像重新整形为 (500*500,3) 以将其传递给 sklearn kmeans 分类器。

分类器是否分别在红绿蓝通道上进行聚类? 如果确实如此—— 假设集群是在强度上形成的 40,80,90,135 为红色 60,90,130,240 为绿色 蓝色为 20,40,60,90。

分类器如何决定将一种颜色的哪个聚类中心映射到另一种颜色的哪个聚类中心?

【问题讨论】:

3D 空间中的聚类 【参考方案1】:

按照以下过程进行聚类:

假设 k = 3。在图像中选择 3 种不同的随机颜色。 计算这些点与所有像素之间的差异。 RGB图像的差异是((R - R') + (G - G') + (B - B')) / 3。 根据发现的差异为每个像素分配一个标签。这意味着,每个像素都被分配到其差异最小的集群中。 现在,我们已经标记了所有像素。计算每个簇的平均值并重复该过程,直到没有变化。这意味着在每一步中,找到聚类均值之间所有像素的差值,并根据最小距离分配新的标签并计算新的平均值。

因此,聚类并不是单独在 RGB 通道上进行的,而是差异函数在这里起关键作用。

【讨论】:

以上是关于如何使用 KMeans 在 RED、GREEN 和 BLUE 通道上进行主色提取的聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 STRING_AGG() 以升序分隔字符串逗号

Sass:RGB颜色函数-Red()Green()Blue()函数

函数RGB(255,0,0)表示的是啥色

理解 Roslyn 中的红绿树(Red-Green Trees)

MySQL按重复排序在前

颜色Color.alpha()/Color.red()/Color.green()/Color.blue()/Color.argb() setPixel()/getPixel()