使用 skimage.measure.marching_cubes 查找面会根据网格限制以奇怪的偏移量返回

问题描述 投票:0回答:1

我的一位同事最近尝试使用 matplotlib 可视化应变模量。如果您不知道那是什么:如果您有兴趣,请点击以下链接。 https://www.degruyter.com/document/doi/10.1524/zkri.2011.1413/html

这是晶体结构在压力下压缩时应变张量各向异性的 3D 可视化。

对于我们的目的来说,它只是 3D 空间中的等值面。您使用函数计算 3D 网格的值,然后行进立方体算法找到在给定值处绘制出等值面的顶点(假设:iso 值为 0.4 的每个顶点)。

此外,marching_cubes 算法会查找属于给定等值面的所有面。在最简单的情况下,不存在各向异性,结果将是一个完美的球体。

这是代码:

import matplotlib.pyplot as plt
import numpy as np
from skimage import measure


def func(x, y, z):

    Z1111 = 1 
    Z1133 = 1/3 
    Z3333 = 1 

    return (Z1111 * (x**4 + 2 * x**2 * y**2 + y**4) + 6 * Z1133 * (x**2 * z**2 + y**2 * z**2) + Z3333 * z**4 )


a,b,c = -1,1,.1

X, Y, Z = np.mgrid[a:b:c, a:b:c, a:b:c]
vals = func(X,Y,Z)

iso_val = 0.4
verts, faces, murks, _ = measure.marching_cubes(vals, iso_val)

# shift_zero = np.array((a*10,a*10,a*10))
# verts = verts + shift_zero

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:,1], faces, verts[:, 2],
                cmap='jet', lw=1)

ax.plot((0,0),(0,0),(-10,10),'r-',lw=3,zorder=100)
plt.show()

这就是异常行为的来源:

当您定义 3D 网格并在所有方向 (x,y,z) 上使用 -1,1 之间的点(间隔为 0.1)时,球体不是以 (0,0,0) 为中心,而是以 (0,0,0) 为中心(10,10,10)。如果取消注释

shift_zero
verts = verts + shift_zero
行,则可以补偿偏移。

我的脚本有问题吗?等值面的函数是否包含内在位移?这是 Marching_cubes 实施的问题吗?我可以使用

verts.mean(axis=0)
计算顶点的中心点,然后从顶点中减去它,但这似乎是一种逃避。

python matplotlib scikit-image marching-cubes
1个回答
0
投票
  1. 网格定义和居中:在代码中,您可以使用 numpy.mgrid 在 [-1, 1] 范围内定义 3D 网格,步长为 0.1。这将创建一个围绕零对称的网格。 Marching_cubes 生成的 verts 数组也应该具有反映这种对称性的坐标,这意味着生成的形状(如球体)应该以原点 (0, 0, 0) 为中心,假设函数中没有固有偏差。

  2. 顶点移动:您所描述的有关以 (10, 10, 10) 为中心的球体的问题通常不会直接由 Marching_cubes 函数产生。绘图中可能存在误解或可视化错误。由于步长为 0.1,因此在没有额外转换的情况下,mgrid 的索引(从 -1 到 1)不会自然地转换为这些大顶点值。 Marching_cubes 输出的顶点坐标应该已经根据您的输入网格正确缩放。

  3. 通过中心计算进行验证:计算顶点的质心并进行相应调整实际上是一种合理的方法,而不仅仅是“逃避”。如果您发现质心不在或非常接近 (0, 0, 0),则表明函数或网格的设置方式可能存在问题,或者结果的解释或显示方式可能存在问题.这是一个计算和调整质心的简单代码片段:

centroid = verts.mean(axis=0) verts_adjusted = verts - centroid

然后,绘制 verts_adjusted 而不是 verts,看看这是否按预期将等值面在原点对齐。 绘图和可视化:确保在绘图中正确设置轴限制和纵横比。如果绘图不对称显示或者一个或多个轴上的缩放比例不同,这有时会导致混乱。

© www.soinside.com 2019 - 2024. All rights reserved.