test_groups = [
{
'name': '臀肌群',
'files': ['gluteus_maximus_left.nii.gz', 'gluteus_maximus_right.nii.gz',
'gluteus_medius_left.nii.gz', 'gluteus_medius_right.nii.gz'],
},
{
'name': '股骨与髋骨',
'files': ['femur_left.nii.gz', 'femur_right.nii.gz',
'hip_left.nii.gz', 'hip_right.nii.gz'],
},
{
'name': '盆腔器官',
'files': ['urinary_bladder.nii.gz', 'colon.nii.gz', 'small_bowel.nii.gz'],
}
]
multilabel_results = []
for group in test_groups:
# 1. 创建多标签数据
first_img = nib.load(mask_dir / group['files'][0])
space = Space.from_nifti(first_img)
multilabel_array = np.zeros(first_img.shape, dtype=np.uint8)
label_mapping = {}
for i, fname in enumerate(group['files']):
fpath = mask_dir / fname
if not fpath.exists(): continue
data = nib.load(fpath).get_fdata().astype(np.uint8)
# 构建多标签数组
label_value = i + 1
organ_name = fname.replace('.nii.gz', '')
multilabel_array[data > 0] = label_value
label_mapping[organ_name] = label_value
# 2. 对同一个多标签数组,用不同格式进行基准测试
nifti_stats = run_benchmark('nifti', data=multilabel_array, space=space)
npz_stats = run_benchmark('npz', data=multilabel_array)
medmask_stats = run_benchmark('medmask', data=multilabel_array, space=space, label_mapping=label_mapping)
multilabel_results.append({
'测试组': group['name'],
'标签数': len(group['files']),
'NIfTI (KB)': nifti_stats['size'] / 1024,
'NPZ (KB)': npz_stats['size'] / 1024,
'MedMask (KB)': medmask_stats['size'] / 1024,
'NPZ 编码 (ms)': npz_stats['encode_time'],
'MedMask 编码 (ms)': medmask_stats['encode_time'],
'NPZ 解码 (ms)': npz_stats['decode_time'],
'MedMask 解码 (ms)': medmask_stats['decode_time']
})
df_multi = pd.DataFrame(multilabel_results)
# --- 增加平均值行 ---
if not df_multi.empty:
avg_row = df_multi.select_dtypes(include=np.number).mean()
avg_row['测试组'] = 'Average'
avg_row = avg_row.reindex(df_multi.columns, fill_value='-')
df_multi = pd.concat([df_multi, pd.DataFrame([avg_row])], ignore_index=True)
df_multi['MedMask压缩比 (vs NIfTI)'] = df_multi['NIfTI (KB)'] / df_multi['MedMask (KB)']
df_multi['NPZ压缩比 (vs NIfTI)'] = df_multi['NIfTI (KB)'] / df_multi['NPZ (KB)']
print("--- 多标签掩膜压缩性能对比 ---")
display(df_multi.style.format({
'独立NIfTI (KB)': '{:.1f}', '独立NPZ (KB)': '{:.1f}', 'MedMask合并 (KB)': '{:.1f}',
'NIfTI (KB)': '{:.1f}', 'NPZ (KB)': '{:.1f}', 'MedMask (KB)': '{:.1f}',
'NPZ 编码 (ms)': '{:.1f}', 'MedMask 编码 (ms)': '{:.1f}',
'NPZ 解码 (ms)': '{:.1f}', 'MedMask 解码 (ms)': '{:.1f}',
'MedMask压缩比 (vs NIfTI)': '{:.1f}x', 'NPZ压缩比 (vs NIfTI)': '{:.1f}x'
}).hide(axis="index"))