annotate rowit.py @ 1:41e8efe8df43 draft

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