Aru*_*iRC 8 algorithm opencv image image-processing k-means
我正在尝试基于像素值分离greylevel图像:假设一个bin中的0到60的像素,另一个bin中的60-120,120-180 ......等等到255.范围大致等于此案件.但是,通过使用K-means聚类,可以更准确地衡量我的像素值范围应该是多少?试图获得相似的像素,而不是浪费在存在较低像素浓度的区域.
编辑(包括获得的结果):

k-表示没有簇= 5
Dr.*_*ius 10
当然,K-Means可用于颜色量化.它非常方便.
让我们看看Mathematica中的一个例子:
我们从灰度(150x150)图像开始:

让我们看看用8位表示图像时有多少灰度级:
ac = ImageData[ImageTake[i, All, All], "Byte"];
First@Dimensions@Tally@Flatten@ac
-> 234
Run Code Online (Sandbox Code Playgroud)
好.让我们减少234个等级.我们的第一个尝试是让算法单独确定默认配置中有多少个集群:
ic = ClusteringComponents[Image@ac];
First@Dimensions@Tally@Flatten@ic
-> 3
Run Code Online (Sandbox Code Playgroud)
它选择3个簇,相应的图像是:

现在,如果可以,或者您需要更多集群,那么由您决定.
假设您认为需要更精细的颜色分离.我们要求6个集群而不是3个集群:
ic2 = ClusteringComponents[Image@ac, 6];
Image@ic2 // ImageAdjust
Run Code Online (Sandbox Code Playgroud)
结果:

以下是每个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}}
Run Code Online (Sandbox Code Playgroud)
和每个bin中的像素数:
Table[Count[Flatten@clus, i], {i, 6}]
-> {8906, 4400, 4261, 2850, 1363, 720}
Run Code Online (Sandbox Code Playgroud)
所以,答案是肯定的,而且很简单.
编辑
也许这会帮助你理解你在新例子中做错了什么.
如果我将您的彩色图像聚类,并使用簇编号来表示亮度,我得到:
这是因为群集没有以递增的亮度顺序编号.
但是如果我计算每个集群的平均亮度值,并用它来表示集群值,我会得到:

在我之前的例子中,这不是必需的,但那只是运气:D(即群集以升序亮度顺序找到)