Active Mask - 图像分割

数据挖掘 Python
2022-03-10 02:00:59

我正在尝试实现一个从主动掩码分割派生的主动掩码代码,用于 hela 细胞图像的细胞体积计算和高尔基体分割,Srinivasa et al 2008

我找到了一个允许我这样做的代码,但是,有一段代码给了我错误,我不知道为什么。这是代码的一部分:

def _converge(P, R, b, max_iters_converge=1000):
    Pm = numpy.empty(P.shape, numpy.float32)  # Pre-allocate: saves time
    argmax = numpy.zeros_like(P)
    maxval = numpy.zeros(P.shape, numpy.float32)
    for i in range(max_iters_converge):
        maxval *= 0
        maxval -= 1e8
        for m in range(int(P.max()) + 1):
            Pm[:, :] = (P == m)
            Pm = ndimage.gaussian_filter(Pm, b) + R[m]  
 # Pm=ndimage.convolve(Pm,numpy.ones((2*b+1,2*b+1)))+R[m]
            argmax[maxval < Pm] = m
            maxval = maxval * (argmax != m) + (argmax == m) * Pm
        if (P == argmax).all(): break
        P = argmax.copy()
    mis = defaultdict(range(1, P.max() + 1).__iter__().__next__())
    mis[0] = 0  # set 0 to 0, because it is special
    for i in range(P.size):
        P.flat[i] = mis[P.flat[i]]
    return P

给我最大问题的领域是:

mis = defaultdict(range(1, P.max() + 1).__iter__().__next__())

最初代码是为 Python 2.4 编写的,但我做了一些更改,以便它可以在 Python 3.6 上运行,但我真的不明白defaultdict它的用途。

这是完整原始源文件的链接:active mask

1个回答

defaultdict这种情况下,每次在 中遇到新元素时都返回下一个递增的整数P.flat()但是每次再次找到相同的元素时也返回相同的整数。您应该遇到以下错误:

TypeError:第一个参数必须是可调用的或无

defaultdict期望一个可调用的。每次查找未命中时,它将调用传入的函数,并将 设置dict为该值。要修复该错误,您需要()__next__()离开中删除:

mis = defaultdict(range(1, P.max() + 1).__iter__().__next__)

然而,这对于它正在做的事情来说过于复杂,并且可以通过认识到没有理由在 中设置上限来简化一点range,它只是一个递增的整数,可以用itertools.count()liike 来完成:

import itertools as it
mis = defaultdict(it.count(1).__next__)