File size: 2,257 Bytes
9bd9a8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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)