Numpy - normalize RGB pixel array

I think the images are loaded as a numpy array filled with uint8 bytes with values between 0 and 255.

If you perform a subtraction on an uint8 such that the result is negative, a wraparound happens. Like 123 - 128 == 251, and then you divide it by 128. For example:

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

and then, we get the reported:

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

In order to solve it, you can use .astype(..):

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

Note that this has nothing to do with the fact that you use a function, if you had used the expression with the original array, you would have had the same result.


As the code is currently written, if x has dtype uint8 (which it seems to have), the subtraction will take place in uint8, but the division is done in float.

The easiest way to solve this is to force the subtraction to happen in floats by letting 128 be a float

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