对于我正在研究的算法,我目前使用3D球体作为二元模板,其中NxNxN
数组的体素半径为N//2
,为True
。True
。进一步处理将每个体素的计算设置为N
。
由于l
增长大= O(N ^ 3),因此我的特定任务证明了计算密集度,所以我现在想要将二进制掩码减少到半径内从阵列中心辐射的线的子样本。
我想要图像中灰色线条的3D二进制掩码。
为了对体素的数量进行一些控制,我会有一个参数(比如k
)来调节每个2D圆圈中采样的线数,也可能是第二个(rmax
?)用于z旋转的数量。
我正在使用numpy和scipy,我认为我可以使用scipy.ndimage.interpolation.rotate方法在平面上旋转单条线,然后使用完整的2D蒙版围绕z轴旋转。 这被证明是困难的,因为插值使用了一些关于样条的深刻魔法,这些样条在旋转时丢弃了我的真值。
我在想我可以通过跟踪一些线方程在数学上计算哪个体素应该设置为True,但是我找不到它们。
知道如何到达那里吗?
感谢jkalden帮助我思考并提供了代码示例,我有这个:
n_theta
是球半径,n_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
使用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;
):
答案 0 :(得分:2)
我建议将坐标系更改为spherical coordinates。因此,您将通过方位角选择2D圆,然后通过另外选择极角来定义线。沿线的变量就是半径,你可以使用'numpy.linspace'来离散它。这样做也可以节省计算时间。