Python Numpy-规范化RGB图像数据集

Python Numpy-规范化RGB图像数据集,python,image,numpy,machine-learning,data-processing,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.]]]) 计算平均值:

我的数据集是一个具有维度(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
这是正确的吗


谢谢

看起来不错,但是NumPy做了一些事情可以让它变得更好。我假设您希望分别规范化每个通道

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

means=x.means(轴=(0,1,2))#取N、H、W轴上的平均值
means.shape#=>将计算为(C,)
然后我们可以从整个数据集中减去平均值,如下所示:

centered=x-x.mean(轴=(0,1,2),keepdims=True)
注意,我们必须在这里使用
keepdims

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

z=(x-x.mean(轴=(0,1,2),keepdims=True))/x.std(轴=(0,1,2),keepdims=True)
查看文档了解更多信息。
np.ndarray.method
方法是您在调用
x.method
而不是使用
np.method(x)
时遇到的方法


编辑:我从中学到了,当然,有一个。我不确定这是否是一种更具可读性的方法,可以在每个通道上使用zscore,但有些人可能更喜欢它:

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

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

回答得很好,我只建议链接到Numpy的文档,以便感兴趣的各方可以阅读文档中关于参数的说明。如果整个数据集没有进入内存,该怎么办?可以滚动或在线方式计算平均值和标准偏差,而无需立即将整个数据集加载到内存中--存在百万个问题和其他描述这一点的来源,参见例如。然后,当您从磁盘加载一部分数据供以后使用时,您可以只插入平均值和标准偏差,而不是上面的
x.mean(…)
x.std(…)