Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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