h5py拼接Blender导出y平面PNG切片为H5时非y平面拉伸排查
1. 体素物理步长标注与实际空间比例不匹配
你生成H5时统一给三个方向设置了相同的体素步长dz_dy_dz = (0.001, 0.001, 0.001),但三个方向的实际采样数、对应Blender内的真实物理跨度并不相等:
沿Y方向切片一共600张,对应Y方向总共有600个采样点
单张PNG对应X、Z平面维度,分别有500个、600个采样点
软件加载H5做非Y平面的重切片时,会按照标注的步长自动计算体素的物理尺寸,一旦步长和真实空间比例错配,就会直接出现拉伸。你需要根据Blender内模型的实际坐标范围反推真实步长:比如Blender中X方向总物理长度为Lx、Y方向总长度为Ly、Z方向总长度为Lz,对应步长应该是
dx = Lx/500、dy = Ly/600、dz = Lz/600,不能三个方向硬设成相等值。
2. 轴交换后的维度顺序与软件读取预期不匹配
你初始化体数据时的数组形状为(Xlen, Zlen, Ylen),也就是(500, 600, 600),对应维度顺序是:
第一维:X方向,长度500
第二维:Z方向,长度600
第三维:Y方向(切片堆叠方向),长度600
后续你执行了
dataset.swapaxes(1,2)交换第二维和第三维,交换后的数组形状仍为(500,600,600),但实际维度顺序已经变成「X方向、Y方向、Z方向」。绝大多数体数据可视化软件读取H5时,默认数组维度顺序为
(Z方向, Y方向, X方向),并按照这个顺序依次匹配dx_dy_dz属性的三个步长值。你交换轴后的维度顺序和软件预期完全错位,软件会把Z方向的体素当成Y方向的堆叠内容、把Y方向的堆叠体素当成Z方向的内容,自然会在跨Y的重切片方向出现比例拉伸。
3. 隐藏的像素纵横比错配
你使用PIL的resize((Zlen, Xlen))完成图像尺寸调整时,PIL的resize参数顺序为「图像宽度、图像高度」,也就是你把图像宽度设为600、高度设为500。如果Blender导出PNG时,正交相机设置了非正方形像素比例,哪怕图像尺寸调整到目标大小,单张图本身的像素纵横比和三维空间的实际坐标比例也不匹配。这种比例偏差在查看Y平面切片时不明显,但在做X/Z平面重切片时,会和步长错配的效果叠加,放大拉伸问题。
代码内的隐含错误
- 代码段未导入
fnmatch.fnmatch函数,实际运行时会触发模块报错 - 归一化循环中直接使用了未定义的循环变量
i,会触发数组下标错误,调试过程中临时调整维度读写顺序也可能间接导致维度错位
- 基于Blender中模型的实际坐标范围计算三个方向的真实步长,不要硬写固定步长值,确保步长顺序和软件读取H5的维度顺序严格对应
- 取消无意义的轴交换操作:要么将体数据提前整理成软件要求的固定维度顺序再存入H5,要么把维度顺序说明写入H5元属性,避免软件自动匹配错位
- 检查Blender导出切片的正交相机设置,确保渲染像素为正方形比例,和实际空间坐标一致
内容的提问来源于stack exchange,提问作者MattC1990

