def crop_image_and_mask(image_path, mask_path, mask_expansion=0):
    # 加载图像和掩膜数据
    image_nii = nib.load(image_path)
    mask_nii = nib.load(mask_path)
    # 获取图像和掩膜的 numpy 数组
    image_data = image_nii.get_fdata()
    mask_data = mask_nii.get_fdata()
    # 获取图像的空间分辨率(单位为毫米)
    voxel_size = image_nii.header.get_zooms()  # 获取像素尺寸(x, y, z方向上的尺寸,单位是毫米)
    # 转换 mask_expansion 从毫米到像素
    expansion_pixels = [int(mask_expansion / size) for size in voxel_size]
    # 获取掩膜中非零值的坐标
    mask_nonzero_coords = np.argwhere(mask_data > 0)
    # 找到掩膜的最小和最大坐标
    min_coords = mask_nonzero_coords.min(axis=0)
    max_coords = mask_nonzero_coords.max(axis=0)
    # 扩展掩膜的范围
    min_coords_expanded = np.maximum(min_coords - expansion_pixels, 0)
    max_coords_expanded = np.minimum(max_coords + expansion_pixels, image_data.shape)
    # 截取图像和掩膜中对应的部分
    cropped_image_data = image_data[min_coords_expanded[0]:max_coords_expanded[0] + 1,
                         min_coords_expanded[1]:max_coords_expanded[1] + 1,
                         min_coords_expanded[2]:max_coords_expanded[2] + 1]
    cropped_mask_data = mask_data[min_coords_expanded[0]:max_coords_expanded[0] + 1,
                        min_coords_expanded[1]:max_coords_expanded[1] + 1,
                        min_coords_expanded[2]:max_coords_expanded[2] + 1]
    # 打印扩展后的起始和终止坐标
    print(f"Expanded crop start coordinates: {min_coords_expanded}")
    print(f"Expanded crop end coordinates: {max_coords_expanded}")
    # 创建新的 nifti 图像
    cropped_image_nii = nib.Nifti1Image(cropped_image_data, image_nii.affine)
    cropped_mask_nii = nib.Nifti1Image(cropped_mask_data, mask_nii.affine)
    # 保存截取后的图像和掩膜
    nib.save(cropped_image_nii, image_path.replace('image', f'image_ROI_{mask_expansion}_{mask_expansion}_{mask_expansion}'))
    nib.save(cropped_mask_nii, mask_path.replace('label', f'label_ROI_{mask_expansion}_{mask_expansion}_{mask_expansion}'))
	
相关