2017-11-18 110 views
2

我有一個很大的RGB圖像作爲numpy數組,我想設置所有像素具有R = 0,G = 0,B = 0到R = 255,G = 0 ,B = 0。 什麼是最快的方式? 我想:如何改變numpy數組中的像素值

for pix in result: 
    if np.all(np.logical_and(pix[0]==pix[1],pix[2]==0,pix[2]==pix[1])): 
     pix [0] = 255 

但這種方式我沒有單個像素。有一種類似的方式,它不會迭代索引?

+0

什麼是你的形象'.shape'? – gboffi

回答

3

所以這裏是一個矢量化的解決方案。你的圖像基本上是由3個(顏色)陣列組成的h。所以我們可以利用不易掌握但非常強大的廣播規則。

因此,基本上我們將整個數組與一個3向量與您正在查找的值進行比較。由於廣播規則,Numpy會將每個像素與這三個向量進行比較,並告訴您它是否匹配(因此在這種特定情況下,如果紅色,綠色和藍色匹配)。所以你最終會得到一個與圖像大小相同的布爾數組和真值。

現在我們只想找到所有三種顏色匹配的像素。爲此,我們使用「all」方法,如果數組的所有值都爲true,則這是真的。如果我們將它應用到某個軸 - 在這種情況下是顏色軸 - 我們可以通過h數組得到一個w數組,無論所有顏色匹配。

現在我們可以將這個二維布爾模板應用到我們原來的w中,由h乘以3的數組並獲得匹配我們顏色的像素。我們現在可以重新分配他們 - 再次與廣播。

下面是示例代碼

import numpy as np 

#create a 2x2x3 image with ones 
img = np.ones((2,2,3)) 

#make the off diagonal pixels into zeros 
img[0,1] = [0,0,0] 
img[1,0] = [0,0,0] 

#find the only zeros pixels with the mask 
#(of course any other color combination would work just as well) 
#... and apply "all" along the color axis 
mask = (img == [0.,0.,0.]).all(axis=2) 

#apply the mask to overwrite the pixels 
img[ mask ] = [255,0,0] 
+0

謝謝,非常明確的答案 – leoScomme

1

由於所有值都是正的或零,一個簡單而有效的方法是:

img[img.sum(axis=2)==0,0]=255 

img.sum(axis=2)==0在兩個第一尺寸選擇好像素,0的第三條紅色運河。