我有大量的形状[批次大小,宽度,高度,通道数](它们不是RGB图像,而是类似的2D字段概念)。在
我想对每个频道的图像进行归一化处理。有没有比下面这些更性感的方式来做这件事?特别是我不喜欢的是频道上的循环,我发现必须这样做很奇怪np.min.最小值以及np.最大值在切片上。同样,这是硬编码,只工作在张量与排名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