三维光斑由一个函数定义,接近于三维密度高斯http://bit.ly/1KjfTYN。五个参数是必要的:“亮度”,扩展和三个参数x0, y0, z0
定义了斑点的起源。x、 y和z属于区间[-50;50]。你知道吗
该函数生成一个包含定义点的密度值的3D numpy数组。这种阵列的形状是(200200)。你知道吗
投影在平面上的三维点看起来像左图。右侧的图像显示了从3D点中发现的点的中心:
由于参数x0、y0、z0是已知的,例如:
-6.27467613177
-14.0836144387
-15.7856389635
应该可以编写一个以x0,y0,z0为参数的函数,生成一个3D numpy数组,除体素值应等于1的点的原点外,其他地方都等于0。以下函数用于设置三维点的原点,并知道坐标原点:
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的元组,生成一个三维数组,在这个点的原点有一个等于1的体素,并且到处都是零。你知道吗
最简单的方法是创建一个零数组,然后找到单个点的索引并将该点设置为
1
。要找到(x,y,z)索引,可以使用searchsorted
或自己进行计算。你知道吗要验证这一点:
你也可以直接计算指数。在这里,您可以将函数中给出
ix
的行替换为:在这里,我假设使用相同的值(即,-50,50,200)来描述每个轴,只是为了使这个简短而简单,但是对于不同的值,只需显式地写出每个轴。你知道吗
相关问题 更多 >
编程相关推荐