nnUNet复现遇到Error: Spacing mismatch between segmentation and corresponding images.(LiTS数据集)

数据集:公开数据集LiTS

背景:已经完成了nnUNet的数据转换的部分(即Task040_Liver已经转换成Dataset040_Liver)

下一步执行数据预处理操作的时候,出现了错误Error: Spacing mismatch between segmentation and corresponding images.

数据预处理:nnUNetv2_plan_and_preprocess -d 040 --verify_dataset_integrity

原因:分割标签和原始图像的空间分辨率(体素间距)不一致
解决:因此我们要将label和原始图像的空间分辨率(体素间距)统一

from nibabel.processing import resample_from_to
import nibabel as nib
import os

# imgs_path是Dataset040_Liver的imagesTr
# lab_path是Dataset040_Liver的labelsTr
# save_path是自己设置的。统一体素间距后label保存的路径,可以自定义,后面取代Dataset040_Liver的labelsTr

imgs_path = r'F:\nnUNet-master\nnUNet-master\nnUNetFrame\nnUNet_raw\Dataset040_Liver\imagesTr'
lab_path = r'F:\nnUNet-master\nnUNet-master\nnUNetFrame\nnUNet_raw\Dataset040_Liver\labelsTr'
save_path = r'F:\nnUNet-master\nnUNet-master\nnUNetFrame\nnUNet_raw\Dataset040_Liver\labelsTr\label'

for image in os.listdir(imgs_path):
    img_path = imgs_path + '/' + image   # image:Liver_000_0000.nii.gz
    original_img = nib.load(img_path)    # 原始图像的路径
    base_name = image.split("_")[:-1]
    label_name = "_".join(base_name) + ".nii.gz"   # Liver_000.nii.gz
    label_path = lab_path + '/' + label_name  # 原始label的路径
    segmentation_img = nib.load(label_path)
    target_affine = original_img.affine
    target_shape = original_img.shape
    resampled_seg = resample_from_to(segmentation_img, (target_shape, target_affine), order=0)
    save_path_ = save_path + '/' + label_name
    nib.save(resampled_seg, save_path_)
    print("Finish:", save_path_)

PS: 看注释

### 加载和预处理 LiTS 数据集 #### 使用 Python 处理 LiTS 数据集 LiTS(Liver Tumor Segmentation Challenge)是一个公开的医学图像数据集,主要用于肝脏及其肿瘤的分割任务。该数据集由 CT 扫描组成,通常以 NIfTI (.nii 或 .nii.gz) 文件格式存储。 为了加载和预处理这些文件,可以使用 `SimpleITK` 和 `Nibabel` 这两个库来读取 `.nii` 格式的医学图像[^1]。以下是具体的实现方法: #### 安装必要的依赖项 在开始之前,请确保安装了以下 Python 库: ```bash pip install SimpleITK nibabel numpy matplotlib scipy ``` #### 代码示例:加载和显示 NIfTI 图像 下面是一段用于加载并可视化单张切片的代码: ```python import SimpleITK as sitk import nibabel as nib import numpy as np import matplotlib.pyplot as plt def load_nifti_image(file_path): """Load a NIfTI image and return the data array.""" img = nib.load(file_path) return img.get_fdata() def display_slice(image_3d, slice_idx=50): """Display a specific slice of a 3D medical image.""" plt.figure(figsize=(8, 6)) plt.imshow(image_3d[:, :, slice_idx], cmap='gray') plt.title(f'Slice {slice_idx}') plt.axis('off') plt.show() # Example usage file_path = 'path_to_lits_data/liver_volume.nii' image_data = load_nifti_image(file_path) display_slice(image_data, slice_idx=70) ``` 上述代码展示了如何通过指定索引来查看三维体积中的某个二维切片[^2]。 #### 预处理步骤 对于 LiTS 数据集,常见的预处理步骤包括但不限于以下几个方面: 1. **归一化** 将像素值缩放到 `[0, 1]` 范围内以便于后续训练过程。 ```python def normalize_image(image): min_val = np.min(image) max_val = np.max(image) normalized_image = (image - min_val) / (max_val - min_val) return normalized_image ``` 2. **重采样** 不同扫描仪可能具有不同的体素间距,因此需要统一分辨率。 ```python def resample_image(itk_image, new_spacing=[1.0, 1.0, 1.0]): original_spacing = itk_image.GetSpacing() original_size = itk_image.GetSize() new_size = [ int(np.round(original_size[0] * (original_spacing[0] / new_spacing[0]))), int(np.round(original_size[1] * (original_spacing[1] / new_spacing[1]))), int(np.round(original_size[2] * (original_spacing[2] / new_spacing[2]))) ] resampler = sitk.ResampleImageFilter() resampler.SetOutputSpacing(new_spacing) resampler.SetSize(new_size) resampler.SetInterpolator(sitk.sitkLinear) resampled_img = resampler.Execute(itk_image) return resampled_img ``` 3. **数据增强** 常见的操作有随机翻转、旋转以及裁剪等,这有助于提升模型的鲁棒性和泛化性能。 ```python import random def augment_image(image): if random.random() < 0.5: image = np.flip(image, axis=0).copy() # Horizontal flip if random.random() < 0.5: image = np.flip(image, axis=1).copy() # Vertical flip angle = random.uniform(-10, 10) rotated_image = rotate_image(image, angle) # Custom function to handle rotation return rotated_image ``` 4. **N4 Bias Field Correction** 如果存在强度不均匀性,则可应用此技术进行校正,尽管它可能会增加计算开销[^3]。 #### 总结 以上介绍了从加载到基本预处理整个流程的关键部分。实际项目中可以根据具体需求调整参数设置或者引入更复杂的算法优化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值