使灰度数组中的非零元素等于 Python 中 RGB 数组中 'G' 列中的 1

Making nonzero elements in grayscale array equal to 1 in 'G' column in an RGB array in Python

所以这是一个困扰我一段时间的问题。它可能比我想象的更简单,但可以说我有一个包含灰度值的二维数组,我正在转换为 RGB:

import numpy as np
import matplotlib.pyplot as plt

grayscale = [[0, 0, 146, 150], [162, 0, 0, 60]]
gray = np.array(grayscale)

def to_rgb1(gray):
    gray.resize((gray.shape[0], gray.shape[1], 1))
    return np.repeat(gray.astype(np.uint8), 3, 2)
cmap = plt.get_cmap('jet')
rgba_img = cmap(gray)
rgb_img = np.delete(rgba_img, 3, 2)

print rgb_img

这段代码的输出是:

[[[ 0.          0.          0.5       ]
  [ 0.          0.          0.5       ]
  [ 0.71790006  1.          0.24984187]
  [ 0.76850095  1.          0.19924099]]

 [[ 0.92030361  1.          0.04743833]
  [ 0.          0.          0.5       ]
  [ 0.          0.          0.5       ]
  [ 0.          0.44117647  1.        ]]]

现在假设我不关心 RB 列。我知道如何使这些为零,但我想做的是使灰度数组中 nonzero 的任何元素等于 G 列中的 1 因此输出 RGB 数组,因此输出如下所示:

[[[ 0.          0.          0.]
  [ 0.          0.          0.]
  [ 0.          1.          0.]
  [ 0.          1.          0.]]

 [[ 0.          1.          0.]
  [ 0.          0.          0.]
  [ 0.          0.          0.]
  [ 0.          1.          0.]]]

最简单的方法是什么?

假设您想使灰度数组中 nonzero 的任何元素等于 G 通道中的 1 并设置 RB0 的通道,不管灰度中的相应值如何,一种简短的方法是 NumPy broadcasting -

(gray != 0)[...,None]*[0.0,1,0]

样本运行-

In [18]: gray
Out[18]: 
array([[  0,   0, 146, 150],
       [162,   0,   0,  60]])

In [19]: (gray != 0)[...,None]*[0.0,1,0]
Out[19]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  1.,  0.],
        [ 0.,  1.,  0.]],

       [[ 0.,  1.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  1.,  0.]]])

作为另一种注重性能的方法,您可以使用 0s 进行初始化,然后设置 1s -

out = np.zeros(gray.shape+(3,))
out[:,:,1] = gray != 0