Python中保存编辑后的.nrrd文件失败(含报错),求解决方法
解决NRRD文件调整尺寸后保存失败的问题
问题重现
运行以下代码保存调整尺寸后的NRRD文件时出现报错:
!pip install pynrrd import numpy as np import nrrd import cv2 from PIL import Image import matplotlib.pyplot as plt readdata,header = nrrd.read("/content/drive/MyDrive/Colab Notebooks/Image/imagingVolume .nrrd") print('readdata: ', readdata.shape) #(256,256,30) readdata = cv2.resize(readdata,(192,256)) readdata = np.transpose(readdata, (2,0,1)) print(readdata.shape) #(30,256,192) cv2.imwrite("/content/drive/MyDrive/Colab Notebooks/","reshaped.nrrd")
报错信息:
Overload resolution failed: - img is not a numpy array, neither a scalar - Expected Ptr<cv::UMat> for argument 'img'
错误原因
- 参数顺序错误:
cv2.imwrite的第一个参数需要是完整的文件路径(包含文件名),你把路径和文件名拆成两个参数传入,导致函数识别错误。 - 工具不匹配:
cv2.imwrite仅支持保存2D图像格式(如PNG、JPG),无法处理3D的NRRD医学图像格式,必须使用pynrrd库的nrrd.write方法。
修正后的代码
!pip install pynrrd import numpy as np import nrrd import cv2 # 读取NRRD文件 readdata, header = nrrd.read("/content/drive/MyDrive/Colab Notebooks/Image/imagingVolume .nrrd") print('原始数据形状: ', readdata.shape) #(256,256,30) # 调整尺寸:注意cv2.resize的尺寸参数是(width, height),对应原数组的后两个维度 readdata = cv2.resize(readdata, (192, 256)) # 转置为NRRD常用的(z, y, x)维度顺序 readdata = np.transpose(readdata, (2, 0, 1)) print('调整后数据形状: ', readdata.shape) #(30,256,192) # 更新header中的尺寸信息,确保与新数据匹配 header['sizes'] = readdata.shape # 使用nrrd.write保存文件,传入完整路径 nrrd.write("/content/drive/MyDrive/Colab Notebooks/reshaped.nrrd", readdata, header)
关键说明
- 调整数据尺寸后,必须同步更新NRRD的header信息(尤其是
sizes字段),否则后续读取文件时会出现维度不匹配的问题。 - 始终使用
nrrd.write处理NRRD格式文件,避免用图像类工具保存3D医学数据。
内容的提问来源于stack exchange,提问作者Aditya Kamath
相关产品推荐
相关产品推荐

