解决读取nhdr文件complex问题

本文介绍了解决使用Python的SimpleITK库读取NHDR文件时遇到的错误'sitk::ERROR:OnlyCompleximagewithfloatanddoublearesupported!'的方法。通过修改NHDR文件中特定行的代码,将'kinds:complexdomaindomaindomain'更改为'kinds:listdomaindomaindomain',可以解决此问题。此外,还提供了一个Python脚本来批量处理多个NHDR文件,并将它们保存为NRRD格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值