import numpy as np from tqdm import tqdm def augment_patch(patch): if len(patch.shape[:-1]) == 2: patch = np.rot90(patch, k=np.random.randint(4), axes=(0, 1)) elif len(patch.shape[:-1]) == 3: patch = np.rot90(patch, k=np.random.randint(4), axes=(1, 2)) patch = np.flip(patch, axis=-2) if np.random.randint(2) else patch return patch # Below implementation of stratified sampling inherited from Noise2Void: https://github.com/juglab/n2v # Noise2void: learning denoising from single noisy images. Krull, Alexander, Tim-Oliver Buchholz, and Florian Jug. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019. def get_stratified_coords2D(coord_gen, box_size, shape): box_count_y = int(np.ceil(shape[0] / box_size)) box_count_x = int(np.ceil(shape[1] / box_size)) x_coords = [] y_coords = [] for i in range(box_count_y): for j in range(box_count_x): y, x = next(coord_gen) y = int(i * box_size + y) x = int(j * box_size + x) if (y < shape[0] and x < shape[1]): y_coords.append(y) x_coords.append(x) return (y_coords, x_coords) def get_stratified_coords3D(coord_gen, box_size, shape): box_count_z = int(np.ceil(shape[0] / box_size)) box_count_y = int(np.ceil(shape[1] / box_size)) box_count_x = int(np.ceil(shape[2] / box_size)) x_coords = [] y_coords = [] z_coords = [] for i in range(box_count_z): for j in range(box_count_y): for k in range(box_count_x): z, y, x = next(coord_gen) z = int(i * box_size + z) y = int(j * box_size + y) x = int(k * box_size + x) if (z < shape[0] and y < shape[1] and x < shape[2]): z_coords.append(z) y_coords.append(y) x_coords.append(x) return (z_coords, y_coords, x_coords) def rand_float_coords2D(boxsize): while True: yield (np.random.rand() * boxsize, np.random.rand() * boxsize) def rand_float_coords3D(boxsize): while True: yield (np.random.rand() * boxsize, np.random.rand() * boxsize, np.random.rand() * boxsize)