Numpy-标准化RGB图像数据集

时间:2019-02-04 22:16:09

标签: python image numpy machine-learning data-processing

我的数据集是一个尺寸为(N,W,H,C)的Numpy数组,其中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

这正确吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

看起来不错,但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.meannp.ndarray.std的文档以了解更多信息。调用np.ndarray.method而不是使用x.method时,您会遇到np.method(x)方法。