使用行进立方体可视化两个 3D 图像之间的误差

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

我正在尝试使用行进立方体和 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()

我正在尝试获得与此类似的结果:

https://docs.pyvista.org/examples/01-filter/flying_edges.html#sphx-glr-examples-01-filter-flying-edges-py

但是我收到一个错误:

data length of (62748) != required length (15624252) for > grid.point_arrays["Distance"] = distance.

我不太明白问题是什么。当我使用 image2 的等值面并使用欧几里德距离信息作为 pyvista 帖子中的标量来可视化错误时。

python 3d visualization pyvista
1个回答
0
投票

让我猜猜:您的 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
时,您已经在每个体素处拥有一个值(即标量);使用任何一种规范来减少数据都是没有意义的。

有两种可能:

  1. 您的数据是正确的,在这种情况下,只需降低标准并使用图像的(绝对?)差异。
  2. 您的数据实际上是 RGBA(或其他 4d),在这种情况下,您必须修复数组并沿适当的(通道)轴进行缩减。
© www.soinside.com 2019 - 2024. All rights reserved.