2013-12-20 55 views
2

標量/布爾我有一個3D陣列(X,Y,RGBA)和我的目標是:numpy的有條件替換陣列

找到哪些像素是空白的RGBA = [0,0,0,0],然後改變它們的顏色變成藍色,其他像素變成綠色。

據我看到它可以在2個步驟進行:

1-創建一個500×500陣列,bool如果像素具有值,假如果空白

2-然後應用一個函數來經過無數次搜索(我不是python嚮導)後,我設法以pythonic的方式實現了1-(至少我的希望)。[0,255,055]和False by [0,255,0,255]

..)

img.shape 
>(500, 500, 4) 
img_bool = np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2) 
img_bool.shape 
>(500, 500) 

我的第2步的猜測是想這樣的語法:

img_final = np.where(img_bool, [0,0,255,255], [0,255,0,255]) 

np.choose(img_bool, [[0,0,255,255],[0,255,0,255], out=img_final) 

但他們給同樣的錯誤(相當合乎邏輯的,因爲兩個表達式可以做實際上是一樣的)

ValueError: shape mismatch: objects cannot be breascast to a single shape

事實上,第2步可以通過「如何用numpy.ndarray中的數組/矢量替換標量/布爾值?」來總結。

回答

1

爲了您的第一項任務,使用的事實,顏色爲正整數,則可以使用

img_bool = img.sum(axis=2)>0 

第二個你可以用

img[img_bool] = [0, 0, 255, 255] 
img[~img_bool] = [0, 255, 0, 255] 

注意做,如果我得到你的描述正確的,你會原來的表達式返回相反,即你必須改變它

img_bool = ~np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2) 
+0

非常整齊的語法。 thx,所有你的答案完美工作。只有一個備註:如果像素數組爲[0,-15,15,0]否,img.sum(axis = 2)> 0可以返回True。但在我的情況下,它完美的作品,因爲所有的價值都是積極的。 thx再次。 – comte

+0

@comte是的,它可以,我補充說明。我從等於255的值判斷,你的顏色是正值。 – alko