簡體   English   中英

numpy:圖像中唯一的顏色列表

[英]numpy: unique list of colors in the image

我有一個圖像img

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

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

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

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

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

您最初使用numpy.unique()想法實際上可以以最佳性能完美地完成工作:

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

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

然后我們計算扁平矩陣的唯一行。

你可以這樣做:

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

一種直接的方法是利用在將所有像素列表投射為一組時發生的重復數據刪除:

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))

如果出於任何原因您需要計算每種獨特顏色出現的次數,您可以使用以下命令:

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

此處還詢問有關獨特顏色(或更普遍地沿給定軸的獨特值)的問題(特別是,請參閱此答案)。 如果您正在尋找最快的可用選項,那么“無效視圖”將是您的首選武器:

axis=2
np.unique(
        img.view(np.dtype((np.void, img.dtype.itemsize*img.shape[axis])))
        ).view(img.dtype).reshape(-1, img.shape[axis])

對於與腳本實際作用相關的任何問題,我建議讀者參考上面的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM