Numpy - 标准化RGB像素阵列

jet*_*tta 8 python numpy image-processing normalize numpy-broadcasting

我有一个带有形状的numpy数组(34799, 32, 32, 3),意思是(num examples, width, height, channels).

现在我使用以下代码规范化图像数据:

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

X_train_norm = normalize(X_train)
Run Code Online (Sandbox Code Playgroud)

但结果似乎不对,价值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)
Run Code Online (Sandbox Code Playgroud)

输出:

[[[[-0.78125   -0.8046875 -0.8125   ]]]]
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 5

我认为这些图像是作为一个numpy数组加载的,其中填充了uint8字节值,其中的值介于0和之间255.

如果uint8在结果为的情况下执行减法,则会发生环绕.喜欢123 - 128 == 251,然后你将它除以128.例如:

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

然后,我们得到报告:

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

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

def normalize(x):
    return (x.astype(float) - 128) / 128
Run Code Online (Sandbox Code Playgroud)

请注意,这与您使用函数的事实无关,如果您将表达式与原始数组一起使用,则会得到相同的结果.


Jon*_*ler 5

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

解决此问题的最简单方法是通过使128为浮点数来强制在浮点数中进行减法

def normalize(x):
    return (x - 128.0) / 128
Run Code Online (Sandbox Code Playgroud)