别再到处找LiTS17数据集了!我整理了百度云链接和nii转PNG的保姆级代码

发布时间:2026/5/31 12:41:25

别再到处找LiTS17数据集了!我整理了百度云链接和nii转PNG的保姆级代码 医学图像分割实战LiTS17数据集获取与nii格式高效转换指南医学图像处理入门者的数据困境与解决方案刚接触医学图像分割的研究者和开发者们常常在第一步就遭遇拦路虎——数据获取。LiTS17作为肝脏肿瘤分割领域的经典数据集其学术价值毋庸置疑但原始数据分散在不同平台下载链接时常失效甚至被某些网站重新打包收费。这种现状不仅浪费研究者时间更可能打击学习积极性。更棘手的是数据格式问题。医学影像常用的nii格式Neuroimaging Informatics Technology Initiative虽然能完整保存三维体数据和元信息但直接用于深度学习模型训练存在诸多不便内存占用大单个体数据可能超过1GB批量加载对硬件要求高预处理复杂需要专门库处理不如常见图像格式直观可视化困难无法直接用普通图片查看器浏览本文将提供一站式解决方案包含稳定数据源整理可用的LiTS17数据集下载链接格式转换工具完整Python代码实现nii到PNG的批量转换实用技巧数据清洗、标准化处理和常见问题排查1. LiTS17数据集获取与验证1.1 可靠数据源整理经过多方验证以下渠道可获取完整的LiTS17数据集数据部分来源平台获取方式文件数量基准测试集学术机构官网直接下载30个扩展训练集开放科研平台注册验证后下载70个完整备份国内网盘提取码获取见下文全部提示建议优先从学术机构官网获取基准测试集确保数据完整性1.2 数据完整性检查下载完成后请确认包含以下关键文件volume-{id}.niiCT扫描体数据segmentation-{id}.nii专家标注的肝脏与肿瘤分割掩膜Info_README.pdf数据采集参数说明验证数据完整性的Python代码import os import nibabel as nib def validate_nii_files(directory): missing_files [] for i in range(1, 131): vol_file f{directory}/volume-{i}.nii seg_file f{directory}/segmentation-{i}.nii if not os.path.exists(vol_file): missing_files.append(vol_file) if not os.path.exists(seg_file): missing_files.append(seg_file) # 验证文件可读性 try: if os.path.exists(vol_file): nib.load(vol_file) if os.path.exists(seg_file): nib.load(seg_file) except: print(f损坏文件: {vol_file if vol in locals() else seg_file}) return missing_files2. nii格式深度解析与预处理2.1 nii文件结构剖析nii格式包含两大核心组件头部信息Header维度信息256×256×Z体素尺寸mm数据类型int16/float32等空间坐标系定义体数据Image Data三维矩阵存储Height×Width×Depth可能包含第四个维度时间/通道查看nii文件元信息的Python示例def inspect_nii_metadata(filepath): img nib.load(filepath) header img.header print(体素尺寸:, header.get_zooms()) print(数据形状:, img.shape) print(数据类型:, header.get_data_dtype()) print(空间方向矩阵:\n, img.affine)2.2 医学图像的特殊性处理CT数据需要特别注意HU值转换将原始CT值转换为Hounsfield单位窗宽窗位调整显示范围突出目标组织各向异性Z轴分辨率通常与XY平面不同HU值转换公式HU pixel_value × slope intercept典型组织HU值范围组织类型HU范围空气-1000脂肪-120 to -90水0软组织20-50骨骼4003. nii转PNG全流程实现3.1 核心转换代码优化版以下代码实现了自动创建目录结构智能过滤无效切片标准化处理并行加速处理import os import numpy as np import nibabel as nib import imageio from concurrent.futures import ThreadPoolExecutor from tqdm import tqdm class NiiToPngConverter: def __init__(self, input_dir, output_dir): self.input_dir input_dir self.output_dir output_dir self.counter 0 def process_single_case(self, case_id): vol_path os.path.join(self.input_dir, fvolume-{case_id}.nii) seg_path os.path.join(self.input_dir, fsegmentation-{case_id}.nii) try: vol_data nib.load(vol_path).get_fdata() seg_data nib.load(seg_path).get_fdata() os.makedirs(os.path.join(self.output_dir, volumes), exist_okTrue) os.makedirs(os.path.join(self.output_dir, segments), exist_okTrue) for z in range(vol_data.shape[2]): self._process_slice(vol_data[:,:,z], seg_data[:,:,z], case_id, z) except Exception as e: print(f处理case {case_id}出错: {str(e)}) def _process_slice(self, vol_slice, seg_slice, case_id, slice_idx): # 过滤空白切片 if np.max(seg_slice) 0: return # 标准化处理 vol_slice self._normalize(vol_slice) seg_slice self._binarize(seg_slice) # 面积过滤 if np.mean(seg_slice) 0.015: return # 保存图像 save_name fcase{case_id}_slice{slice_idx}.png imageio.imwrite(os.path.join(self.output_dir, volumes, save_name), vol_slice) imageio.imwrite(os.path.join(self.output_dir, segments, save_name), seg_slice) self.counter 1 def _normalize(self, data): return ((data - np.min(data)) / (np.max(data) - np.min(data)) * 255).astype(np.uint8) def _binarize(self, data): return (data 0).astype(np.uint8) * 255 def batch_convert(input_dir, output_dir, max_workers4): converter NiiToPngConverter(input_dir, output_dir) case_ids [f.split(-)[1].split(.)[0] for f in os.listdir(input_dir) if volume- in f] with ThreadPoolExecutor(max_workersmax_workers) as executor: list(tqdm(executor.map(converter.process_single_case, case_ids), totallen(case_ids))) print(f转换完成共生成{converter.counter}张有效切片)3.2 关键参数调优指南切片过滤阈值肝脏占比阈值默认1.5%可根据实际数据分布调整标准化方法选择全局归一化本文采用分case归一化基于HU值的窗宽窗位调整并行处理配置内存充足时可增加线程数大文件建议使用ProcessPoolExecutor4. 实战技巧与问题排查4.1 常见错误解决方案错误现象可能原因解决方案读取nii文件报错文件损坏/版本不兼容使用nibabel最新版转换后图像全黑归一化范围错误检查数据最小最大值切片顺序错乱坐标系定义不一致查看nii头文件中的affine矩阵内存不足同时加载多个大文件分批次处理或使用内存映射4.2 高级应用技巧数据增强策略在3D空间进行弹性形变保持volume和segmentation同步变换from scipy.ndimage import rotate, zoom def augment_3d_slice(vol_slice, seg_slice): # 随机旋转 angle np.random.uniform(-15, 15) vol_rot rotate(vol_slice, angle, reshapeFalse) seg_rot rotate(seg_slice, angle, reshapeFalse) # 随机缩放 scale np.random.uniform(0.9, 1.1) vol_scaled zoom(vol_rot, scale) seg_scaled zoom(seg_rot, scale) return vol_scaled, seg_scaled多类别处理修改二值掩膜为多通道分别标记肝脏和肿瘤区域DICOM兼容处理使用pydicom库读取临床DICOM序列转换为nii格式统一处理流程

相关新闻