我正在尝试使用行进立方体和 Pyvista 可视化 2 个 3D nrrd 图像之间的错误。我计算了两个图像之间的欧氏距离,并试图获取图像的等值面并使用欧氏距离信息来可视化错误。
import numpy as np
import pyvista as pv
import nrrd
import matplotlib.pyplot as plt
img1 = nrrd.read("image1")
img2 = nrrd.read("image2")
distance = np.linalg.norm(img1-img2, axis=2)
distance = distance.flatten()
grid = pv.UniformGrid()
grid.dimensions = img2.shape
grid.spacing = (1,1,1)
grid.point_arrays["Distance"] = distance
isovalue = 1000
contour = grid.contour([isovalue], scalars="Distance",method = 'marching_cubes')
p = pv.Plotter()
p.add_mesh(contour, cmap='coolwarm', opacity=0.5,scalars="Distance")
p.add_mesh(grid.outline(), color='k')
p.show()
我正在尝试获得与此类似的结果:
但是我收到一个错误:
data length of (62748) != required length (15624252) for > grid.point_arrays["Distance"] = distance.
我不太明白问题是什么。当我使用 image2 的等值面并使用欧几里德距离信息作为 pyvista 帖子中的标量来可视化错误时。
让我猜猜:您的 3d 图像的最后一个空间维度的长度为 249.
这是一个重现示例(sans
nrrd
;另请注意,我已切换到 PyVista 0.32.0 中引入的“新”point_data
属性):
import numpy as np
import pyvista as pv
shape = (100, 101, 102)
img1 = np.random.rand(*shape)
img2 = np.random.rand(*shape)
distance = np.linalg.norm(img1 - img2, axis=2)
distance = distance.flatten()
grid = pv.UniformGrid()
grid.dimensions = img2.shape
grid.spacing = (1, 1, 1)
grid.point_data["Distance"] = distance
这给了我们
ValueError: data length of (10100) != required length (1030200)
那到底发生了什么?我们最终得到了
100 * 101
值而不是 100 * 101 * 102
值。这并不奇怪,因为我们从一个与我们的统一网格大小相同的 3d 数组开始,但随后我们使用范数减少了最后一个维度。
所以你的 3d 图像必须是灰度的,这意味着在每个体素中你有一个单一的值(而不是一个 RGB(A) 序列)。因此,当您采用
img1 - img2
时,您已经在每个体素处拥有一个值(即标量);使用任何一种规范来减少数据都是没有意义的。
有两种可能: