2017-04-03 122 views
3

我想使用K Means或其他算法(建議需要)對圖像進行聚類。Python中的聚類 - 圖像聚類

問題就像這樣 - 我想將圖像聚類爲3個羣集(自然,日落,水)。我使用os.listdir()加載所有圖像,然後將所有圖像轉換爲數組(RGB),然後創建一個包含三列(ID,Image_array,Label)的數據框。

現在,當我用K均值聚類,提供n_clusters = 3,它顯示了這個錯誤:

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

現在,我需要你在這個聚類問題的幫助。我創建看起來像這樣

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均值想每一個輸入向量,而你爲它提供每圖像的3D陣列。解決像這樣的問題(這需要一些創造力)的最簡單的方法是設計一組功能來描述您所擁有的課程。因爲在這種情況下,你希望在自然界(很多的綠色),水(很多的藍色)和日落(很多的讀取/黃色/粉紅色可能?)之間進行分類,你可以使用總綠色或平均綠色藍色和紅色值。要檢查您選擇的功能是否具有區分性,您可以繪製直方圖。

要從您的4D(圖像x寬x高x顏色)數組轉到2D(圖像x平均顏色)數組。您需要在顏色,高度和寬度diminsions上使用np.mean。最後你應該有一個(圖像×3(顏色))數組。

+0

是的,這似乎interesting.But我堅持,你可以幫我在這。 如何獲得直方圖(我其實也試圖得到這個)。現在,我試圖讓平均代替三維數組。如果您請提供更多幫助,那將非常有幫助。 –

+0

我在想這個3D數組轉換成二維數組,它有平均值和標準偏差,這在我運行K平均值時會好,但是這個數組是RGB數組。我的意思是如何做到這一點? –

+0

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

0

發生這種情況是因爲您在傳遞4-dim數組的同時會傳遞2-dim期望值。 '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

我需要更多解釋,你能否給我提供你的代碼。 在這個時候,我正在考慮如何將數組轉換爲另一個二維數組,其中每行都有mean和std dev,這些Kmeans可以得到 –

+0

我也在嘗試同樣的事情,但是有一些問題? 數組是4D,使用了np.mean(axis = 2),我們切掉了第四個dim,現在我再次使用了axis = 0。我們再次黯淡了。 現在它是一個二維陣列,它將被K MEANS接受,但是我很困惑,是否有權這樣做? 如果我們使用ndarray.flatten砍成一維數組並獲取平均值? –

+0

我無法使用它,我做的是,我通過在軸= 0和軸= 2分別獲取np.mean將img_array轉換爲二維數組。 現在,但我有的類是300.分別應用軸= 0,2後。但是我的數據集只有24個實例,我錯了? –