[docs]defwhitening(image):"""Whitening. Normalises image to zero mean and unit variance."""image=image.astype(np.float32)mean=np.mean(image)std=np.std(image)ifstd>0:ret=(image-mean)/stdelse:ret=image*0.returnret
[docs]defnormalise_zero_one(image):"""Image normalisation. Normalises image to fit [0, 1] range."""image=image.astype(np.float32)minimum=np.min(image)maximum=np.max(image)ifmaximum>minimum:ret=(image-minimum)/(maximum-minimum)else:ret=image*0.returnret
[docs]defnormalise_one_one(image):"""Image normalisation. Normalises image to fit [-1, 1] range."""ret=normalise_zero_one(image)ret*=2.ret-=1.returnret
[docs]defresize_image_with_crop_or_pad(image,img_size=(64,64,64),**kwargs):"""Image resizing. Resizes image by cropping or padding dimension to fit specified size. Args: image (np.ndarray): image to be resized img_size (list or tuple): new image size kwargs (): additional arguments to be passed to np.pad Returns: np.ndarray: resized image """assertisinstance(image,(np.ndarray,np.generic))assert(image.ndim-1==len(img_size)orimage.ndim==len(img_size)), \
'Example size doesnt fit image size'# Get the image dimensionalityrank=len(img_size)# Create placeholders for the new shapefrom_indices=[[0,image.shape[dim]]fordiminrange(rank)]to_padding=[[0,0]fordiminrange(rank)]slicer=[slice(None)]*rank# For each dimensions find whether it is supposed to be cropped or paddedforiinrange(rank):ifimage.shape[i]<img_size[i]:to_padding[i][0]=(img_size[i]-image.shape[i])//2to_padding[i][1]=img_size[i]-image.shape[i]-to_padding[i][0]else:from_indices[i][0]=int(np.floor((image.shape[i]-img_size[i])/2.))from_indices[i][1]=from_indices[i][0]+img_size[i]# Create slicer object to crop or leave each dimensionslicer[i]=slice(from_indices[i][0],from_indices[i][1])# Pad the cropped image to extend the missing dimensionreturnnp.pad(image[slicer],to_padding,**kwargs)