【问题标题】:Computing diameter-lines of a 3D spherical mask计算 3D 球形掩模的直径线
【发布时间】:2015-10-26 10:07:12
【问题描述】:

背景

对于我正在研究的算法,我目前使用 3D 球体作为二进制掩码,NxNxN 数组在半径为 N//2 的球体中具有体素为True。进一步的处理对每个体素集进行计算True

事实证明,由于 N 变大 = O(N^3),这对我的特定任务来说是计算密集型的,所以我现在想将我的二进制掩码减少为从半径内的阵列中心辐射的线的子样本。

目标

我想要图像中灰色线条的 3D 二进制蒙版。

为了对体素的数量进行一些控制,我将有一个参数(比如l)来调节每个二维圆中采样的线数,也许还有第二个参数(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

使用来自this code samplespherical_to_cartesian

这给了我这个(rmax = 50n_theta = n_phi = 8):

(中心区域根据我的选择调出功能)

【问题讨论】:

    标签: python numpy multidimensional-array 3d geometry


    【解决方案1】:

    我建议将坐标系改为spherical coordinates。因此,您将通过方位角选择二维圆,然后通过另外选择极角来定义一条线。沿线的变量就是半径,您可以使用“numpy.linspace”对其进行离散化。这样做还可以节省计算时间。

    您可以随时使用已实现的双射关系切换坐标系,例如herehere

    【讨论】:

    • 哦。我怎么没想到!?我已经准备好在 3D 中做直线方程了……我会更新我的代码来使用它,然后接受你的好答案! =) 你介意用我完成后的特定代码更新你的答案吗?
    • 我会的,但另一方面,您也可以关闭此问题并在您到达那里后开始新的、更具体的问题...
    • 哦,不,对不起,我的意思只是为了让您以后有兴趣的人有一个完整的答案(包括特定代码)! =)
    • 我把它放在最后的更新答案中(看起来很棒!)。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    相关资源
    最近更新 更多