我自己也是第一次遇到这种数据类型的图像。为了大家的方便起见我直接给出我的代码,他会将原本的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才能看,可恶。。。所以希望我的这个能帮助到大家吧!