comparison rowit.py @ 0:37acf42a824b draft

"planemo upload for repository https://github.com/ohsu-comp-bio/S3segmenter commit d89a61efd4c465a1e6bf5b99b0f78fb19be5bdea-dirty"
author perssond
date Fri, 12 Mar 2021 00:18:40 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:37acf42a824b
1 import numpy as np
2 from skimage.util import view_as_windows, montage
3
4
5 class WindowView(object):
6
7 def __init__(
8 self, img_shape, block_size, overlap_size
9 ):
10 self.img_shape = img_shape
11 self.block_size = block_size
12 self.overlap_size = overlap_size
13
14 self.step_size = block_size - overlap_size
15
16 def window_view_list(self, img, pad_mode='constant'):
17 half = int(self.overlap_size / 2)
18 img = np.pad(img, (
19 (half, self.padded_shape[0] - self.img_shape[0] - half),
20 (half, self.padded_shape[1] - self.img_shape[1] - half),
21 ), mode=pad_mode)
22
23 return self._window_view_list(img)
24
25 def padding_mask(self):
26 half = int(self.overlap_size / 2)
27 padding_mask = np.ones(self.img_shape, dtype=np.bool)
28 padding_mask = np.pad(padding_mask, (
29 (half, self.padded_shape[0] - self.img_shape[0] - half),
30 (half, self.padded_shape[1] - self.img_shape[1] - half),
31 ), mode='constant', constant_values=0)
32 return self._window_view_list(padding_mask)
33
34 def reconstruct(self, img_window_view_list):
35 grid_shape = self.window_view_shape[:2]
36
37 start = int(self.overlap_size / 2)
38 end = int(self.block_size - start)
39
40 img_window_view_list = img_window_view_list[..., start:end, start:end]
41
42 return montage(
43 img_window_view_list, grid_shape=grid_shape
44 )[:self.img_shape[0], :self.img_shape[1]]
45
46 @property
47 def padded_shape(self):
48 padded_shape = np.array(self.img_shape) + self.overlap_size
49 n = np.ceil((padded_shape - self.block_size) / self.step_size)
50 padded_shape = (self.block_size + (n * self.step_size)).astype(np.int)
51 return tuple(padded_shape)
52
53 @property
54 def window_view_shape(self):
55 return view_as_windows(
56 np.empty(self.padded_shape),
57 self.block_size, self.step_size
58 ).shape
59
60 def _window_view_list(self, img):
61 return (
62 view_as_windows(img, self.block_size, self.step_size)
63 .reshape(-1, self.block_size, self.block_size)
64 )
65
66 def crop_with_padding_mask(img, padding_mask, return_mask=False):
67 if np.all(padding_mask == 1):
68 return (img, padding_mask) if return_mask else img
69 (r_s, r_e), (c_s, c_e) = [
70 (i.min(), i.max() + 1)
71 for i in np.where(padding_mask == 1)
72 ]
73 padded = np.zeros_like(img)
74 img = img[r_s:r_e, c_s:c_e]
75 padded[r_s:r_e, c_s:c_e] = 1
76 return (img, padded) if return_mask else img