2015-09-04 38 views
1

我有HSV圖像數據的numpy的數組:如何修改HSV圖像數據的numpy數組中的像素值?

形狀:

(960, 1280, 3) 

數據:

[[ 90 53 29] 
    [ 90 53 29] 
    [ 68 35 29] 
    ..., 
    [ 66 28 146] 
    [ 58 21 145] 
    [ 58 21 145]] 

[[ 90 53 29] 
    [ 90 53 29] 
    [ 75 35 29] 
    ..., 
    [ 65 31 148] 
    [ 69 18 144] 
    [ 69 18 144]]] 

我想創建一個過濾器(例如 「H < 20或V> 200」 )並基於該過濾器修改數組,以便我可以將HSV值設置爲我需要的值,如[0 0 0]。

我無法將我的頭包裹在索引系統中,應該如何處理?

回答

1

創建蒙數組來選擇要更改的元素:

H = image[:,:,0] 
V = image[:,:,2] 
mask = (H < 20) & (V > 200) 
image[mask] = 0 
+0

謝謝,我「知道」它一定很簡單。:)如果我想將其他值定義爲值,例如[127 64 100],該怎麼辦? – Harriv

1

假設hsv作爲輸入HSV圖像數據,可以使用一些reshaping非常久遠boolean indexing所有三個通道設置爲一個通用的三重像這樣 -

newvals = np.array([127,64,100]) 

mask = (hsv[:,:,0] < 20) | (hsv[:,:,2]> 200) 
hsv.reshape(-1,3)[mask.ravel()] = newvals 

採樣運行 -

In [13]: hsv 
Out[13]: 
array([[[155, 179, 207], 
     [200, 52, 185], 
     [241, 139, 232], 
     [188, 149, 117]], 

     [[145, 169, 116], 
     [146, 134, 108], 
     [ 74, 34, 121], 
     [ 9, 190, 91]], 

     [[240, 207, 228], 
     [140, 158, 124], 
     [179, 154, 212], 
     [ 79, 166, 131]]], dtype=uint8) 

In [14]: newvals = np.array([127,64,100]) 
    ...: mask = (hsv[:,:,0] < 20) | (hsv[:,:,2]> 200) 
    ...: hsv.reshape(-1,3)[mask.ravel()] = newvals 

In [15]: hsv 
Out[15]: 
array([[[127, 64, 100], 
     [200, 52, 185], 
     [127, 64, 100], 
     [188, 149, 117]], 

     [[145, 169, 116], 
     [146, 134, 108], 
     [ 74, 34, 121], 
     [127, 64, 100]], 

     [[127, 64, 100], 
     [140, 158, 124], 
     [127, 64, 100], 
     [ 79, 166, 131]]], dtype=uint8)