def hesseig(im, res, sz, nstds, orthstep, nrm=None): d2dx2 = get_hessian_kernels(res, sz, nstds, orthstep) if nrm is not None: d2dx2 = list(d2dx2[i] / np.abs(d2dx2[i]).sum() * nrm[i] for i in range(len(d2dx2))) pad = tuple((p, p) for p in np.divide(np.max(list(k.shape for k in d2dx2), 0), 2)) im_pad = np.pad(im, pad, "edge").astype(float) retval = ndshm.zeros((len(d2dx2),) + im_pad.shape) im_pad = ndshm.fromndarray(im_pad) Parallel()(delayed(add_out_arg(spsig.fftconvolve))(im_pad, k, "same", out=retval[i]) for i, k in enumerate(d2dx2)) retval = np.copy(retval) im_pad = np.copy(im_pad) d2dx2 = np.empty((len(res),) * 2 + im.shape) for ind, (i, j) in enumerate(np.transpose(np.triu_indices(len(res)))): d2dx2[i, j] = d2dx2[j, i] = unpad(retval[ind], pad) # eigen axes = tuple(range(len(res) + 2)) d2dx2 = np.transpose(d2dx2, axes[2:] + axes[:2]) retval = ndshm.zeros(d2dx2.shape[:-1]) d2dx2 = ndshm.fromndarray(d2dx2) Parallel()(delayed(add_out_arg(np.linalg.eigvalsh))(d2dx2[i], out=retval[i]) for i in range(len(d2dx2))) retval = np.copy(retval) d2dx2 = np.concatenate(list(a[None, ...] for a in retval)) return d2dx2
def hesseig(im, res, sz, nstds, orthstep, nrm=None): d2dx2 = get_hessian_kernels(res, sz, nstds, orthstep) if nrm is not None: d2dx2 = list(d2dx2[i] / np.abs(d2dx2[i]).sum() * nrm[i] for i in range(len(d2dx2))) pad = tuple( (p, p) for p in np.divide(np.max(list(k.shape for k in d2dx2), 0), 2)) im_pad = np.pad(im, pad, 'edge').astype(float) retval = ndshm.zeros((len(d2dx2), ) + im_pad.shape) im_pad = ndshm.fromndarray(im_pad) Parallel()(delayed(add_out_arg(spsig.fftconvolve))( im_pad, k, 'same', out=retval[i]) for i, k in enumerate(d2dx2)) retval = np.copy(retval) im_pad = np.copy(im_pad) d2dx2 = np.empty((len(res), ) * 2 + im.shape) for ind, (i, j) in enumerate(np.transpose(np.triu_indices(len(res)))): d2dx2[i, j] = d2dx2[j, i] = unpad(retval[ind], pad) # eigen axes = tuple(range(len(res) + 2)) d2dx2 = np.transpose(d2dx2, axes[2:] + axes[:2]) retval = ndshm.zeros(d2dx2.shape[:-1]) d2dx2 = ndshm.fromndarray(d2dx2) Parallel()( delayed(add_out_arg(np.linalg.eigvalsh))(d2dx2[i], out=retval[i]) for i in range(len(d2dx2))) retval = np.copy(retval) d2dx2 = np.concatenate(list(a[None, ...] for a in retval)) return d2dx2
def skeleton(seg): skel, dist = skmorph.medial_axis(seg, return_distance=True) node, edge, leaf = (spim.label(g, np.ones((3, 3), bool))[0] for g in skel2graph(skel)) trim_edge = (edge != 0) & ~(skmorph.binary_dilation(node != 0, np.ones((3, 3), bool)) != 0) trim_edge = spim.label(trim_edge, np.ones((3, 3), bool))[0] leaf_edge_vals = skmorph.binary_dilation(leaf != 0, np.ones((3, 3), bool)) != 0 leaf_edge_vals = np.unique(trim_edge[leaf_edge_vals]) leaf_edge_vals = leaf_edge_vals[leaf_edge_vals > 0] leaf_edge = leaf != 0 trim_edge = ndshm.fromndarray(trim_edge) leaf_edge = ndshm.fromndarray(leaf_edge) Parallel()(delayed(set_msk)(leaf_edge, trim_edge, l) for l in leaf_edge_vals) trim_edge = np.copy(trim_edge) leaf_edge = np.copy(leaf_edge) leaf_edge[(skmorph.binary_dilation(leaf_edge, np.ones((3, 3), bool)) != 0) & (edge != 0)] = True leaf_edge = spim.label(leaf_edge, np.ones((3, 3), bool))[0] leaf_edge_node = skmorph.binary_dilation(leaf_edge != 0, np.ones((3, 3), bool)) != 0 leaf_edge_node = ((node != 0) & leaf_edge_node) | leaf_edge leaf_edge_node = spim.label(leaf_edge_node, np.ones((3, 3), bool))[0] cand_node = leaf_edge_node * (node != 0) cand_node = cand_node.nonzero() cand_node = np.transpose((leaf_edge_node[cand_node],) + cand_node + (2 * dist[cand_node],)) cand_leaf = leaf_edge_node * (leaf != 0) cand_leaf = cand_leaf.nonzero() cand_leaf = np.transpose((leaf_edge_node[cand_leaf],) + cand_leaf) if len(cand_node) > 0 and len(cand_leaf) > 0: cand_leaf = ndshm.fromndarray(cand_leaf) cand_node = ndshm.fromndarray(cand_node) pruned = Parallel()(delayed(prune_leaves)(cand_leaf, cand_node, j) for j in np.unique(cand_node[:, 0])) cand_leaf = np.copy(cand_leaf) cand_node = np.copy(cand_node) pruned_ind = [] for p in pruned: pruned_ind.extend(p) pruned_ind = tuple(np.transpose(pruned_ind)) pruned = ~skel pruned = ndshm.fromndarray(pruned) leaf_edge = ndshm.fromndarray(leaf_edge) Parallel()(delayed(set_msk)(pruned, leaf_edge, l) for l in np.unique(leaf_edge[pruned_ind])) pruned = np.copy(pruned) leaf_edge = np.copy(leaf_edge) pruned = ~pruned else: pruned = skel return pruned
def skeleton(seg): skel, dist = skmorph.medial_axis(seg, return_distance=True) node, edge, leaf = (spim.label(g, np.ones((3, 3), bool))[0] for g in skel2graph(skel)) trim_edge = (edge != 0) & ~(skmorph.binary_dilation(node != 0, np.ones( (3, 3), bool)) != 0) trim_edge = spim.label(trim_edge, np.ones((3, 3), bool))[0] leaf_edge_vals = skmorph.binary_dilation(leaf != 0, np.ones( (3, 3), bool)) != 0 leaf_edge_vals = np.unique(trim_edge[leaf_edge_vals]) leaf_edge_vals = leaf_edge_vals[leaf_edge_vals > 0] leaf_edge = leaf != 0 trim_edge = ndshm.fromndarray(trim_edge) leaf_edge = ndshm.fromndarray(leaf_edge) Parallel()(delayed(set_msk)(leaf_edge, trim_edge, l) for l in leaf_edge_vals) trim_edge = np.copy(trim_edge) leaf_edge = np.copy(leaf_edge) leaf_edge[(skmorph.binary_dilation(leaf_edge, np.ones((3, 3), bool)) != 0) & (edge != 0)] = True leaf_edge = spim.label(leaf_edge, np.ones((3, 3), bool))[0] leaf_edge_node = skmorph.binary_dilation(leaf_edge != 0, np.ones((3, 3), bool)) != 0 leaf_edge_node = ((node != 0) & leaf_edge_node) | leaf_edge leaf_edge_node = spim.label(leaf_edge_node, np.ones((3, 3), bool))[0] cand_node = leaf_edge_node * (node != 0) cand_node = cand_node.nonzero() cand_node = np.transpose((leaf_edge_node[cand_node], ) + cand_node + (2 * dist[cand_node], )) cand_leaf = leaf_edge_node * (leaf != 0) cand_leaf = cand_leaf.nonzero() cand_leaf = np.transpose((leaf_edge_node[cand_leaf], ) + cand_leaf) if len(cand_node) > 0 and len(cand_leaf) > 0: cand_leaf = ndshm.fromndarray(cand_leaf) cand_node = ndshm.fromndarray(cand_node) pruned = Parallel()(delayed(prune_leaves)(cand_leaf, cand_node, j) for j in np.unique(cand_node[:, 0])) cand_leaf = np.copy(cand_leaf) cand_node = np.copy(cand_node) pruned_ind = [] for p in pruned: pruned_ind.extend(p) pruned_ind = tuple(np.transpose(pruned_ind)) pruned = ~skel pruned = ndshm.fromndarray(pruned) leaf_edge = ndshm.fromndarray(leaf_edge) Parallel()(delayed(set_msk)(pruned, leaf_edge, l) for l in np.unique(leaf_edge[pruned_ind])) pruned = np.copy(pruned) leaf_edge = np.copy(leaf_edge) pruned = ~pruned else: pruned = skel return pruned