簡體   English   中英

按值對numpy矩陣進行有效着色?

[英]Efficient colorization of numpy matrix by value?

我有一個 numpy ndarray,看起來像:

[[0, 0.25, 1,  ...., 0.5, 0.23 ],
 [0.3, 0.75, 1, ..., 0.5, 0.37 ],
  ...,
  ...,
 [0, 0.25, 1,  ...., 0.5, 0.23 ],
 [0.3, 0.75, 1, ..., 0.5, 0.37 ]]

基本上每個值都在 0 - 1.0 范圍內

我想將其可視化為位圖,目前我有一個非常慢的循環,它基本上是這樣做的:

for i, row in enumerate(data):
    for j, val in enumerate(row):
        yield val_to_rgb(val)

然后它將采用 rgb 組件的 3 元組並在其上執行 PIL putdata 並創建一個 PNG。

我需要多次這樣做,而且這種貧民窟方法很慢,而且着色非常難看。

我的問題是這樣的:

我可以應用一系列矩陣運算來生成包含原始 RGB 值的彩色矩陣嗎?

這實際上包含兩個問題:

  1. 我可以應用什么最有效的轉換來從上述矩陣中獲取 RGB 元組
  2. 是否有一種“不錯”的方法可以將 (0, 1.0) 值轉換為彩色表示?

編輯:澄清 - 我希望將其另存為 PNG,而不僅僅是實時查看。 原因是其中很多都是在無頭機器上執行的,然后我事后檢查。

當前算法的輸出看起來很糟糕:

彩色矩陣

matplotlib 具有imshow功能,您可以開箱即用。

您所做的通常是通過“矢量化”完成的。 您定義一個函數並讓 numpy 進行迭代:

vec = np.vectorize(val_to_rgb)
rgb_data = vec(data)

我對 PIL 不是很熟悉,但我猜測它會吞下一個形狀的 numpy 數組(rows, cols, 3)並將其轉換為圖像。 所以你想重寫你的val_to_rgb函數,以便它處理數組,而不是標量,並將 RGB 值放在形狀的最后一個維度中。

例如,假設您想將您的值解釋為灰度,0 表示黑色,1 表示白色。 您當前采用標量輸入的函數如下所示:

def val_to_rgb(val) :
    return (int(val * 255),) * 3

和矢量化形式將是這樣的:

def vals_to_rgbs(vals) :
    ret = np.zeros(vals.shape + (3,),  dtype='uint8')
    ret[...] = vals.reshape(vals.shape + (1,)) * 255
    return ret

>>> vals_to_rgb(np.random.rand(10,10)).shape
(10, 10, 3)
>>> vals_to_rgb(np.random.rand(10,10)).dtype
dtype('uint8')

重塑是讓廣播發揮其魔力。

想法可能會變得更復雜,所以如果您需要幫助向量化您的特定val_to_rgb函數,請發布您的代碼,我很樂意val_to_rgb一下。

暫無
暫無

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

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