Python 3.x 在三维体积内创建三维圆柱体
我有3d卷。其形状为(399 x 512 x 512)。它的体素间距为0.484704 x 0.484704 x 0.4847 现在,我想在这个体积内定义一个圆柱体,长度为5mm,直径为1mm,内部强度为1,外部强度为0 我在互联网上看到了一个定义圆柱体的代码:Python 3.x 在三维体积内创建三维圆柱体,python-3.x,numpy,Python 3.x,Numpy,我有3d卷。其形状为(399 x 512 x 512)。它的体素间距为0.484704 x 0.484704 x 0.4847 现在,我想在这个体积内定义一个圆柱体,长度为5mm,直径为1mm,内部强度为1,外部强度为0 我在互联网上看到了一个定义圆柱体的代码: from mpl_toolkits.mplot3d import Axes3D def data_for_cylinder_along_z(center_x,center_y,radius,height_z): z = np
from mpl_toolkits.mplot3d import Axes3D
def data_for_cylinder_along_z(center_x,center_y,radius,height_z):
z = np.linspace(0, height_z, 50)
theta = np.linspace(0, 2*np.pi, 50)
theta_grid, z_grid=np.meshgrid(theta, z)
x_grid = radius*np.cos(theta_grid) + center_x
y_grid = radius*np.sin(theta_grid) + center_y
return x_grid,y_grid,z_grid
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
Xc,Yc,Zc = data_for_cylinder_along_z(0.2,0.2,0.05,0.1)
ax.plot_surface(Xc, Yc, Zc, alpha=0.5)
plt.show()
但是,我不知道如何定义3d体积内的圆柱体,以保持所有条件(长度5mm,直径1mm,内部强度1,外部强度0)为真。我还想自动定义圆柱体的中心。这样我就可以在3d体积内的任何位置定义圆柱体,保持其他条件为真。有人能举个例子吗?
提前多谢。解决此问题的一个简单方法是单独执行每个检查,然后只保留满足所有约束的体素 如果使用体素的所有中心构建栅格:p(399 x 512 x 512 x 3),则(i,j,k)处的每个体素将与其实际位置(x,y,z)相关联 这有点棘手,但应该是这样的:
np.stack(np.meshgrid(np.arange(0, shape[0]),
np.arange(0, shape[1]),
np.arange(0, shape[2]), indexing='ij'), axis=3)
如果减去圆柱体的中心(center_x,center_y,center_z),则留下每个(i,j,k)体素的相对位置p_rel(399 x 512 x 512 x 3)
当你有了这些,你可以一个接一个地应用你的每个测试。对于半径和高度为_Z的Z向圆柱体,其形状如下:
# constrain the Z-axis
not_too_high = P_rel[:,:,:,2]<= (0.5*height_z)
not_too_low = P_rel[:,:,:,2]>= (-0.5*height_z)
# constrain the radial direction
not_too_far = np.linalg.norm(P_rel[:,:,:,:2],axis=3)<=radius
voxels_in_cyl = not_too_high & not_too_low & not_too_far
#约束Z轴
不太高=相对高度[:,:,:,2]=(-0.5*高度)
#约束径向
not_too_far=np.linalg.norm(P_rel[:,:,:,:2],axis=3)我实际上是用这个想法工作的,而不是代码片段。但它可以工作:)嗨,测试过的实际代码片段。当打印体素时,我得到布尔值!在给定圆心、高度和半径的情况下,是否可以给出一个完整的示例来定义圆柱体?非常有帮助。圆柱体内部的体素为1,外部的体素为0-这听起来像是一个“完整”的定义!您可以将其用作遮罩,以获取内部体素的坐标(P\u rel[voxels\u in\u cyl]
),或将其转换为用例所需的任何形式