1

我有一个包含一些数据的 3D 数组(光栅 3D 图像)。我想使用一些合适的插值(最好是线性的 - 在这种情况下可能是“三线性”)来通过该阵列进行 2D 切割。但是可以方便地描述切割平面,例如使用法线向量和距离。

如果切割平行于其中一个轴,这很简单,只需对 3D 数组进行切片(使用 numpy 索引切片)。但如果切口不平行于轴,我看不出解决这个问题的好方法。唯一想到的是旋转 3D 阵列(可能使用 2D 旋转的组合),以便切割平行于轴,但这似乎非常低效。

我正在使用 numpy、ndimage 和 skimage 在 python 中工作。可以假定任何其他 python 模块可用。

4

1 回答 1

2

没有真正对此进行测试,但它确实产生了某种图像。基于@Daniel Forsman 的建议。

import numpy as np
from scipy.interpolate import RegularGridInterpolator

# stack coordinates
z0,z1,z2 = 20, 20, 20
zz0,zz1,zz2 = np.linspace(0, 1, z0), np.linspace(0, 1, z1), np.linspace(0, 1, z2)

# fake stack data
d0,d1,d2 = np.ix_(0.5-np.abs(zz0-0.5), 0.5-np.abs(zz1-0.5), 0.5-np.abs(zz2-0.5))
data = np.minimum(np.minimum(d0, d1), d2)

# define picture (same coords as stack)
tl = np.array((0.1, -0.02, 0.3)) # top left corner
yo = np.array((-0.01, 0.1, 0.01))
yo /= np.sqrt((yo*yo).sum()) # y-axis unit
xo = np.array((0.1, 0, 0.1))
xo -= (xo*yo).sum() * yo # should be perpendicular now
xo /= np.sqrt((xo*xo).sum()) # x-axis unit

# build picture grid
nx,ny = 20j, 20j
ya, xa = np.ogrid[:1:ny, :1:nx]
grid = tl + ya[..., None] * yo + xa[..., None] * xo

picture = RegularGridInterpolator((zz0,zz1,zz2), data, bounds_error=False)(grid)
于 2017-02-05T08:33:16.087 回答