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 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 show_merge_3D(g, n1, n2, **kwargs): im = kwargs.get('image', None) alpha = kwargs.get('alpha', 0.5) fignum = kwargs.get('fignum', 10) bdr = np.zeros(g.segmentation.shape, np.uint8) bdri = list(g[n1][n2]['boundary']) bdr.ravel()[bdri] = 3 bdr.ravel()[list(g.node[n1]['extent'])] = 1 bdr.ravel()[list(g.node[n2]['extent'])] = 2 bdr = morpho.juicy_center(bdr, g.pad_thickness) x, y, z = np.array(center_of_mass(bdr == 3)).round().astype(np.uint32) fig = plt.figure(fignum) bdr_cmapped = jet_transparent(bdr, alpha) plt.subplot(221) imshow_grey(im[:, :, z]) \ plt.imshow(bdr_cmapped[:,:,z], interpolation='nearest') plt.subplot(222) imshow_grey(im[:, y, :]) \ plt.imshow(bdr_cmapped[:,y,:], interpolation='nearest') plt.subplot(223) imshow_grey(im[x, :, :]) \ plt.imshow(bdr_cmapped[x,:,:], interpolation='nearest') plt.subplot(224) _ = plt.hist(g.probabilities_r[bdri][:, 0], bins=25) return bdr, (x, y, z)
def build_volume(self, nbunch=None): """Return the segmentation (numpy.ndarray) induced by the graph.""" v = zeros_like(self.watershed) vr = v.ravel() if nbunch is None: nbunch = self.nodes() for n in nbunch: vr[list(self.node[n]['extent'])] = n return morpho.juicy_center(v, self.pad_thickness)
def build_volume(self, nbunch=None): """Return the segmentation (numpy.ndarray) induced by the graph.""" v = zeros_like(self.watershed) vr = v.ravel() if nbunch is None: nbunch = self.nodes() for n in nbunch: vr[list(self.node[n]['extent'])] = n return morpho.juicy_center(v,self.pad_thickness)
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 build_boundary_map(self, ebunch=None): if len(self.merge_queue) == 0: self.rebuild_merge_queue() m = zeros(self.watershed.shape, double) mr = m.ravel() if ebunch is None: ebunch = self.real_edges_iter() ebunch = sorted([(self[u][v]['weight'], u, v) for u, v in ebunch]) for w, u, v in ebunch: b = list(self[u][v]['boundary']) mr[b] = w if hasattr(self, 'ignored_boundary'): m[self.ignored_boundary] = inf return morpho.juicy_center(m, self.pad_thickness)
def show_merge_3D(g, n1, n2, **kwargs): im = kwargs.get('image', None) alpha = kwargs.get('alpha', 0.5) fignum = kwargs.get('fignum', 10) bdr = np.zeros(g.segmentation.shape, np.uint8) bdri = list(g[n1][n2]['boundary']) bdr.ravel()[bdri] = 3 bdr.ravel()[list(g.node[n1]['extent'])] = 1 bdr.ravel()[list(g.node[n2]['extent'])] = 2 bdr = morpho.juicy_center(bdr, g.pad_thickness) x, y, z = np.array(center_of_mass(bdr==3)).round().astype(np.uint32) fig = plt.figure(fignum) bdr_cmapped = jet_transparent(bdr, alpha) plt.subplot(221); imshow_grey(im[:,:,z]); \ plt.imshow(bdr_cmapped[:,:,z], interpolation='nearest') plt.subplot(222); imshow_grey(im[:,y,:]); \ plt.imshow(bdr_cmapped[:,y,:], interpolation='nearest') plt.subplot(223); imshow_grey(im[x,:,:]); \ plt.imshow(bdr_cmapped[x,:,:], interpolation='nearest') plt.subplot(224); _ = plt.hist(g.probabilities_r[bdri][:,0], bins=25) return bdr, (x,y,z)
thickness = args.thickness zcrop1 = [0, thickness] overlaps = [2**i + 1 for i in range(1, 8)] results_table = zeros([len(args.thresholds), len(range(1, 8))], dtype=bool) for j, overlap in enumerate(overlaps): zcrop2 = [thickness - overlap, 2 * thickness - overlap] # pdb.set_trace() probs1, ws1 = crop_probs_and_ws(args.xy_crop + zcrop1, probs, ws) probs2, ws2 = crop_probs_and_ws(args.xy_crop + zcrop2, probs, ws) g1 = Rag(ws1, probs1, show_progress=args.show_progress, lowmem=args.low_memory) g2 = Rag(ws2, probs2, show_progress=args.show_progress, lowmem=args.low_memory) for i, t in enumerate(args.thresholds): g1.agglomerate(t) g2.agglomerate(t) results_table[i, j] = (juicy_center( g1.segmentation, 2)[..., -overlap / 2].astype(bool) == juicy_center( g2.segmentation, 2)[..., overlap / 2].astype(bool)).all() savetxt('debug.txt', results_table, delimiter='\t') results_table = hstack([array(args.thresholds)[:, newaxis], results_table]) results_table = \ vstack([array([0]+overlaps), results_table, results_table.all(axis=0)]) savetxt(args.fout, results_table, delimiter='\t', fmt='%i')
probs = median_filter(probs, 3) elif args.gaussian_filter is not None: probs = gaussian_filter(probs, args.gaussian_filter) if args.watershed is None: args.watershed = watershed(probs, show_progress=args.show_progress) ws = args.watershed thickness = args.thickness zcrop1 = [0, thickness] overlaps = [2 ** i + 1 for i in range(1, 8)] results_table = zeros([len(args.thresholds), len(range(1, 8))], dtype=bool) for j, overlap in enumerate(overlaps): zcrop2 = [thickness - overlap, 2 * thickness - overlap] # pdb.set_trace() probs1, ws1 = crop_probs_and_ws(args.xy_crop + zcrop1, probs, ws) probs2, ws2 = crop_probs_and_ws(args.xy_crop + zcrop2, probs, ws) g1 = Rag(ws1, probs1, show_progress=args.show_progress, lowmem=args.low_memory) g2 = Rag(ws2, probs2, show_progress=args.show_progress, lowmem=args.low_memory) for i, t in enumerate(args.thresholds): g1.agglomerate(t) g2.agglomerate(t) results_table[i, j] = ( juicy_center(g1.segmentation, 2)[..., -overlap / 2].astype(bool) == juicy_center(g2.segmentation, 2)[..., overlap / 2].astype(bool) ).all() savetxt("debug.txt", results_table, delimiter="\t") results_table = hstack([array(args.thresholds)[:, newaxis], results_table]) results_table = vstack([array([0] + overlaps), results_table, results_table.all(axis=0)]) savetxt(args.fout, results_table, delimiter="\t", fmt="%i")
def get_ucm(self): if hasattr(self, 'ignored_boundary'): self.ucm[self.ignored_boundary] = self.max_merge_score return morpho.juicy_center(self.ucm, self.pad_thickness)
def get_segmentation(self): return morpho.juicy_center(self.segmentation, self.pad_thickness)