# Per Image Normalization

How to perform similar normalization as tf.image.per_image_standardization in pytorch?

Any way to achieve this?

Could you explain, what this method is doing, as the docs don’t seem to give much information:

``````Linearly scales each image in  `image`  to have mean 0 and variance 1.

For each 3-D image  `x`  in  `image` , computes  `(x - mean) / adjusted_stddev` , where
* `mean`  is the average of all values in  `x`
* `adjusted_stddev = max(stddev, 1.0/sqrt(N))`  is capped away from 0 to protect against division by 0 when handling uniform images
* `N`  is the number of elements in  `x`
* `stddev`  is the standard deviation of all values in  `x`
``````

I don’t understand what the “per image” part of this normalization is, if the mean is the "average of all values in `x` and the `stddev` also seems to use all elements.

This is a replica that we created in PyTorch to use as a lambda function in our transforms. We compared these results with the tensorflow implementation and it seems to work the same.

I believe that this calculates the mean of the pixels in a single image and ‘x’ here refers to each pixel of the same image.

``````def per_image_standardization(image):
"""
This function creates a custom per image standardization
transform which is used for data augmentation.
params:
- image (torch Tensor): Image Tensor that needs to be standardized.

returns:
- image (torch Tensor): Image Tensor post standardization.
"""
# get original data type
orig_dtype = image.dtype

# compute image mean
image_mean = torch.mean(image, dim=(-1, -2, -3))

# compute image standard deviation
stddev = torch.std(image, axis=(-1, -2, -3))

# compute number of pixels
num_pixels = torch.tensor(torch.numel(image), dtype=torch.float32)

# compute minimum standard deviation
min_stddev = torch.rsqrt(num_pixels)