如何在知道体积点坐标原点的情况下设置其原点?

2024-04-19 21:55:19 发布

您现在位置:Python中文网/ 问答频道 /正文

三维光斑由一个函数定义,接近于三维密度高斯http://bit.ly/1KjfTYN。五个参数是必要的:“亮度”,扩展和三个参数x0, y0, z0定义了斑点的起源。x、 y和z属于区间[-50;50]。你知道吗

该函数生成一个包含定义点的密度值的3D numpy数组。这种阵列的形状是(200200)。你知道吗

投影在平面上的三维点看起来像左图。右侧的图像显示了从3D点中发现的点的中心:

enter image description here

由于参数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的体素,并且到处都是零。你知道吗


Tags: 函数numpy参数定义np数组originarray
1条回答
网友
1楼 · 发布于 2024-04-19 21:55:19

最简单的方法是创建一个零数组,然后找到单个点的索引并将该点设置为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)来描述每个轴,只是为了使这个简短而简单,但是对于不同的值,只需显式地写出每个轴。你知道吗

相关问题 更多 >