【问题标题】:python: computing statistics on subset of an imagepython:计算图像子集的统计信息
【发布时间】:2014-11-03 15:05:58
【问题描述】:

我有一个 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

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

【问题讨论】:

    标签: python performance loops numpy vectorization


    【解决方案1】:

    使用逻辑索引和掩码:

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

    【讨论】:

    • 谢谢!现在写那个代码段我感到很尴尬。您能解释一下均值函数的参数 (0) 的作用吗?它似乎是沿每个轴计算平均值(这是我想要的!),但从文档中我不清楚。
    • 你得到一个二维数组,因为前两个维度被掩码展平,平均值是在第一个维度上计算的,所以你得到一个包含 3 个元素的向量。
    【解决方案2】:

    你可以让它更“pythonic”,但就循环而言,你可以通过使用坐标从label检索实际的当前整数值来丢失第一个循环:i=label[x:y]而不是循环遍历所有可能的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多