python:计算图像子集的统计数据

时间:2014-11-03 15:05:58

标签: python performance loops numpy vectorization

我有一个RGB图像,表示为一个大小(500,500,3)的numpy数组。我还有一个大小(500,500)的数组,其中每个像素的整数值介于0和99之间。这基本上将图像划分为许多子区域。属于子数组的像素共享相同的整数索引。

我有兴趣做一些计算,比如计算每个子集的均值和标准差。我可以通过如下循环覆盖图像来做到这一点(例如计算平均值):

# 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

我这样做的方式包括很多循环,它似乎是非pythonic的,我想知道是否有更好的(速度感)方法来做到这一点。

2 个答案:

答案 0 :(得分:4)

使用逻辑索引和掩码:

image[label==i,:].mean(0)

答案 1 :(得分:1)

你可以使它变得更多' pythonic',但是就循环而言,你可以通过使用坐标从label检索实际的当前整数值来丢失第一个循环:{ {1}}而不是循环所有可能的值。