2014-11-03 39 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中检索实际当前整数值,而不是遍历所有可能的值,从而丢失第一个循环。