[英]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(或节点)的平均值和标准差。 如果标准偏差大于某个阈值,则将节点分成两半。 继续此过程,直到完成所有强度,您将获得更有效的直方图。
当然可以使用其他细节来改进此方法:
当然,如果你已经应用了上述所有“改进”,那么你基本上实现了k-means聚类算法的一种变体;-)
注意:我不同意上面的评论 - 您描述的问题似乎与直方图均衡没有密切相关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.