numpy矩阵的有效着色值是多少?

时间:2012-12-25 16:15:04

标签: python colors numpy

我有一个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)

然后它将采用3元组的rgb组件并在其上创建一个PIL putdata并创建一个PNG。

我需要多次这样做,这种贫民窟方法很慢,而且着色非常难看。

我的问题是:

我可以应用一系列矩阵运算,它们会产生一个包含原始RGB值的彩色矩阵吗?

这实际上包含两个问题:

  1. 从上面的矩阵中获取RGB元组的最有效转换是什么?
  2. 是否有一种“漂亮”的方式将(0,1.0)值转换为彩色表示?
  3. 编辑:澄清 - 我希望将其保存为PNG,而不仅仅是实时查看。原因是其中很多都是在无头机器上执行的,然后我会检查它。

    当前算法的输出看起来非常讨厌:

    Colorized Matrix

2 个答案:

答案 0 :(得分:3)

matplotlib具有imshow功能,您可以使用OOTB。

您正在做的事情通常是通过“矢量化”完成的。你定义一个函数,让numpy做迭代:

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

答案 1 :(得分:2)

我对PIL不太熟悉,但我猜它会吞下一个形状(rows, cols, 3)的numpy数组并将其变成图像。因此,您希望重写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功能,请发布您的代码,我很乐意为此拍摄。