关于python读取nhdr文件时出现sitk::ERROR: Only Complex image with float and double are supported!问题解决方案
根据reading segmentation file from Slicer (NRRD) with multiple segments with SimpleITK shows Exception - Engineering - ITK这个论坛给出了相应的解决方案,就是将nhdr文件中的kinds: complex domain domain domain一行改为kinds: list domain domain domain即可解决。考虑到存在多个nhdr文件,且仅有部分文件会出现此类问题,具体代码如下:(主要是读取nhdr文件并将不同b值保存为nrrd格式)。
注:windows系统下最好利用os对路径进行读取。
文件的存放关系为:
----data
----sub_data
----*.raw.gz
----*.nhdr
import SimpleITK as sitk
import linecache
import os
from glob import glob
def mkdir(path):
if not os.path.exists(path):
os.makedirs(path)
def save_as_nrrd(data):
data_arr = sitk.GetArrayFromImage(data)
res = []
for i in range(data_arr.shape[-1]):
nrrd = sitk.GetImageFromArray(data_arr[:, :, :, i])
nrrd.SetOrigin(data.GetOrigin())
nrrd.SetDirection(data.GetDirection())
nrrd.SetSpacing(data.GetSpacing())
res.append(nrrd)
return nrrd
def rewriting_nhdr_file(path):
file_data = ''
new_str = 'kinds: list domain domain domain\n'
old_str = linecache.getline(path, 9) # 出现问题为第9行,具体第几行可以打开问题文件自行更改
with open(path, 'r') as file:
for line in file:
if old_str in line:
line = line.replace(old_str, new_str) # 替换问题字符串
file_data += line
file.close()
with open(path, 'w') as file:
file.write(file_data)
file.close()
paths = sorted(glob('***/*')) # 获取sub_data路径
outpath = "***"
for path in paths:
file_paths = sorted(glob(path + '/*.nhdr'))[0] # 获取nhdr文件
try:
img = sitk.ReadImage(file_paths)
except:
rewriting_nhdr_file(file_paths)
img = sitk.ReadImage(file_paths)
nrrd_list = save_as_nrrd(img)
for i in len(nrrd_list):
out_file_path = os.path.join(outpath, file_path.split('/')[-1][:-4],
'+{}.nrrd'.format(str(i).zfill(3))
sitk.writeImage(nrrd_list[i], outpath)
mat(str(i).zfill(3))
sitk.writeImage(nrrd_list[i], outpath)