Beispiel #1
0
 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
Beispiel #2
0
    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
Beispiel #3
0
 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))
Beispiel #4
0
 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 
Beispiel #5
0
 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))
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
 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]
Beispiel #9
0
 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]
Beispiel #10
0
    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)
Beispiel #11
0
    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)
Beispiel #12
0
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)
Beispiel #13
0
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)
Beispiel #14
0
 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
Beispiel #15
0
 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)
Beispiel #16
0
 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)