如何为PyVista的ImageData成功执行gaussian_smooth方法?
问题描述
尝试复现PyVista中3D高斯平滑PolyData的示例,但将gaussian_smooth()方法应用于自定义ImageData时,出现**MissingDataError: No data available.**错误。推测需要给ImageData传入标量字段,但不确定用哪个属性。相关代码如下:
# create a uniform grid to sample the function with n = 40 x_min, y_min, z_min = [np.min(q) - 0.25*np.absolute(np.min(q)) for q in [tmp[tmp[:,3]==1, 0], tmp[tmp[:,3]==1, 1], tmp[tmp[:,3]==1, 2]]] x_max, y_max, z_max = [np.max(q) + 0.25*np.absolute(np.max(q)) for q in [tmp[tmp[:,3]==1, 0], tmp[tmp[:,3]==1, 1], tmp[tmp[:,3]==1, 2]]] grid = pv.ImageData( dimensions=(n, n, n), spacing=( (x_max - x_min) / n, (y_max - y_min) / n, (z_max - z_min) / n), origin=(x_min, y_min, z_min), ) smooth_grid = grid.gaussian_smooth(std_dev=3.0)
解决方案
给ImageData添加标量字段
PyVista的gaussian_smooth()方法依赖网格上的标量数据才能执行平滑操作,你当前创建的ImageData仅包含空的网格结构,没有任何可用于处理的标量数据,这是报错的核心原因。你需要给网格添加点数据或单元数据,通常点数据更常用:
示例1:采样外部源点的标量到网格# 从tmp中提取源点坐标和对应标量(根据实际需求调整) source_points = tmp[tmp[:,3]==1, :3] scalars = tmp[tmp[:,3]==1, 3] # 替换为你要平滑的实际标量字段 # 将标量采样到ImageData的点上,命名为"scalars" grid['scalars'] = grid.sample(source_points, scalars)示例2:生成基于网格坐标的测试标量
# 获取网格所有点的坐标数组 points = grid.points # 生成距离原点的距离作为测试标量 scalars = np.linalg.norm(points, axis=1) # 将标量添加到网格的点数据中,自定义键名"distance" grid['distance'] = scalars执行高斯平滑
添加完标量字段后,直接调用gaussian_smooth()即可。方法默认使用当前活跃的标量字段,也可以通过scalars参数指定具体要平滑的字段:# 使用默认活跃标量进行平滑 smooth_grid = grid.gaussian_smooth(std_dev=3.0) # 指定具体字段名执行平滑 smooth_grid = grid.gaussian_smooth(std_dev=3.0, scalars='distance')验证平滑效果
可以通过可视化对比原始和平滑后的网格,确认结果:p = pv.Plotter(shape=(1, 2)) p.subplot(0, 0) p.add_mesh(grid, scalars='distance', title='Original') p.subplot(0, 1) p.add_mesh(smooth_grid, scalars='distance', title='Smoothed') p.show()
内容的提问来源于stack exchange,提问作者Sterling Butters
相关产品推荐
相关产品推荐

