def run(self, primary_images: ImageStack, nuclei: ImageStack, *args) -> SegmentationMaskCollection: """Segments nuclei in 2-d using a nuclei ImageStack Primary images are used to expand the nuclear mask, but only in cases where there are densely detected points surrounding the nuclei. Parameters ---------- primary_images : ImageStack contains primary image data nuclei : ImageStack contains nuclei image data Returns ------- masks : SegmentationMaskCollection binary masks segmenting each cell """ # create a 'stain' for segmentation mp = primary_images.max_proj(Axes.CH, Axes.ZPLANE) mp_numpy = mp._squeezed_numpy(Axes.CH, Axes.ZPLANE) stain = np.mean(mp_numpy, axis=0) stain = stain / stain.max() # TODO make these parameterizable or determine whether they are useful or not size_lim = (10, 10000) disk_size_markers = None disk_size_mask = None nuclei_mp = nuclei.max_proj(Axes.ROUND, Axes.CH, Axes.ZPLANE) nuclei__mp_numpy = nuclei_mp._squeezed_numpy(Axes.ROUND, Axes.CH, Axes.ZPLANE) self._segmentation_instance = _WatershedSegmenter( nuclei__mp_numpy, stain) label_image = self._segmentation_instance.segment( self.nuclei_threshold, self.input_threshold, size_lim, disk_size_markers, disk_size_mask, self.min_distance) # we max-projected and squeezed the Z-plane so label_image.ndim == 2 physical_ticks = { coord: nuclei.xarray.coords[coord.value].data for coord in (Coordinates.Y, Coordinates.X) } return SegmentationMaskCollection.from_label_image( label_image, physical_ticks)
def run( self, stack: ImageStack, in_place: bool = False, verbose: bool = False, n_processes: Optional[int] = None, *args, ) -> ImageStack: """Perform filtering of an image stack Parameters ---------- stack : ImageStack Stack to be filtered. in_place : bool if True, process ImageStack in-place, otherwise return a new stack verbose : bool if True, report on filtering progress (default = False) n_processes : Optional[int] Number of parallel processes to devote to calculating the filter Returns ------- ImageStack : If in-place is False, return the results of filter as a new stack. Otherwise return the original stack. """ return stack.max_proj(*tuple(Axes(dim) for dim in self.dims))