K-means 可以用来帮助基于像素值的图像分离吗?
Posted
技术标签:
【中文标题】K-means 可以用来帮助基于像素值的图像分离吗?【英文标题】:Can K-means be used to help in pixel-value based separation of an image? 【发布时间】:2011-07-21 19:00:59 【问题描述】:我正在尝试根据像素值分离灰度图像:假设一个 bin 中的像素从 0 到 60,另一个 bin 中的像素为 60-120,另一个中的像素为 120-180 ...,依此类推,直到 255。范围大致是在这种情况下是等距的。 但是,通过使用 K-means 聚类,是否有可能更实际地测量我的像素值范围应该是什么?试图一起获得相似的像素,而不是在像素浓度较低的地方浪费垃圾箱。
编辑(包括获得的结果):
k-means with no of cluster = 5
【问题讨论】:
这听起来很像直方图均衡...fourier.eng.hmc.edu/e161/lectures/contrast_transform/node3.html 正如@Throwback1986 所说,它并不是那么相似。我不是试图均衡直方图,而是最有效地分割直方图。 【参考方案1】:当然,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(即按亮度升序找到集群)
【讨论】:
感谢您的详细解释,了解了基本概念。不过,我将使用 OpenCV 和 VC++ 来做这件事——知道这有多简单吗? @Aruni 我真的不知道,抱歉。请注意,我在一维色彩空间中进行了聚类,而不是在图像空间中。这意味着检测对象没有用,但会压缩和简化图像很多。如果您需要进行空间聚类,也许均值偏移也是一个不错的选择。 大声笑我刚刚在 OpenCV 中运行它。在了解文档和雅虎讨论组之后。工作正常。无论如何,谢谢。 @belisarius 已更新。有进一步的问题 - 比如为什么黑暗区域聚集成浅色调。但我猜这完全是另一个问题。 @Aruni 我很确定你走在正确的道路上,只有一个小小的误解会阻止你完成任务。您的图像的问题是您使用诸如“簇编号”之类的东西来表示灰度,而您应该使用诸如簇中像素的平均值之类的东西。等等……看来你也忘了在聚类之前转换成灰度! HTH!【参考方案2】:k-means 可以应用于您的问题。如果是我,我会首先尝试从决策树中借鉴的基本方法(尽管“更简单”取决于您的精确聚类算法!)
假设存在一个 bin,开始将像素强度填充到 bin 中。当箱“足够满”时,计算箱(或节点)的均值和标准差。如果标准偏差大于某个阈值,则将节点分成两半。继续此过程,直到完成所有强度,您将获得更有效的直方图。
这个方法当然可以通过额外的细节来改进:
-
您可以考虑使用峰度作为分割标准。
偏度可用于确定分裂发生的位置
您可能会一直跨入决策树领域并借用 Jini 索引来指导拆分(一些拆分技术依赖于更“奇异”的统计数据,例如 t 检验)。
最后,您可以执行最后的合并过程以折叠任何稀疏的节点。
当然,如果您已经应用了上述所有“改进”,那么您基本上已经实现了 k-means 聚类算法的一种变体;-)
注意:我不同意上面的评论 - 你描述的问题似乎与直方图均衡化没有密切关系。
【讨论】:
真的,它不是直方图均衡化——它在 OpenCV 中有一个单行函数调用(当实际项目是从真正模糊的街景中提取文本时,我不会重新发明***)。以上是关于K-means 可以用来帮助基于像素值的图像分离吗?的主要内容,如果未能解决你的问题,请参考以下文章