查找图像中所有像素对之间的距离
Find distance between all pairs of pixels in an image
问题
我有一个 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 医学图像(即形状
(H, W, D)
的 numpy.array
)。
- 3D 像素可能不是立方体(例如,每个像素可能代表 1mm x 2mm x 3mm 的体积)。
我们可以使用 np.ogrid
设置具有 1D
范围数组的开放网格,这可以在矢量化解决方案的相同迭代器符号中进行操作,这将利用 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 )')
问题
我有一个 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 医学图像(即形状
(H, W, D)
的numpy.array
)。 - 3D 像素可能不是立方体(例如,每个像素可能代表 1mm x 2mm x 3mm 的体积)。
我们可以使用 np.ogrid
设置具有 1D
范围数组的开放网格,这可以在矢量化解决方案的相同迭代器符号中进行操作,这将利用 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 )')