2017-04-03 15 views
3

K平均法または他のアルゴリズムを使用して画像をクラスタリングしたい(提案が必要)。Python-画像クラスタリングにおけるクラスタリング

問題はこのようなものです。イメージを3つのクラスタ(自然、日没、水)にクラスタリングしたいと考えています。 os.listdir()を使用してすべてのイメージをロードし、すべてのイメージを配列(RGB)に変換し、ID、Image_array、Labelの3つの列を含むデータフレームを作成しました。今

、私はn_clusters = 3を設けるK手段クラスタリングを使用する場合は、このエラーを示しています。今

from sklearn.cluster import KMeans kmeans = KMeans(n_clusters = 3).fit(img_array) ERROR = Found array with dim 4. Estimator expected <= 2.

を、私はこのクラスタリング問題でお願いします。あなたは、画像ごとに3D配列とそれを提供し、一方、私はあなたが言っただけでなく、この

img_array = [] 

path = "C://Users/shivam/Desktop/freelancer/p22/data/green_nature/" 
for f in os.listdir('.'): 
    if f.endswith('.jpg'): 
     img = Image.open(f) 
     data = np.asarray(img, dtype='uint8') 
     img_array.append(data) 


df = pd.DataFrame({'image_arrays':img_array}) 
df['id'] = range(1, len(df) + 1) 

答えて

0

のようなルックスを作成したデータフレームは、K-手段は、入力ごとにベクトルをしたいと思います。このような問題(いくつかの創造性を必要とします)を解決する最も簡単な方法は、あなたが持っているクラスを否定する一連の機能を考案することです。

この場合、自然(ロットのo 'グリーン)、水(ロットのo'ブルー)、および日没(ロットのo '/黄/ピンクの多分?)の間で分類したいので、青と赤の値。選択したフィーチャが差別的であるかどうかを確認するには、ヒストグラムをプロットします。

あなたの4D(画像x幅x高さx色)の配列から2D(画像x平均色)の配列に変更します。あなたは、np.meanを色、高さ、幅のdiminsionsにする必要があります。最後に、(画像×3(色))の配列が必要です。

+0

はい、私はこだわっていますinteresting.Butようだ、あなたはその中で私を助けることができます。 ヒストグラムを取得する方法(私も実際にそれを取得しようとしました)。今、3次元配列の代わりに平均値を取得しようとしています。あなたがもっと助けてください、それは非常に役に立つでしょう。 –

+0

私はこの3次元配列を2次元配列に変換することを考えています。平均と標準偏差があります。これはK平均を実行してもOKですが、この配列はRGB配列です。私はそれをどうするのか? –

+0

np.mean(image_arrays、axis = 2)? https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html – TheLaurens

0

これは、2次元が予想されているときに4次元配列を渡すために発生します。 'img_array.shape'はこのようにする必要があります(n_samples、n_features)。 特徴抽出アルゴリズムを使用する必要があります。

これはscikit-imageモジュールで行うことができます。 イメージをグレースケール形式に変換する必要があります。 コード:

import skimage.feature as feature 
img_converted = [] 
for i in range(len(img_array)): 
    img_converted.append(feature.hog(img_array[i])) 
model.fit(np.array(img_converted)) 

ドキュメント:http://scikit-image.org/docs/dev/api/skimage.feature.html#hog

+0

私はあなたのコードを教えてください。 この時点で、私はどのようにKmeansが得ることができる各行の平均と標準のdevを持っている別の2次元配列に、配列を変換する考えている –

+0

私も同じことをしようとしていた、 ? 配列は4Dで、np.mean(axis = 2)を使用して、4番目のdimを切り捨て、今度は再びaxis = 0を使用しました。我々はもう一つのぼんやりしたものを切る これはK平均によって受け入れられる2D配列ですが、私は混乱しています。 1D配列にndarray.flatten chopを使用して平均を求めるのはどうでしょうか?? –

+0

私はそれを使用することができませんでした。私は、axis = 0およびaxis = 2にそれぞれnp.meanを取得して、img_arrayを2D配列に変換しました。 今のところ私が持っているクラスは300です。軸= 0,2をそれぞれ適用した後です。しかし、私のデータセットはわずか24個しかありませんでしたが、私は間違いを犯しましたか? –

関連する問題