K-means可以用来帮助基于像素值的图像分离吗?

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(即群集以升序亮度顺序找到)