2014-07-16 54 views
2

我有一個形象img在色彩獨特的名單:numpy的:圖像

>>> img.shape 
(200, 200, 3) 

開像素(100,100),我有一個漂亮的顏色:

>>> img[100,100] 
array([ 0.90980393, 0.27450982, 0.27450982], dtype=float32) 

現在我的問題是:這幅圖中有多少種不同的顏色,我如何列舉它們?

我的第一個想法是numpy.unique(),但不知何故我使用這個錯誤。

回答

3

你可以這樣做:

set(tuple(v) for m2d in img for v in m2d) 
1

一種直接的方式做到這一點是利用該鑄造爲一組的所有像素的列表時,會發生重複數據刪除:

unique_pixels = np.vstack({tuple(r) for r in img.reshape(-1,3)}) 

另一個根據您提取獨特像素的原因,實際使用的方式可能是使用Numpy的histogramdd函數按如下方式將像素像素映像到一些預先指定的保真度(假定像素值的範圍從0到1代表給定圖像頻道):

n_bins = 10 
bin_edges = np.linspace(0, 1, n_bins + 1) 
bin_centres = (bin_edges[0:-1] + bin_edges[1::])/2. 
hist, _ = np.histogramdd(img.reshape(-1, 3), bins=np.vstack(3 * [bin_edges])) 
unique_pixels = np.column_stack(bin_centres[dim] for dim in np.where(hist)) 
+0

很好,我接受@usual_me只是因爲解決方案出現得更快。 –

0

如果出於任何原因,你需要計算的時候出現的每個獨特的色彩數,您可以使用此:

from collections import Counter 
Counter([tuple(colors) for i in img for colors in i]) 
0

你最初的主意,用numpy.unique()其實可以做的工作完全符合最好的表現:

numpy.unique(img.reshape(-1, img.shape[2]), axis=0) 

首先,我們展平矩陣的行和列。現在矩陣具有與圖像中的像素一樣多的行。列是每個像素的顏色分量。

然後我們計算獨特的扁平矩陣行。