如何在知道坐标原点的情况下设置体积点的原点?
How to set the origin of a volumetric spot knowing its coordinates origin?
3D 点由函数定义,接近 3D 光密度高斯 http://bit.ly/1KjfTYN。五个参数是必需的:"brightness"、传播和三个参数 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 作为参数的函数,生成一个 3D numpy 数组,除体素值应等于 1 的点的原点外,任何地方都等于 0。以下函数应该设置知道坐标原点的 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)
但是很乏味。例如,从 spot 中提取的 spot 的原点坐标,即来自 3D numpy 数组,是:
(array([71]), array([87]), array([68]))
所以,我正在寻找一个函数,它采用 float、x0、y0、z0 的元组,并生成一个 3D 数组,其中一个体素在点的原点处等于 1,并在所有地方填充零。
最简单的方法是创建一个零数组,然后找到单个点的索引并将该点设置为 1
。要找到 (x,y,z) 索引,您可以使用 searchsorted
或自己计算。
import numpy as np
def make_spot_origin_3d(x0,y0,z0):
d = np.linspace(-50, 50, 200)
r = np.zeros(d.shape*3)
ix = np.searchsorted(d, (x0, y0, z0))
r[tuple(ix)] = 1
return r
r = make_spot_origin_3d(45.7, -7.1, 2.9)
验证这一点:
print np.unravel_index(np.argmax(r), r.shape)
# (191, 86, 106) # seems reasonable
您也可以直接计算指数。在这里,您可以将函数中给出 ix
的行替换为:
mn, mx, span = -50., 50., 200.
ix = ((np.array([x0, y0, z0])-mn)*span/(mx-mn)).astype(np.int)
print ix
# [191 85 105] # similar to above.. but a bit different due to rounding/indexing issues which I don't want to think through right now..
这里我假设使用相同的值(即 -50、50、200)来描述每个轴只是为了使这个简短而简单,但对于不同的值,只需明确写出每个轴。
3D 点由函数定义,接近 3D 光密度高斯 http://bit.ly/1KjfTYN。五个参数是必需的:"brightness"、传播和三个参数 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 作为参数的函数,生成一个 3D numpy 数组,除体素值应等于 1 的点的原点外,任何地方都等于 0。以下函数应该设置知道坐标原点的 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)
但是很乏味。例如,从 spot 中提取的 spot 的原点坐标,即来自 3D numpy 数组,是:
(array([71]), array([87]), array([68]))
所以,我正在寻找一个函数,它采用 float、x0、y0、z0 的元组,并生成一个 3D 数组,其中一个体素在点的原点处等于 1,并在所有地方填充零。
最简单的方法是创建一个零数组,然后找到单个点的索引并将该点设置为 1
。要找到 (x,y,z) 索引,您可以使用 searchsorted
或自己计算。
import numpy as np
def make_spot_origin_3d(x0,y0,z0):
d = np.linspace(-50, 50, 200)
r = np.zeros(d.shape*3)
ix = np.searchsorted(d, (x0, y0, z0))
r[tuple(ix)] = 1
return r
r = make_spot_origin_3d(45.7, -7.1, 2.9)
验证这一点:
print np.unravel_index(np.argmax(r), r.shape)
# (191, 86, 106) # seems reasonable
您也可以直接计算指数。在这里,您可以将函数中给出 ix
的行替换为:
mn, mx, span = -50., 50., 200.
ix = ((np.array([x0, y0, z0])-mn)*span/(mx-mn)).astype(np.int)
print ix
# [191 85 105] # similar to above.. but a bit different due to rounding/indexing issues which I don't want to think through right now..
这里我假设使用相同的值(即 -50、50、200)来描述每个轴只是为了使这个简短而简单,但对于不同的值,只需明确写出每个轴。