当然,K-Means 可以用于颜色量化。这非常方便。
我们看Mathematica中的一个例子:
我们从灰度 (150x150) 图像开始:
让我们看看用8位表示图像时有多少灰度:
ac = ImageData[ImageTake[i, All, All], "Byte"];
First@Dimensions@Tally@Flatten@ac
-> 234
好的。让我们减少这 234 个级别。我们的第一个尝试是让算法单独确定默认配置下有多少集群:
ic = ClusteringComponents[Image@ac];
First@Dimensions@Tally@Flatten@ic
-> 3
它选择了3个簇,对应的图像是:
现在,是否可以,或者您需要更多集群,由您决定。
假设您决定需要更细粒度的分色。让我们要求 6 个集群而不是 3 个:
ic2 = ClusteringComponents[Image@ac, 6];
Image@ic2 // ImageAdjust
结果:
这里是每个 bin 中使用的像素范围:
Table[{Min@#, Max@#} &@(Take[orig, {#[[1]]}, {#[[2]]}] & /@
Position[clus, n]), {n, 1, 6}]
-> {{0, 11}, {12, 30}, {31, 52}, {53, 85}, {86, 134}, {135, 241}}
以及每个bin中的像素数:
Table[Count[Flatten@clus, i], {i, 6}]
-> {8906, 4400, 4261, 2850, 1363, 720}
所以,答案是肯定的,而且很简单。
编辑
也许这将帮助您了解您在新示例中做错了什么。
如果我对你的彩色图像进行聚类,并使用聚类数来表示亮度,我得到:
这是因为星团没有按亮度升序编号。
但是如果我计算每个簇的平均亮度值,并用它来表示簇值,我得到:
在我之前的示例中,这不是必需的,但这只是运气:D(即按亮度升序找到集群)