繁体   English   中英

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

[英]Can K-means be used to help in pixel-value based separation of an image?

我正在尝试根据像素值分离greylevel图像:假设一个bin中的0到60的像素,另一个bin中的60-120,120-180 ......等等到255.范围大致等于此案件。 但是,通过使用K-means聚类,可以更准确地衡量我的像素值范围应该是多少? 试图获得相似的像素,而不是浪费在存在较低像素浓度的区域。

编辑(包括获得的结果): 在此输入图像描述在此输入图像描述

k-表示没有簇= 5

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

k-means可以应用于您的问题。 如果是我,我会首先尝试从决策树借来的基本方法(虽然“更简单”取决于你的精确聚类算法!)

假设存在一个箱,开始将像素强度填充到箱中。 当bin“足够”时,计算bin(或节点)的平均值和标准差。 如果标准偏差大于某个阈值,则将节点分成两半。 继续此过程,直到完成所有强度,您将获得更有效的直方图。

当然可以使用其他细节来改进此方法:

  1. 您可以考虑使用峰度作为分裂标准。
  2. 可以使用偏斜来确定分裂发生的位置
  3. 您可能会一直跨越决策树并借用Jini指数来指导拆分(某些拆分技术依赖于更多“异国情调”统计数据,如t检验)。
  4. 最后,您可以执行最终合并传递以折叠任何稀疏填充的节点。

当然,如果你已经应用了上述所有“改进”,那么你基本上实现了k-means聚类算法的一种变体;-)

注意:我不同意上面的评论 - 您描述的问题似乎与直方图均衡没有密切相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM