计算3D球面罩的直径线

时间:2015-10-26 10:07:13

标签: python numpy multidimensional-array 3d geometry

背景

对于我正在研究的算法,我目前使用3D球体作为二元模板,其中NxNxN数组的体素半径为N//2,为TrueTrue。进一步处理将每个体素的计算设置为N

由于l增长大= O(N ^ 3),因此我的特定任务证明了计算密集度,所以我现在想要将二进制掩码减少到半径内从阵列中心辐射的线的子样本。

目标

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

Half-lines

为了对体素的数量进行一些控制,我会有一个参数(比如k)来调节每个2D圆圈中采样的线数,也可能是第二个(rmax ?)用于z旋转的数量。

我尝试了什么

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

我在想我可以通过跟踪一些线方程在数学上计算哪个体素应该设置为True,但是我找不到它们。

知道如何到达那里吗?

更新:解决方案!

感谢jkalden帮助我思考并提供了代码示例,我有这个:

n_theta是球半径,n_phiout_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

使用this code sample中的rmax = 50

这给了我这个(n_theta = n_phi = 8#include <stdio.h> #include <stdlib.h> #include <math.h> int x=0,y=0,conv,a; float dB1,dB2[15],W2[15],divide; char ans,unit[3],ex; double logans,W1; int main() { system ("color F0"); system ("mode 75,50"); do { if(y>0) { printf("\n\tIncorrect entry detected, please try again."); printf("\n\n\n\tPlease "); system("pause"); y=0; } system("cls"); printf("\n\tAvailable Convertors:\n\n\t1 = mW, W or kW to dBm, dBW and dBk respectively.\t"); printf("\n\n\t2 = dBm, dBW or dBk to mW, W and kW respectively."); printf("\n\n\tPlease choose which convertor you would like to use: \t"); scanf("%d",&conv); printf("\n\tYou entered: %d \n"),conv; ):

Irised ! (中心区域通过选择调出我的功能)

1 个答案:

答案 0 :(得分:2)

我建议将坐标系更改为spherical coordinates。因此,您将通过方位角选择2D圆,然后通过另外选择极角来定义线。沿线的变量就是半径,你可以使用'numpy.linspace'来离散它。这样做也可以节省计算时间。

您可以使用双线关系随时切换您的坐标系,例如herehere