我有一个numpy ndarray,其形状为[batch_size, width, height, num_channels](它们不是RGB图像,但类似于2D场的概念)。
我想对每个通道的图像进行归一化。有没有更多的numpy方法可以做到这一点,而不是下面的方法?特别是我不喜欢循环通道,并且我发现在切片上执行np.min和np.max很奇怪。此外,这个方法被硬编码为仅适用于秩为4的张量,如何使其适应动态秩或通道在动态轴上的情况?
我想对每个通道的图像进行归一化。有没有更多的numpy方法可以做到这一点,而不是下面的方法?特别是我不喜欢循环通道,并且我发现在切片上执行np.min和np.max很奇怪。此外,这个方法被硬编码为仅适用于秩为4的张量,如何使其适应动态秩或通道在动态轴上的情况?
def get_img_ch_min_max(imgs):
'''return minimum and maximum for each channel of [batch, width, height, channels]'''
if len(imgs.shape)==3: imgs = np.expand_dims(imgs, axis=-1)
# iterate each channel
ch_min = np.array([np.min(imgs[:,:,:,i]) for i in range(imgs.shape[-1])])
ch_max = np.array([np.max(imgs[:,:,:,i]) for i in range(imgs.shape[-1])])
return ch_min, ch_max
def normalise_per_channel(imgs):
'''normalise batch of images per channel, [batch, width, height, channels]'''
if len(imgs.shape)==3: imgs = np.expand_dims(imgs, axis=-1)
ch_min, ch_max = get_img_ch_min_max(imgs)
ch_range = ch_max - ch_min
imgs_ret = np.copy(imgs)
for i in range(imgs.shape[-1]): # iterate each channel
if ch_range[i] > 0: # avoid divide by zero
imgs_ret[:,:,:,i] = (imgs[:,:,:,i] - ch_min[i]) / ch_range[i]
imgs_ret = np.squeeze(imgs_ret)
return imgs_ret
(0, 1, 2)
。 - AGN Gazer