我知道有這樣的問題和一些解決方案,但我希望有另一種方法。顏色分割:一個更好的聚類分析,找到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。但是在更多顏色密集的圖像上,該算法會失去一些顏色。