【问题标题】:Numpy - normalize RGB pixel arrayNumpy - 归一化 RGB 像素数组
【发布时间】:2023-03-31 12:16:01
【问题描述】:

我有一个形状为(34799, 32, 32, 3)的numpy数组,表示(num examples, width, height, channels)

现在我使用以下代码对图像数据进行标准化:

def normalize(x):
    return (x - 128) / 128

X_train_norm = normalize(X_train)

但是结果好像不对,X_train[0][0][0]的值是[28 25 24],但是X_train_norm[0][0][0]的输出是[1.21875 1.1953125 1.1875]

我使用以下测试代码:

test = np.array([[[[28, 25, 24]]]])
print ((test - 128) / 128)

输出:

[[[[-0.78125   -0.8046875 -0.8125   ]]]]

为什么normalize 函数得到错误的结果?

【问题讨论】:

  • 我认为这是由于字节的环绕。
  • 什么是 X_train.dtype ?
  • @P.Camilleri uint8
  • 这解释了您观察到的行为,请参阅提供的详细答案。
  • 它解决了我的问题。非常感谢。

标签: python numpy image-processing array-broadcasting normalize


【解决方案1】:

我认为图像被加载为一个 numpy 数组,其中填充了 uint8 字节,其值介于 0255 之间。

如果您对uint8 执行减法以使结果为,则会发生回绕。比如123 - 128 == 251,然后你除以128。例如:

>>> np.array([28,25,24], dtype=np.uint8) - 128
array([156, 153, 152], dtype=uint8)

然后,我们得到报告:

>>> (np.array([28,25,24], dtype=np.uint8) - 128)/128
array([1.21875  , 1.1953125, 1.1875   ])

为了解决,可以使用.astype(..)

def normalize(x):
    return (x.astype(float) - 128) / 128

请注意,这与您使用函数这一事实无关,如果您将表达式与原始数组一起使用,您将得到 same 结果。

【讨论】:

    【解决方案2】:

    由于当前编写的代码,如果 x 具有 dtype uint8(它似乎有),则减法将在 uint8 中进行,但除法在 float 中完成。

    解决这个问题的最简单方法是通过让 128 成为浮点数来强制减法发生在浮点数中

    def normalize(x):
        return (x - 128.0) / 128

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2015-01-12
      • 2015-08-04
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2020-10-28
      • 2012-09-16
      • 2018-08-22
      相关资源
      最近更新 更多