0

我知道有这样的问题和一些解决方案,但我希望有另一种方法。颜色分割:一个更好的聚类分析,找到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。但是在更多颜色密集的图像上,该算法会失去一些颜色。

回答

0

衡量你的瓶颈!

轮廓在O(n²)中,所以很有可能它会成为您的方法的瓶颈。此外,k-means变体比sklearn中的变体速度快得多......所以有很多潜力让事情变得更快。

Minibatch kmeans甚至不会收敛,但只是近似结果。只要我不能将所有数据保存在内存中,只要我能说清楚就可以了。

将调色板减少到只有16种颜色,根本没有任何帮助。