我知道有这样的问题和一些解决方案,但我希望有另一种方法。颜色分割:一个更好的聚类分析,找到K
目标:最终目标是聚集给定图像的颜色,然后允许用户更改这些颜色。用户不需要输入任何k。该算法确定K。
方法:目前,我正在使用侧影评分指标(http://scikit-learn.sourceforge.net/dev/modules/generated/sklearn.metrics.silhouette_score.html#sklearn.metrics.silhouette_score)。我使用MiniBatchKMeans对图像进行聚类,然后计算k(4-8)范围内的silhouette_score。该代码将是:
# silhouetteCoeff determination
def silhouetteCoeff(z):
max_silhouette = 0
max_k = 0
for i in range(4, 17):
clt = MiniBatchKMeans(n_clusters = i, random_state = 42)
clt.fit(z)
silhouette_avg = silhouette_score(z, clt.labels_, sample_size = 250, random_state = 42)
print("k: ", i, " silhouette avg: ", silhouette_avg)
if (silhouette_avg == 1.0):
max_k = i
break
elif (silhouette_avg > max_silhouette):
max_silhouette = silhouette_avg
max_k = i
print("Max silhouette: ", max_silhouette)
print("Max k: ", max_k)
return int(max_k)
即使我的色彩量化图像事先(16种颜色),功能仍需要一个良好的6-8秒运行(假设图像大小400×400)。
我的问题是,有没有更好或更快的找到k的方法?我也试过弯头法,但还是得计算一下SSE。从对某些图像的测试中,我发现了一个很好的平均值k = 8。但是在更多颜色密集的图像上,该算法会失去一些颜色。