Python:在数组的第三维中查找所有连接标签的最快方法

时间:2018-03-21 00:15:19

标签: python numpy scipy

我有以下问题。让我们假设我有一个3D数组,其中充满了标记对象。这意味着,整个数组充满了零,但每个标记的对象在该数组中是2d切片中的唯一连接数。在我的例子中,它们只是数组的每个z级别中的2D标记圆圈,分布在3d房间(数组)中。 现在我必须计算所有这些标记对象之间的并集交集,以便在z方向上找到IOU高于特定阈值的标记对象,以标记具有相同数字的对象。这是因为堆栈是时间堆栈,每个切片是另一个时间点。圆形物体可以移动一点点并随时间(z方向)改变大小。堆栈标记错误,因此随时间变化的对象不具有相同的标签。因此,为了使其绝对正确,我将不得不从时间点到时间点并检查从该时间点到下一个时间点的对象之间的IOU。我计算第三维中每个切片的该数组中所有标签之间的交集。 这非常慢。事实上,如果我只需要比较那些具有共同索引的标签,它会快得多。是否有一个快速的numpy scipy只比较那些在第三维连接的标签?也许有一些方法来处理这些问题?

以下是如何在3d数组中合并标签的示例图片:

enter image description here

我目前的代码如下所示。 在此示例中我没有标记对象,因为在我的实际情况中,我将已标记的图像导入为数组,并且我不知道如何使用随机标签填充数组:

import numpy as np
a = np.zeros((6, 2969, 3876))
for i in range(len(a)-1):
    labelnumbers = np.unique(a[i])

    #delete the zero number from labelnumbers becaus background should not be compared

    labelnumbers = np.delete(labelnumbers,0)

    labelnumbers2 = np.unique(a[i+1])
    labelnumbers2 = np.delete(labelnumbers2,0)
    for labelnumber in labelnumbers:        
        component1 = np.copy(a[i])
        component1[component1!=labelnumber] = 0
        component1[component1==labelnumber] = 1        
        component1 = component1.astype(bool)
        for labelnumber2 in labelnumbers2:
            print('component1:',labelnumber,'compoent2',labelnumber2)
            component2 = np.copy(a[i+1])
            component2[component2!=labelnumber2] = 0
            component2[component2==labelnumber2] = 1
            component2 = component2.astype(bool)
            overlap = (component1*component2).sum() # Logical AND
            if overlap>0:
                union = float((component1 + component2).sum()) # Logical OR
                IOU = overlap/union # Treats "True" as 1,
                if IOU > 0.33:
                    a[i+1][a[i+1]==labelnumber2] = labelnumber
            else:
                pass

0 个答案:

没有答案