def assign_gt_to_ws(self, gt): ws_nopad = morpho.juicy_center(self.watershed, self.pad_thickness) bdrymap = morpho.pad(morpho.seg_to_bdry(ws_nopad), [0] * self.pad_thickness) gt_bdrymap_nopad = morpho.seg_to_bdry(gt) gt_bdrymap = morpho.pad(gt_bdrymap_nopad, [0] * self.pad_thickness) k = distance_transform_cdt(1 - bdrymap, return_indices=True) ind = nonzero(gt_bdrymap.ravel())[0] closest_sub = numpy.concatenate([i.ravel()[:, newaxis] for i in k[1]], axis=1) closest_sub = closest_sub[ind, :] closest_ind = [ dot(bdrymap.strides, i) / bdrymap.itemsize for i in closest_sub ] M = zeros_like(bdrymap).astype(float) M.ravel()[closest_ind] = 1.0 bdrymap.ravel()[closest_ind] = False k = distance_transform_cdt(1 - bdrymap, return_indices=True) ind = nonzero(gt_bdrymap.ravel())[0] closest_sub = numpy.concatenate([i.ravel()[:, newaxis] for i in k[1]], axis=1) closest_sub = closest_sub[ind, :] closest_ind = [ dot(bdrymap.strides, i) / bdrymap.itemsize for i in closest_sub ] M.ravel()[closest_ind] = 1.0 return M
def set_watershed(self, ws=array([]), lowmem=False, connectivity=1): try: self.boundary_body = ws.max() + 1 except ValueError: # empty watershed given self.boundary_body = -1 self.volume_size = ws.size self.has_zero_boundaries = (ws == 0).any() if self.has_zero_boundaries: self.watershed = morpho.pad(ws, [0, self.boundary_body]) else: self.watershed = morpho.pad(ws, self.boundary_body) self.segmentation = self.watershed.copy() self.watershed_r = self.watershed.ravel() self.segmentation_r = self.segmentation.ravel() # reduce fct calls self.pad_thickness = 2 if (self.segmentation == 0).any() else 1 if lowmem: def neighbor_idxs(x): return self.get_neighbor_idxs_lean(x, connectivity) self.neighbor_idxs = neighbor_idxs else: self.pixel_neighbors = \ morpho.build_neighbors_array(self.watershed, connectivity) self.neighbor_idxs = self.get_neighbor_idxs_fast
def set_probabilities(self, probs=array([]), normalize=False): if len(probs) == 0: self.probabilities = zeros_like(self.watershed) self.probabilities_r = self.probabilities.ravel() probs = probs.astype(double) if normalize and len(probs) > 1: probs -= probs.min() # ensure probs.min() == 0 probs /= probs.max() # ensure probs.max() == 1 sp = probs.shape sw = tuple(array(self.watershed.shape, dtype=int)-\ 2*self.pad_thickness*ones(self.watershed.ndim, dtype=int)) p_ndim = probs.ndim w_ndim = self.watershed.ndim padding = [inf] + (self.pad_thickness - 1) * [0] if p_ndim == w_ndim: self.probabilities = morpho.pad(probs, padding) self.probabilities_r = self.probabilities.ravel()[:, newaxis] elif p_ndim == w_ndim + 1: if sp[1:] == sw: sp = sp[1:] + [sp[0]] probs = probs.transpose(sp) axes = range(p_ndim - 1) self.probabilities = morpho.pad(probs, padding, axes) self.probabilities_r = self.probabilities.reshape( (self.watershed.size, -1))
def assign_gt_to_ws(self, gt): ws_nopad = morpho.juicy_center(self.watershed, self.pad_thickness) bdrymap = morpho.pad(morpho.seg_to_bdry(ws_nopad), [0]*self.pad_thickness) gt_bdrymap_nopad = morpho.seg_to_bdry(gt) gt_bdrymap = morpho.pad(gt_bdrymap_nopad, [0]*self.pad_thickness) k = distance_transform_cdt(1-bdrymap, return_indices=True) ind = nonzero(gt_bdrymap.ravel())[0] closest_sub = numpy.concatenate( [i.ravel()[:,newaxis] for i in k[1]],axis=1) closest_sub = closest_sub[ind,:] closest_ind = [dot(bdrymap.strides, i)/bdrymap.itemsize for i in closest_sub] M = zeros_like(bdrymap).astype(float) M.ravel()[closest_ind]=1.0 bdrymap.ravel()[closest_ind] = False k = distance_transform_cdt(1-bdrymap, return_indices=True) ind = nonzero(gt_bdrymap.ravel())[0] closest_sub = numpy.concatenate( [i.ravel()[:,newaxis] for i in k[1]],axis=1) closest_sub = closest_sub[ind,:] closest_ind = [dot(bdrymap.strides, i)/bdrymap.itemsize for i in closest_sub] M.ravel()[closest_ind]=1.0 return M
def set_probabilities(self, probs=array([]), normalize=False): if len(probs) == 0: self.probabilities = zeros_like(self.watershed) self.probabilities_r = self.probabilities.ravel() probs = probs.astype(double) if normalize and len(probs) > 1: probs -= probs.min() # ensure probs.min() == 0 probs /= probs.max() # ensure probs.max() == 1 sp = probs.shape sw = tuple(array(self.watershed.shape, dtype=int)-\ 2*self.pad_thickness*ones(self.watershed.ndim, dtype=int)) p_ndim = probs.ndim w_ndim = self.watershed.ndim padding = [inf]+(self.pad_thickness-1)*[0] if p_ndim == w_ndim: self.probabilities = morpho.pad(probs, padding) self.probabilities_r = self.probabilities.ravel()[:,newaxis] elif p_ndim == w_ndim+1: if sp[1:] == sw: sp = sp[1:]+[sp[0]] probs = probs.transpose(sp) axes = range(p_ndim-1) self.probabilities = morpho.pad(probs, padding, axes) self.probabilities_r = self.probabilities.reshape( (self.watershed.size, -1))
def build_border(self, supervoxels1, prediction1, supervoxels2, prediction2, mask1, mask2, reset_edges): self.init_build(supervoxels1, prediction1) self.init_build2(supervoxels2, prediction2) if mask1 is not None and mask2 is not None: mask1 = morpho.pad(mask1, 0) mask1 = mask1.astype(numpy.double) mask2 = morpho.pad(mask2, 0) mask2 = mask2.astype(numpy.double) # use masks to handle 0 cases neuroproof.init_masks(self.stack, mask1, mask2) self.stack.build_rag_border(reset_edges)
def set_orientations(self, orientation_map, channel_is_oriented): if len(orientation_map) == 0: self.orientation_map = zeros_like(self.watershed) self.orientation_map_r = self.orientation_map.ravel() so = orientation_map.shape sw = tuple(array(self.watershed.shape, dtype=int)-\ 2*self.pad_thickness*ones(self.watershed.ndim, dtype=int)) o_ndim = orientation_map.ndim w_ndim = self.watershed.ndim padding = [0] + (self.pad_thickness - 1) * [0] self.orientation_map = morpho.pad(orientation_map, padding).astype(int) self.orientation_map_r = self.orientation_map.ravel() if channel_is_oriented is None: nchannels = 1 if self.probabilities.ndim==self.watershed.ndim \ else self.probabilities.shape[-1] self.channel_is_oriented = array([False] * nchannels) self.max_probabilities_r = zeros_like(self.probabilities_r) self.oriented_probabilities_r = zeros_like(self.probabilities_r) self.non_oriented_probabilities_r = self.probabilities_r else: self.channel_is_oriented = channel_is_oriented self.max_probabilities_r = \ self.probabilities_r[:, self.channel_is_oriented].max(axis=1) self.oriented_probabilities_r = \ self.probabilities_r[:, self.channel_is_oriented] self.oriented_probabilities_r = \ self.oriented_probabilities_r[ range(len(self.oriented_probabilities_r)), self.orientation_map_r] self.non_oriented_probabilities_r = \ self.probabilities_r[:, ~self.channel_is_oriented]
def set_orientations(self, orientation_map, channel_is_oriented): if len(orientation_map) == 0: self.orientation_map = zeros_like(self.watershed) self.orientation_map_r = self.orientation_map.ravel() so = orientation_map.shape sw = tuple(array(self.watershed.shape, dtype=int)-\ 2*self.pad_thickness*ones(self.watershed.ndim, dtype=int)) o_ndim = orientation_map.ndim w_ndim = self.watershed.ndim padding = [0]+(self.pad_thickness-1)*[0] self.orientation_map = morpho.pad(orientation_map, padding).astype(int) self.orientation_map_r = self.orientation_map.ravel() if channel_is_oriented is None: nchannels = 1 if self.probabilities.ndim==self.watershed.ndim \ else self.probabilities.shape[-1] self.channel_is_oriented = array([False]*nchannels) self.max_probabilities_r = zeros_like(self.probabilities_r) self.oriented_probabilities_r = zeros_like(self.probabilities_r) self.non_oriented_probabilities_r = self.probabilities_r else: self.channel_is_oriented = channel_is_oriented self.max_probabilities_r = \ self.probabilities_r[:, self.channel_is_oriented].max(axis=1) self.oriented_probabilities_r = \ self.probabilities_r[:, self.channel_is_oriented] self.oriented_probabilities_r = \ self.oriented_probabilities_r[ range(len(self.oriented_probabilities_r)), self.orientation_map_r] self.non_oriented_probabilities_r = \ self.probabilities_r[:, ~self.channel_is_oriented]
def init_build2(self, watershed, probabilities): watershed = morpho.pad(watershed, 0) watershed = watershed.astype(numpy.double) neuroproof.reinit_stack2(self.stack, watershed) probabilities = probabilities.astype(numpy.double) num_channels = 1 if self.single_channel: probabilities = morpho.pad(probabilities, 0) neuroproof.add_prediction_channel2(self.stack, probabilities) else: num_channels = probabilities.shape[probabilities.ndim - 1] for channel in range(0, num_channels): curr_prob = morpho.pad(probabilities[..., channel], 0) neuroproof.add_prediction_channel2(self.stack, curr_prob)
def init_build2(self, watershed, probabilities): watershed = morpho.pad(watershed, 0) watershed = watershed.astype(numpy.double) neuroproof.reinit_stack2(self.stack, watershed) probabilities = probabilities.astype(numpy.double) num_channels = 1 if self.single_channel: probabilities = morpho.pad(probabilities, 0) neuroproof.add_prediction_channel2(self.stack, probabilities) else: num_channels = probabilities.shape[probabilities.ndim-1] for channel in range(0,num_channels): curr_prob = morpho.pad(probabilities[...,channel], 0) neuroproof.add_prediction_channel2(self.stack, curr_prob)
def remove_merged_boundaries(ar): import morpho arp = morpho.pad(ar, [0,ar.max()+1]) arpr = arp.ravel() zero_idxs = (arpr == 0).nonzero()[0] ns = arpr[morpho.get_neighbor_idxs(arp, zero_idxs)] ns_compl = ns.copy() ns_compl[ns==0] = ns.max()+1 merged_boundaries = (ns.max(axis=1) == ns_compl.min(axis=1)).nonzero()[0] arpr[zero_idxs[merged_boundaries]] = ns.max(axis=1)[merged_boundaries] return morpho.juicy_center(arp, 2)
def remove_merged_boundaries(ar): import morpho arp = morpho.pad(ar, [0, ar.max() + 1]) arpr = arp.ravel() zero_idxs = (arpr == 0).nonzero()[0] ns = arpr[morpho.get_neighbor_idxs(arp, zero_idxs)] ns_compl = ns.copy() ns_compl[ns == 0] = ns.max() + 1 merged_boundaries = (ns.max(axis=1) == ns_compl.min(axis=1)).nonzero()[0] arpr[zero_idxs[merged_boundaries]] = ns.max(axis=1)[merged_boundaries] return morpho.juicy_center(arp, 2)
def set_watershed(self, ws=array([]), lowmem=False, connectivity=1): try: self.boundary_body = ws.max()+1 except ValueError: # empty watershed given self.boundary_body = -1 self.volume_size = ws.size self.has_zero_boundaries = (ws==0).any() if self.has_zero_boundaries: self.watershed = morpho.pad(ws, [0, self.boundary_body]) else: self.watershed = morpho.pad(ws, self.boundary_body) self.segmentation = self.watershed.copy() self.watershed_r = self.watershed.ravel() self.segmentation_r = self.segmentation.ravel() # reduce fct calls self.pad_thickness = 2 if (self.segmentation==0).any() else 1 if lowmem: def neighbor_idxs(x): return self.get_neighbor_idxs_lean(x, connectivity) self.neighbor_idxs = neighbor_idxs else: self.pixel_neighbors = \ morpho.build_neighbors_array(self.watershed, connectivity) self.neighbor_idxs = self.get_neighbor_idxs_fast
def set_ground_truth(self, gt=None): if gt is not None: gtm = gt.max() + 1 gt_ignore = [0, gtm] if (gt == 0).any() else [gtm] seg_ignore = [0, self.boundary_body] if \ (self.segmentation==0).any() else [self.boundary_body] self.gt = morpho.pad(gt, gt_ignore) self.rig = contingency_table(self.segmentation, self.gt) self.rig[:, gt_ignore] = 0 self.rig[seg_ignore, :] = 0 else: self.gt = None # null pattern to transparently allow merging of nodes. # Bonus feature: counts how many sp's went into a single node. try: self.rig = ones(self.watershed.max() + 1) except ValueError: self.rig = ones(self.number_of_nodes() + 1)
def set_ground_truth(self, gt=None): if gt is not None: gtm = gt.max()+1 gt_ignore = [0, gtm] if (gt==0).any() else [gtm] seg_ignore = [0, self.boundary_body] if \ (self.segmentation==0).any() else [self.boundary_body] self.gt = morpho.pad(gt, gt_ignore) self.rig = contingency_table(self.segmentation, self.gt) self.rig[:, gt_ignore] = 0 self.rig[seg_ignore, :] = 0 else: self.gt = None # null pattern to transparently allow merging of nodes. # Bonus feature: counts how many sp's went into a single node. try: self.rig = ones(self.watershed.max()+1) except ValueError: self.rig = ones(self.number_of_nodes()+1)