2016-03-10 6 views
2

Так что это проблема, которая натолкнула меня на некоторое время. Это, вероятно, более простой, чем я думаю, но позволяет сказать, что у меня есть 2D массив, содержащий значения оттенков серого, и я уверен, преобразование в RGB:Выполнение ненулевых элементов в градациях серого, равное 1 в столбце «G» в массиве RGB в Python

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.]]] 

Что было бы самым простым способом сделать это?

ответ

2

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