Numpy - 归一化 RGB 图像数据集

Numpy - Normalize RGB image dataset

我的数据集是一个 Numpy 数组,维度为 (N, W, H, C),其中 N 是图像的数量,H 和 W 分别是高度和宽度,C 是通道的数量。

我知道那里有很多工具,但我只想用 Numpy 对图像进行标准化。

我的计划是为三个通道中的每一个计算整个数据集的均值和标准差,然后减去均值并除以标准差。

假设数据集中有两张图片,这两张图片的第一个通道如下所示:

x=array([[[3., 4.],
          [5., 6.]],

          [[1., 2.],
          [3., 4.]]])

计算平均值:

numpy.mean(x[:,:,:,0])
= 3.5

计算标准:

numpy.std(x[:,:,:,0])
= 1.5

标准化第一个通道:

x[:,:,:,0] = (x[:,:,:,0] - 3.5) / 1.5

这是正确的吗?

谢谢!

看起来不错,但 NumPy 做的一些事情可以让它变得更好。我假设您想分别标准化每个通道。

首先,注意 x 有一个方法 mean,所以我们可以写 x[..., 0].mean() 而不是 np.mean(x[:, :, :, 0])。此外,mean 方法采用关键字参数 axis,我们可以按如下方式使用它:

means = x.mean(axis=(0, 1, 2)) # Take the mean over the N,H,W axes
means.shape # => will evaluate to (C,)

然后我们可以像这样从整个数据集中减去均值:

centered = x - x.mean(axis=(0,1,2), keepdims=True)

请注意,我们必须在此处使用 keepdims

还有一个 x.std 以相同的方式工作,因此我们可以在 1 行中完成整个规范化:

z = (x - x.mean(axis=(0,1,2), keepdims=True)) / x.std(axis=(0,1,2), keepdims=True)

查看 numpy.ndarray.mean and np.ndarray.std 的文档了解更多信息。 np.ndarray.method 方法是您在调用 x.method 而不是使用 np.method(x) 时点击的方法。


编辑:我后来了解到,当然还有一个 scipy.stats.zscore。我不确定这是否是一种更易读的方式来获取每个通道的 zscores,但有些人可能更喜欢它:

z = zscore(x.reshape(-1, 3)).reshape(x.shape)

scipy 函数仅在一个轴上运行,因此我们必须先重新整形为 NHW x C 矩阵,然后再重新整形。