当然K-Means可以用于颜色量化。这非常方便。
让我们看一个例子数学 http://www.wolfram.com/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
Result:
以下是每个 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}
所以,答案是肯定的,而且很简单。
Edit
也许这将帮助您理解在新示例中做错了什么。
如果我对彩色图像进行聚类,并使用聚类数来表示亮度,我会得到:
这是因为簇没有按亮度升序编号。
但是,如果我计算每个簇的平均亮度值,并用它来表示簇值,我得到:
在我之前的示例中,这不是必需的,但这只是运气:D(即按亮度升序找到簇)