Mercurial > repos > perssond > s3segmenter
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 |
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 |