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

2024-09-29 21:55:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题。假设我有一个三维数组,其中充满了标记的对象。这意味着,整个数组充满了零,但每个标记的对象都是该数组中二维切片中唯一的连接数。在我的例子中,它们只是阵列中每个z级别上的二维标记圆,分布在一个三维房间(阵列)中。现在我必须计算所有这些标记对象之间的交集或并集,以便在z方向找到那些IOU高于特定阈值的标记对象,从而标记具有相同编号的对象。这是因为堆栈是一个时间堆栈,每个切片是另一个时间点。圆形物体可以移动一点,并且随着时间(z方向)改变大小。堆栈的标签错误,因此一直相同的对象没有相同的标签。因此,为了完全正确,我必须从一个时间点到另一个时间点,检查从那个时间点到下一个时间点的对象之间的IOU,我计算数组中所有标签在第三维度的每个切片上的并集的交集。这非常慢。事实上,如果我只需要比较那些有共同索引的标签,速度会快得多。是否有一个快速的numpy scipy来比较那些在第三维度中连接的标签?也许有什么方法可以解决这个问题?你知道吗

以下是标签如何合并到三维阵列中的示例图片:

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

Tags: 对象标记np时间切片标签数组例子

热门问题