2016-03-10 33 views
2

所以這是一個讓我暫時陷入困境的問題。這也可能是更簡單的比我的看法,但可以說我有一個二維數組,包含灰度值,我轉換成RGB:使Python中的RGB數組中的'G'列中的灰度數組中的非零元素等於1

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灰度數組中等於1G列,以便輸出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

假設你想那就是在G信道的灰度陣列等於1nonzero任何元件,並設置在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