2017-01-30 8 views
0

私は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_) 

答えて

1

を、あなたの背景以外の画素の値を抽出したい場合は、あなたがnumpyの物価スライドを使用することができます。

img2=image_array[image_array!=[150,150,150]] 
img2=img2.reshape((len(img2)/3,3)) 

これは、のリストを得られますピクセルは[150,150,150]ではありません。
しかし、画像の構造は保持されません。ちょうどピクセルのリストを与えます。私は本当に覚えていませんが、Kの場合、画像全体を与える必要がある、つまりピクセルの位置にフィードする必要があることを意味します。しかし、その場合、マスキングは、特定のピクセルの値を別のピクセルに置き換えるだけであり、ピクセルをすべて一緒に取り除くわけではないので、これまでに役立つことはありません。

+0

これは、カラークラスタリングのためのkmeansへの入力としてうまく動作します。空間情報(ピクセル位置)は使用されないので、インデックス付けによって生成されたピクセルのリストは良好である。 – welch

+0

ありがとう@welch、わからなかった – Soltius

関連する問題