gpt4 book ai didi

python - OpenCV/numpy : Quickly comparing a large number of contour objects using numpy

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:42 24 4
gpt4 key购买 nike

我从 1024x1024 显微镜图像的 z 堆栈中识别出许多轮廓对象。每个 z 步包含大约 10000-40000 个轮廓。轮廓平均为 4 个像素。

我想做的是确定多个 z 平面上存在哪些轮廓(当图像重叠时它们相互接触)以及它们的 3 维区域是什么。我可以(大约)完成此操作,但代码非常慢且内存非常大(我正在为一台 32GB RAM 的计算机加满)。

我目前的做法如下:

  1. 将每个轮廓的所有内部点转储到一个巨大的列表中,并制作一个索引列表以配合它。

  2. 像这样对 x 和 y 进行二进制比较:

    x_intersections=np.array(np.equal(np.matrix(z1[:,0]).T,z2[:,0]))
    y_intersections=np.array(np.equal(np.matrix(z1[:,1]).T,z2[:,1]))
    intersections=x_intersections*y_intersections
  3. 重新索引原始列表以确定哪些点在 Z 步中匹配。

  4. 确定音量。

我主要对第 2 步感到好奇,这是一种更快的方法吗?我试过使用稀疏数组或使用 np.in1d() 一次运行每个轮廓,但似乎都没有运行得更快。我之前尝试过内置点比较工具的 OpenCVs,但它似乎不是很快。

此外,有没有一种方法可以不必将 40000x40000 矩阵拉入 RAM(因为它需要大量 RAM),是否有一种合理且快速的方法来对这些列表进行分段?有没有一种巧妙的方法可以使用 numpy 对数组的一部分而不是对整个数组进行一次操作?有没有一种有效的方法可以暂时从 RAM 转储到磁盘上?这将使我能够同时在更多计算机上运行它,从而大大减少运行时间。

这是一个可以从 numba 的 AutoJIT 中获益的问题吗?还是烈焰?还是派皮?是否有我不知道的类似工具可以在这里使用?

更广泛地说,我是不是在做傻事?我的方法是不是解决这个问题的错误方法?

有时我有 20 个 z 步长、3 个 channel 和 100 多张图像,因此即使每次比较需要 10 秒的代码最终也会花费每张图像一个小时(大约我现在拥有的位置)。我可以将它分布在一些服务器上以加快速度,但我真的很想尽可能降低它的速度。

这里是一些模拟大概情况的python代码:

z1=[]
i=0
while i<20000:
temp=np.array([[[1,1]],[[1,2]],[[2,1]],[[2,2]]])+np.round(np.random.rand(1,1,2)*1024)
z1.append(temp.astype(int))
i+=1
z2=z1[1:10000]
i=0
while i<10000:
temp=np.array([[[1,1]],[[1,2]],[[2,1]],[[2,2]]])+np.round(np.random.rand(1,1,2)*1024)
z2.append(temp.astype(int))
i+=1
random.shuffle(z2)

(我的等高线不是全长 4,有些长一些,有些短一些,但这应该足够接近演示了)

然后我通过近似代码将它们转储为数组:

output=(0,0)
index_list=(0,0)
for itemsN,items in enumerate(z1):
output=np.vstack([output,items.squeeze()])
index_list=np.vstack([index_list,np.ones((len(items),1))*itemsN])
output=np.delete(output,0,0)
index_list=np.delete(index_list,0)

然后我使用上面在第 2 步中列出的代码将列表组合在一起(这是缓慢的部分并且是一个巨大的内存消耗,如果你运行它可能会导致内存错误)并使用索引列表找出属于一起的轮廓对。

最佳答案

以下是一些建议(基于我对您问题的理解。如果这不是您想要的,请告诉我)。

  1. 要比较两个轮廓,您可以使用 cv2.matchShapes() OpenCV 中的函数。
  2. 或者您可以计算所有轮廓的一些特征,如面积、周长、质心等。然后先比较它们。仅当它们匹配时,才比较整个轮廓。具有相同质心和面积的两个轮廓很可能是相同的轮廓,因此您可以将这些轮廓作为一个整体进行比较,其他您可以忽略,这会给您一些速度。

关于python - OpenCV/numpy : Quickly comparing a large number of contour objects using numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21765161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com