4DCT肺部数据(带标注点)应该如何读取

我自己也是第一次遇到这种数据类型的图像。为了大家的方便起见我直接给出我的代码,他会将原本的ANALYSE格式的.nii文件转换成.nii.gz格式,转换成这个格式之后就一定能够正常处理了对吧。因为没有头文件hrd,网站上也是只有尺寸和体素大小这样的信息,所以文件类型我是试出来。文件路径大家根据自己的修改就好。下面附上对应的数据集下载网址:

4DCT | Emory School of Medicine

import nibabel as nib
import numpy as np
from tqdm import tqdm
import os


def convert_analyse_to_nifti(img_path, output_dir, dims, voxel_size):
    dtype = 'i2'
    endian = '<'
    trial = 1

    try:
        # 读取数据
        raw = np.fromfile(img_path, dtype=f'{endian}{dtype}')

        data = raw.reshape(dims[::-1]).transpose(2, 1, 0)

        # 值范围检查(CT值应在-1000~3000)
        if np.percentile(data, 99) < 100:  # 疑似需要缩放
            data = (data - data.min()) * 4000 / (data.max() - data.min()) - 1000

        # 生成输出文件名
        base_name = os.path.basename(img_path).replace('.img', '.nii.gz')
        output_path = os.path.join(output_dir, base_name)

        # 修改仿射矩阵以调整图像方向
        affine = np.array([
            [-voxel_size[0], 0, 0, 0],
            [0, -voxel_size[1], 0, 0],
            [0, 0, -voxel_size[2], 0],
            [0, 0, 0, 1]
        ])

        img = nib.Nifti1Image(data.astype(np.float32), affine)
        nib.save(img, output_path)
        print(f"成功保存到 {output_path}")
    except Exception as e:
        print(f"使用数据类型 {dtype}、字节顺序 {endian} 和维度排列顺序 {trial} 时出错: {e}")


# 各文件夹的参数信息
folder_params = {
    'Case1Pack': {
        'dims': (256, 256, 94),
        'voxel_size': (0.97,0.97,2.5)
    },
    'Case2Pack': {
        'dims': (256, 256, 112),
        'voxel_size': (1.16, 1.16, 2.5)
    },
    'Case3Pack': {
        'dims': (256, 256, 104),
        'voxel_size': (1.15, 1.15, 2.5)
    },
    'Case4Pack': {
        'dims': (256, 256, 99),
        'voxel_size': (1.13, 1.13, 2.5)
    },
    'Case5Pack': {
        'dims': (256, 256, 106),
        'voxel_size': (1.10, 1.10, 2.5)
    },
    'Case6Pack': {
        'dims': (512, 512, 128),
        'voxel_size': (0.97, 0.97, 2.5)
    },
    'Case7Pack': {
        'dims': (512, 512, 136),
        'voxel_size': (0.97, 0.97, 2.5)
    },
    'Case8Pack': {
        'dims': (512, 512, 128),
        'voxel_size': (0.97, 0.97, 2.5)
    },
    'Case9Pack': {
        'dims': (512, 512, 128),
        'voxel_size': (0.97, 0.97, 2.5)
    },
    'Case10Pack': {
        'dims': (512, 512, 120),
        'voxel_size': (0.97, 0.97, 2.5)
    }
}

base_dir = r'YOUR/PATH'

# 遍历每个文件夹
for folder_name, params in folder_params.items():
    input_dir = os.path.join(base_dir, folder_name, 'Images')
    output_dir = os.path.join(base_dir, folder_name, 'Images_nii')
    os.makedirs(output_dir, exist_ok=True)

    # 获取所有.img文件
    img_files = [f for f in os.listdir(input_dir) if f.endswith('.img')]

    # 遍历所有.img文件进行转换
    for fname in tqdm(img_files):
        in_path = os.path.join(input_dir, fname)
        convert_analyse_to_nifti(in_path, output_dir, params['dims'], params['voxel_size'])

    

我在优快云上找到的相关博客要冲VIP才能看,可恶。。。所以希望我的这个能帮助到大家吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值