私はK平均クラスタリングを使用していくつかの画像の3つの支配的な色を見つけようとしています。私が直面している問題は、K-meansが画像の背景もクラスタリングするということです。私はPython 2.7とOpenCV 3を使用していますK平均色クラスタリングを意味する - マスクされたnumpy配列を持つ背景ピクセルを省略する
すべての画像は、次のRGBカラーの同じ灰色の背景を持っています:150,150,150。 K平均が背景色をクラスタリングするのを避けるために、元の画像配列からすべての '150'ピクセル値をマスクするマスク付き配列を作成しました。理論的には、K-Meansが動作するための非背景ピクセルのみを配列に残します。しかし、私がスクリプトを実行すると、それでも灰色が支配的な色の1つとして返されます。
私の質問:マスクされた配列はどうやって行くのですか(何か間違っていましたか)、あるいは何らかの理由でK-meansクラスタリングからピクセルを除外する方が良いでしょうか?
以下の私のコードを見つけてください:
from sklearn.cluster import KMeans
from sklearn import metrics
import cv2
import numpy as np
def centroid_histogram(clt):
numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
(hist, _) = np.histogram(clt.labels_, bins=numLabels)
hist = hist.astype("float")
hist /= hist.sum()
return hist
image = cv2.imread("test1.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
h, w, _ = image.shape
w_new = int(100 * w/max(w, h))
h_new = int(100 * h/max(w, h))
image = cv2.resize(image, (w_new, h_new))
image_array = image.reshape((image.shape[0] * image.shape[1], 3))
image_array = np.ma.masked_values(image_array,150)
clt = KMeans(n_clusters=3)
clt.fit(image_array)
hist = centroid_histogram(clt)
zipped = zip(hist, clt.cluster_centers_)
zipped.sort(reverse=True, key=lambda x: x[0])
hist, clt.cluster_centers = zip(*zipped)
print(clt.cluster_centers_)
これは、カラークラスタリングのためのkmeansへの入力としてうまく動作します。空間情報(ピクセル位置)は使用されないので、インデックス付けによって生成されたピクセルのリストは良好である。 – welch
ありがとう@welch、わからなかった – Soltius