关于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)



版权声明:本文为qq_40797296原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_40797296/article/details/124334558