Mercurial > repos > perssond > s3segmenter
comparison rowit.py @ 2:96d0d969ebc9 draft default tip
planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/s3segmenter commit 0f4f17235c5961c2fd3d4c30180507f66214c11d
author | goeckslab |
---|---|
date | Fri, 16 Sep 2022 20:05:54 +0000 |
parents | 41e8efe8df43 |
children |
comparison
equal
deleted
inserted
replaced
1:41e8efe8df43 | 2:96d0d969ebc9 |
---|---|
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 |