查找图像中所有像素对之间的距离

时间:2020-11-04 15:54:10

标签: python performance numpy linear-algebra

问题

我有一个numpy.array形状的(H, W),用于存储图像的像素强度。我想生成一个形状为(H, W, H, W)的新数组,该数组存储图像中每对像素之间的欧几里得距离(像素之间的“空间”距离;而不是它们的强度差异)。

解决方案尝试

以下方法完全可以实现我想要的功能,但是速度很慢。我正在寻找一种快速的方法。

d = numpy.zeros((H, W, H, W)) # array to store distances.
for x1 in range(H):
    for y1 in range(W):
        for x2 in range(H):
            for y2 in range(W):
                d[x1, y1, x2, y2] = numpy.sqrt( (x2-x1)**2 + (y2-y1)**2 )

其他详细信息

这是我的问题的更多详细信息。对于上面较简单的问题,一个解决方案可能足以让我找出其余的问题。

  • 就我而言,该图像实际上是3D医学图像(即形状为numpy.array的{​​{1}})。
  • 3D像素可能不是立方的(例如,每个像素可能代表1mm x 2mm x 3mm的体积)。

1 个答案:

答案 0 :(得分:2)

我们可以使用1Dnp.ogrid范围内的数组设置开放式网格,可以对矢量化解决方案使用相同的迭代器符号进行操作,这将利用broadcasting来提高性能。提升:

X1,Y1,X2,Y2 = np.ogrid[:H,:W,:H,:W]
d_out = numpy.sqrt( (X2-X1)**2 + (Y2-Y1)**2 )

要保存在两个打开的网格中:

X,Y = np.ogrid[:H,:W]
d_out = numpy.sqrt( (X[:,:,None,None]-X)**2 + (Y[:,:,None,None]-Y)**2 )

如果我们正在处理大型阵列,请考虑使用numexpr来进一步提高:

import numexpr as ne

d_out = ne.evaluate('sqrt( (X2-X1)**2 + (Y2-Y1)**2 )')
相关问题