【发布时间】:2015-07-21 15:43:52
【问题描述】:
3D 点由函数定义,接近 3D 光密度高斯 http://bit.ly/1KjfTYN。五个参数是必要的:“亮度”、扩散和三个参数x0, y0, z0 定义光斑的起源。 x,y 和 z 属于区间 [-50;50]。
该函数生成一个 3D numpy 数组,其中包含定义该点的光密度值。这种数组的形状是(200,200,200)。
投影在平面上的 3D 点看起来像左图。右图显示了从 3D 点找到的点的中心:
由于参数 x0,y0,z0 是已知的,例如:
-6.27467613177
-14.0836144387
-15.7856389635
应该可以编写一个以 x0, y0, z0 作为参数的函数,产生一个等于 0 的 3D numpy 数组,除了在体素值应该等于 1 的点的原点处。假设以下函数在知道坐标原点的情况下设置 3D 点的原点:
def make_spot_origin_3d(x0,y0,z0):
'''generate a volume V(x0,y0,z0)=1 and equal to 0 elsewhere.
DOESN'T WORK !!
'''
# Create x and y indices
x = np.linspace(-50, 50, 200)
y = np.linspace(-50, 50, 200)
z = np.linspace(-50, 50, 200)
X, Y, Z = np.meshgrid(x, y, z,)
presence = 0*(X <> x0)*(Y <> y0)*(Z <> z0)
presence = 1*(X == x0)*(Y == y0)*(Z == z0)
return presence
这行不通。
所以我尝试通过提取点原点的坐标来标记点的原点:
def find_coordinates_spot_origin(volume_array):
loc_density_max = np.where(volume_array == volume_array.max())
origin = np.uint16(np.mean(loc_density_max, axis=1))
return origin
然后可以设置一个卷,其中 1 个值标记原点
def find_spot_centre(volume_array):
coord = find_coordinates_spot_origin(volume_array)
origin_3d = np.zeros(volume_array.shape)
origin_3d[coord[0],coord[1], coord[2]]=1
return np.uint16(origin_3d)
但它很乏味。例如从点中提取的点的原点坐标,即来自 3D numpy 数组,为:
(array([71]), array([87]), array([68]))
所以,我正在寻找一个函数,它采用 float,x0,y0,z0 的元组并产生一个 3D 数组,其中一个体素在点的原点等于 1,并且到处都填充为零。
【问题讨论】:
-
我无法理解这个问题。这里有一些我不明白的东西,这可能有助于改善这个问题:什么是斑点?它是一组 3d 点吗?是 x0、y0 和 z0 数组吗?浮动?整数?它们是体素的坐标吗?它们与
volume_array有什么关系?你能添加一个你希望生成的输入和输出的例子吗? -
希望问题有所改善