harmonization.recon

 1import numpy as np
 2
 3from itertools import product
 4from scipy.ndimage import zoom
 5
 6
 7def depimp_zoom(D, block_size, block_up, order=1):
 8
 9    block_size = np.array(block_size)
10    block_up = np.array(block_up)
11
12    if (len(block_up) == len(block_size)):
13        factor = block_size / block_up
14        zoomer = (*factor, 1)
15    else:
16        factor = block_size[:-1] / block_up
17        zoomer = (*factor, 1, 1)
18
19    # if we have a 4D block array and different last dimension, subsample it
20    # if (len(block_up) == len(block_size)) and (block_up[-1] != block_size[-1]):
21    size = tuple(block_up)
22
23    if (len(block_up) - 1) == len(block_size):
24        size = size + (block_size[-1],)
25
26    reshaped = D.reshape(size + (-1,))
27    D_depimpe = zoom(reshaped, zoomer, order=order).reshape(np.prod(block_size), -1)
28
29    return D_depimpe
30
31
32def reconstruct_from_blocks(patches, image_size, block_size, block_up, new_overlap, weights=None):
33
34    i_h, i_w, i_l = image_size[:3]
35
36    if len(patches.shape[1:]) == 3:
37        p_h, p_w, p_l = patches.shape[1:]
38    else:
39        p_h, p_w, p_l = patches.shape[1:-1]
40
41    img = np.zeros(image_size, dtype=np.float32)
42    img = np.pad(img, [(0, p_h), (0, p_w), (0, p_l), (0, 0)], 'constant', constant_values=(0, 0))
43    div = np.full(image_size, 1e-15, dtype=np.float32)
44    div = np.pad(div, [(0, p_h), (0, p_w), (0, p_l), (0, 0)], 'constant', constant_values=(1e-15, 1e-15))
45
46    # compute the dimensions of the patches array
47    n_h = i_h - p_h + 1
48    n_w = i_w - p_w + 1
49    n_l = i_l - p_l + 1
50
51    frac, nup = np.modf(np.divide(block_up, block_size[:-1]))
52    int_frac = np.ceil(frac).astype(np.int32)
53    nup = np.array(nup + int_frac, dtype=np.int32)
54
55    valid = (np.arange(0, block_up[0], nup[0]),
56             np.arange(0, block_up[1], nup[1]),
57             np.arange(0, block_up[2], nup[2]))
58
59    plus = [None, None, None]
60
61    for idx in range(3):
62        if len(valid[idx]) < block_size[idx]:
63            candidate = np.arange(block_up[idx])[(len(valid[idx]) - block_size[idx]):]
64
65            # if we already have filled the last index (like in 4/5), we have to find a valid location for it
66            while any(np.in1d(candidate, valid[idx])):
67                candidate -= 1
68
69            plus[idx] = candidate
70        else:
71            plus[idx] = ()
72
73    valid = (np.append(valid[0], plus[0]),
74             np.append(valid[1], plus[1]),
75             np.append(valid[2], plus[2]))
76
77    step = ([slice(i, i + p_h) for i in range(0, n_h + int_frac[0], new_overlap[0]) if i % block_up[0] in valid[0]],
78            [slice(j, j + p_w) for j in range(0, n_w + int_frac[1], new_overlap[1]) if j % block_up[1] in valid[1]],
79            [slice(k, k + p_l) for k in range(0, n_l + int_frac[2], new_overlap[2]) if k % block_up[2] in valid[2]])
80
81    ijk = list(product(*step))
82
83    for p, (i, j, k) in zip(patches, ijk):
84        img[i, j, k] += p
85        div[i, j, k] += 1
86
87    out = img[:-p_h, :-p_w, :-p_l] / div[:-p_h, :-p_w, :-p_l]
88    return out
def depimp_zoom(D, block_size, block_up, order=1):
 8def depimp_zoom(D, block_size, block_up, order=1):
 9
10    block_size = np.array(block_size)
11    block_up = np.array(block_up)
12
13    if (len(block_up) == len(block_size)):
14        factor = block_size / block_up
15        zoomer = (*factor, 1)
16    else:
17        factor = block_size[:-1] / block_up
18        zoomer = (*factor, 1, 1)
19
20    # if we have a 4D block array and different last dimension, subsample it
21    # if (len(block_up) == len(block_size)) and (block_up[-1] != block_size[-1]):
22    size = tuple(block_up)
23
24    if (len(block_up) - 1) == len(block_size):
25        size = size + (block_size[-1],)
26
27    reshaped = D.reshape(size + (-1,))
28    D_depimpe = zoom(reshaped, zoomer, order=order).reshape(np.prod(block_size), -1)
29
30    return D_depimpe
def reconstruct_from_blocks(patches, image_size, block_size, block_up, new_overlap, weights=None):
33def reconstruct_from_blocks(patches, image_size, block_size, block_up, new_overlap, weights=None):
34
35    i_h, i_w, i_l = image_size[:3]
36
37    if len(patches.shape[1:]) == 3:
38        p_h, p_w, p_l = patches.shape[1:]
39    else:
40        p_h, p_w, p_l = patches.shape[1:-1]
41
42    img = np.zeros(image_size, dtype=np.float32)
43    img = np.pad(img, [(0, p_h), (0, p_w), (0, p_l), (0, 0)], 'constant', constant_values=(0, 0))
44    div = np.full(image_size, 1e-15, dtype=np.float32)
45    div = np.pad(div, [(0, p_h), (0, p_w), (0, p_l), (0, 0)], 'constant', constant_values=(1e-15, 1e-15))
46
47    # compute the dimensions of the patches array
48    n_h = i_h - p_h + 1
49    n_w = i_w - p_w + 1
50    n_l = i_l - p_l + 1
51
52    frac, nup = np.modf(np.divide(block_up, block_size[:-1]))
53    int_frac = np.ceil(frac).astype(np.int32)
54    nup = np.array(nup + int_frac, dtype=np.int32)
55
56    valid = (np.arange(0, block_up[0], nup[0]),
57             np.arange(0, block_up[1], nup[1]),
58             np.arange(0, block_up[2], nup[2]))
59
60    plus = [None, None, None]
61
62    for idx in range(3):
63        if len(valid[idx]) < block_size[idx]:
64            candidate = np.arange(block_up[idx])[(len(valid[idx]) - block_size[idx]):]
65
66            # if we already have filled the last index (like in 4/5), we have to find a valid location for it
67            while any(np.in1d(candidate, valid[idx])):
68                candidate -= 1
69
70            plus[idx] = candidate
71        else:
72            plus[idx] = ()
73
74    valid = (np.append(valid[0], plus[0]),
75             np.append(valid[1], plus[1]),
76             np.append(valid[2], plus[2]))
77
78    step = ([slice(i, i + p_h) for i in range(0, n_h + int_frac[0], new_overlap[0]) if i % block_up[0] in valid[0]],
79            [slice(j, j + p_w) for j in range(0, n_w + int_frac[1], new_overlap[1]) if j % block_up[1] in valid[1]],
80            [slice(k, k + p_l) for k in range(0, n_l + int_frac[2], new_overlap[2]) if k % block_up[2] in valid[2]])
81
82    ijk = list(product(*step))
83
84    for p, (i, j, k) in zip(patches, ijk):
85        img[i, j, k] += p
86        div[i, j, k] += 1
87
88    out = img[:-p_h, :-p_w, :-p_l] / div[:-p_h, :-p_w, :-p_l]
89    return out