计算3D球形掩模的直径线

4

背景

我正在开发一个算法,目前使用一个3D球作为二进制掩模,使用NxNxN数组来表示半径为N // 2的球体内的体素为True。进一步处理会对每个设置为True的体素进行计算。

随着N的增大,它在我的特定任务中变得计算密集,时间复杂度为O(N^3),因此我现在想将我的二进制掩模减少到从阵列中心向外辐射的线的子采样。

目标

我想要一种灰色图像中的线条的3D二进制掩模。

Half-lines

为了在一定程度上控制体素的数量,我会有一个参数(例如l)来调节每个2D圆中采样的线数,以及可能是第二个参数(k?),用于旋转z轴的次数。

我尝试过的

我正在使用numpy和scipy,并且我认为我可以使用scipy.ndimage.interpolation.rotate方法在平面上旋转单条线,然后使用完整的2D掩模绕z轴旋转。这被证明是困难的,因为interpolate使用了一些关于样条曲线的深度魔法,在旋转时丢弃了我的True值。

我想,我可以通过跟踪一些线方程来计算数学上应该设置为True的体素,但我无法找到它们。

有什么想法吗?

更新:解决方案!

感谢jkalden帮助我思考并给出代码示例,我有了下面的解决方案:

rmax是球体的半径,n_thetan_phi是要使用的极角和方位线数。

out_mask = np.zeros((rmax*2,) * 3, dtype=bool)

# for each phi = one circle in azimutal circles
for phi in np.linspace(0, np.deg2rad(360), n_phi,endpoint=False):
    # for all lines in polar circle of this azimutal circle
    for theta in np.linspace(0, np.deg2rad(360), n_theta,endpoint=False):
        # for all distances (0-rmax) in these lines
        for r in range(rmax):

        coords = spherical_to_cartesian([r, theta, phi]) + rmax
        out_mask[tuple(coords)] = True

使用来自此代码示例spherical_to_cartesian方法。

rmax = 50n_theta = n_phi = 8时,得到以下结果:

Irised ! (中心区域因选择而被排除在函数之外)

1个回答

2
我建议改变坐标系为球坐标。因此,你可以通过方位角选择2D圆,然后通过选择极角定义一条线。沿着该直线的变量就是半径,你可以使用´numpy.linspace´来离散化它。这样做也可能会在计算过程中节省时间。
你可以随时使用双射关系来切换你的坐标系,如此处此处所实现的那样。

哦,我怎么没想到那个!?我已经准备在三维空间中使用线性方程了... 我会更新我的代码并使用它,然后接受你的好答案!=) 如果我完成后将具体代码告诉你,你介意更新一下你的回答吗? - Jiby
我会做的,但另一方面,你也可以关闭这个问题,一旦你到达那里,开始新的、更具体的问题... - jkalden
哦,不好意思,我是指为了以后有兴趣的人能够得到完整的答案(包括具体代码)!=) - Jiby
1
我把它放在我更新的答案末尾(看起来很不错!)。非常感谢! - Jiby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接