如何解决更改 nifti 图像中的体素值并保存
我将读取 nifti 图像并更改体素的值并保存与主图像相似但只有不同体素值的新 nifti 图像。换句话说,我希望分割图像中的标签从 0 到 7,而不是具有不同的数字。 o 编写了下面的代码,但出现此错误:
NotImplementedError: Wrong number or type of arguments for overloaded function 'WriteImage'.
可能的 C/C++ 原型是: itk::simple::WriteImage(itk::simple::Image const &,std::string const &,bool) itk::simple::WriteImage(itk::simple::Image const &,std::vector > const &,bool)
代码:
对于 os.listdir(path) 中的 image_path:
label_name = os.path.join(path,image_path)
img = nib.load(label_name)
data = img.get_fdata()
n=0;
u=0;
m=0;
b=0;
e=0;
r=0;
s=0;
img1=img
data1 = img1.get_fdata()
for i in range (0,img.shape[0]):
for j in range (0,img.shape[1]):
for k in range (0,img.shape[2]):
if data[i,j,k]==500:
n=n+1;
data1[i,k]=1;
elif data[i,k]==600:
u=u+1;
data1[i,k]=2;
elif data[i,k]==420:
b=b+1;
data1[i,k]=3;
elif data[i,k]==550:
e=e+1;
data1[i,k]=4;
elif data[i,k]==205:
r=r+1;
data1[i,k]=5;
elif data[i,k]==820:
m=m+1;
data1[i,k]=6;
elif data[i,k]==850:
s=s+1;
data1[i,k]=7
OUTPUT_DIR='/Volumes/CSE_BME_AXM788/home/gxa131/labelsTr_new/'
dir1=os.path.join(OUTPUT_DIR,image_path)
sitk.WriteImage(data1,dir1)
解决方法
SimpleITK 的 WriteImage 函数需要一个 SimpleITK Image 作为第一个参数。 NiBabel 图像的 get_fdata 方法返回一个 Numpy 数组。如果要使用SimpleITK来写图片,需要使用GetImageFromArray函数将Numpy转换为SimpleITK。
请注意,您将丢失原始图像附带的任何元数据信息,例如像素间距。
更新:
回答有关保留元数据的问题:
我自己没有使用过 NiBabel,但下一页描述了如何从数据数组创建新图像,从原始图像复制标题信息: https://bic-berkeley.github.io/psych-214-fall-2016/saving_images.html
我自己会在整个过程中使用 SimpleITK。如果您使用 SimpleITK 加载图像并在 SimpleITK Image 对象上进行所有处理,则所有元数据都会保留。
对于您的特定代码,您可以使用 RelabelLabelMapFilter 类将原始标签(500、600、520、550、205、820、850)映射到(1-7),假设这些是唯一的标签。这样您就不必自己遍历所有体素。 https://simpleitk.org/doxygen/latest/html/classitk_1_1simple_1_1RelabelLabelMapFilter.html#details
并且要计算每个标签的体素数,您可以使用 LabelShapeStatisticsImageFilter。同样,这避免了手动遍历体素: https://simpleitk.org/doxygen/latest/html/classitk_1_1simple_1_1LabelShapeStatisticsImageFilter.html
,为了保存元数据,使用 nibabel.save 作为下面的例子:
new_nifti = nib.Nifti1Image(***numpy_arrray***.astype(np.float),nii_original_scan.affine)
nib.save(new_nifti,f'***path to new scan***.nii.gz')
说明:
您应该将新的 NIfTI 扫描(NumPy 数组)保存为 nii 图像。
为此,请使用 Nifti1Image
创建 nii 对象,然后使用 nibabel.save 将其保存到文件中。
Numpy_array 参数 - 是你的 numpy 数组(确保是浮点型)。第二个参数是加载后的原始NIfTI扫描(带仿射功能)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。