Создание ненулевых элементов в массиве оттенков серого равным 1 в столбце " G " в массиве RGB в Python


Так что это проблема, которую ставило меня в тупик на некоторое время теперь. Это, вероятно, проще, чем я думаю, но допустим, у меня есть 2D-массив, содержащий значения оттенков серого, и я преобразую его в 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.        ]]]
Теперь предположим, что я не связан с колонками R и B. Я знаю, как сделать эти нули, но то, что я хочу сделать, - это сделать любой элемент, который nonzero в массиве оттенков серого равен 1 в столбце G, поэтому выходной массив 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.]]]

Какой самый простой способ сделать это?

1   2   2016-03-10 17:21:09

1 ответ:

Предполагая, что вы хотите сделать любой элемент, который находится nonzero в массиве оттенков серого, равным 1 в канале G и установить все элементы в каналах R и B в 0, независимо от соответствующих значений в оттенках серого, один короткий путь будет с 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