diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rowit.py	Fri Mar 12 00:18:40 2021 +0000
@@ -0,0 +1,76 @@
+import numpy as np
+from skimage.util import view_as_windows, montage
+
+
+class WindowView(object):
+
+    def __init__(
+        self, img_shape, block_size, overlap_size
+    ):
+        self.img_shape = img_shape
+        self.block_size = block_size
+        self.overlap_size = overlap_size
+
+        self.step_size = block_size - overlap_size
+
+    def window_view_list(self, img, pad_mode='constant'):
+        half = int(self.overlap_size / 2)
+        img = np.pad(img, (
+            (half, self.padded_shape[0] - self.img_shape[0] - half), 
+            (half, self.padded_shape[1] - self.img_shape[1] - half),
+        ), mode=pad_mode)
+        
+        return self._window_view_list(img)
+    
+    def padding_mask(self):
+        half = int(self.overlap_size / 2)
+        padding_mask = np.ones(self.img_shape, dtype=np.bool)
+        padding_mask = np.pad(padding_mask, (
+            (half, self.padded_shape[0] - self.img_shape[0] - half), 
+            (half, self.padded_shape[1] - self.img_shape[1] - half),
+        ), mode='constant', constant_values=0)
+        return self._window_view_list(padding_mask)
+
+    def reconstruct(self, img_window_view_list):
+        grid_shape = self.window_view_shape[:2]
+
+        start = int(self.overlap_size / 2)
+        end = int(self.block_size - start)
+
+        img_window_view_list = img_window_view_list[..., start:end, start:end]
+
+        return montage(
+            img_window_view_list, grid_shape=grid_shape
+        )[:self.img_shape[0], :self.img_shape[1]]
+        
+    @property
+    def padded_shape(self):
+        padded_shape = np.array(self.img_shape) + self.overlap_size
+        n = np.ceil((padded_shape - self.block_size) / self.step_size)
+        padded_shape = (self.block_size + (n * self.step_size)).astype(np.int)
+        return tuple(padded_shape)
+
+    @property 
+    def window_view_shape(self):
+        return view_as_windows(
+            np.empty(self.padded_shape), 
+            self.block_size, self.step_size
+        ).shape
+
+    def _window_view_list(self, img):
+        return (
+            view_as_windows(img, self.block_size, self.step_size)
+                .reshape(-1, self.block_size, self.block_size)
+        )
+
+def crop_with_padding_mask(img, padding_mask, return_mask=False):
+    if np.all(padding_mask == 1):
+        return (img, padding_mask) if return_mask else img
+    (r_s, r_e), (c_s, c_e) = [
+        (i.min(), i.max() + 1)
+        for i in np.where(padding_mask == 1)
+    ]
+    padded = np.zeros_like(img)
+    img = img[r_s:r_e, c_s:c_e]
+    padded[r_s:r_e, c_s:c_e] = 1
+    return (img, padded) if return_mask else img
\ No newline at end of file