2014-11-03 35 views
0

我有一個RGB圖像,表示爲大小爲(500,500,3)的numpy數組。我還有一個大小數組(500,500),其中每個像素都有一個介於0和99之間的整數值。這基本上將圖像分成許多子區域。屬於子陣列的像素共享相同的整數索引。python:計算圖像子集的統計信息

我有興趣做一些計算,比如計算每個子集的均值和標準差。我可以遍歷如下的圖像做這個(計算例如平均值):

# image is of size (500, 500, 3) ->RGB values 
# label is of size (500, 500) -> contains integers   
import numpy as np 

mean = np.zeros((100, 3)) 
for i in range(0, 100): 
    count = 0 
    for x in range(0,500): 
     for y in range(0,500): 
      if label[x, y] == i: 
       mean[i, :] += image[x, y,:] 
       count = count + 1 

    # Compute the mean 
    if count > 0: 
     mean[i,:] /= count 

的方式我做它包含了很多的循環,它似乎是相當不符合Python和我想知道是否有更好的(速度感)方式來做到這一點。

回答

4

使用邏輯索引和口罩:

​​
+0

謝謝!現在編寫代碼段讓我感到尷尬。你能解釋一下平均函數的參數(0)是什麼嗎?這似乎是每個軸的計算意義(這是我想要的!),但從文檔中我不清楚。 – Luca 2014-11-03 15:23:29

+1

你會得到一個二維數組,因爲前兩個維度被蒙版壓平了,並且平均值是在第一維上計算的,所以你得到了一個包含3個元素的向量。 – Daniel 2014-11-03 15:30:43

1

您可以使它更多'pythonic',但就循環而言,您可以通過使用座標:i=label[x:y]label中檢索實際當前整數值,而不是遍歷所有可能的值,從而丟失第一個循環。