nii convert to 2D image【python】

可以自己精简,我的label是二分类

import SimpleITK as sitk
import cv2
from PIL import Image
import numpy as np
import nibabel as nib  # nii格式一般都会用到这个包
import imageio  # 转换成图像
import os

import numpy as np
from scipy.ndimage import rotate
from scipy.ndimage import median_filter
import matplotlib.pyplot as plt



xy = 128
vol1 = int(xy/2)
vol2 = int(xy/4)
vol3 = int(vol2+16)

def preprocess(image):
    result = median_filter(image, size=3)

    """# 添加高斯噪声
    noise = np.random.normal(0, 25, size=image.shape)
    noise_img = image + noise.astype('uint8')

    # 双边滤波
    result = cv2.bilateralFilter(noise_img, 9, 75, 75)

    # 显示图像
    cv2.imshow('src', image)
    cv2.imshow('noise', noise_img)
    cv2.imshow('result', result)
    cv2.waitKey()
    cv2.destroyAllWindows()"""

    return result


def create_dirs(out_path, num):
    for i in range(1, num):  # 这里需要注意,i取不到6,因为range()是前闭后开的,即i的取值范围为1-5。

        dir = os.path.join(r'crop/test4/ct/')
        # 前者为路径,后者为待创建文件夹的名称。注意,批量创建文件夹时不能有重复名称的,因此可以对文件夹加上序号信息。

        isExists = os.path.exists(dir)
        if not isExists:
            os.mkdir(dir)

def mask2d(input_path, output_folder, idx):
    # 加载NIfTI文件
    img = nib.load(input_path)
    data = img
### 使用ResNet处理NIfTI(.nii)文件 为了使用ResNet处理NIfTI格式的医学影像数据,通常需要经过几个主要阶段:数据准备、模型构建与训练以及结果评估。以下是具体实现方式: #### 数据准备 由于原始NIfTI文件通常是三维体素数据,在应用基于二维卷积神经网络如ResNet之前,需先将这些3D图像转换成一系列2D切片。此过程可以通过编写脚本完成,例如`convert_nii_to_png.py`[^2]。 ```python import nibabel as nib from PIL import Image import numpy as np import os def save_slice(image_3d, slice_index, output_path): image_2d = image_3d[:, :, slice_index] img = Image.fromarray((image_2d * 255).astype(np.uint8)) img.save(output_path) def nii_to_png(input_file, output_dir): if not os.path.exists(output_dir): os.makedirs(output_dir) nifti_image = nib.load(input_file) data = nifti_image.get_fdata() for i in range(data.shape[-1]): filename = f"{output_dir}/slice_{str(i)}.png" save_slice(data, i, filename) # Example usage input_nii = 'path/to/input.nii' output_directory = 'path/to/output_slices/' nii_to_png(input_nii, output_directory) ``` 上述代码展示了如何加载`.nii`文件并将其保存为多个PNG图片。这一步骤对于后续利用像ResNet这样的CNN架构至关重要,因为后者更擅长处理平面图像而非体积数据。 #### 构建和调整ResNet模型 接下来就是定义适合特定任务需求的ResNet结构。考虑到医疗图像的特点——高分辨率且可能含有复杂模式——可以选择更深版本的ResNet变种,比如ResNet50或ResNet101,并对其进行适当修改以适应输入大小及输出类别数目的变化。 ```python from tensorflow.keras.applications.resnet_v2 import ResNet50V2 from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.models import Model base_model = ResNet50V2(weights='imagenet', include_top=False, input_shape=(height, width, channels)) x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(num_classes, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers: layer.trainable = False model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 这里展示了一个简单的迁移学习例子,其中冻结了预训练好的ResNet层而只微调顶层分类器部分;当然也可以根据实际情况决定是否解冻更多底层参数来获得更好的性能表现。 #### 训练与验证 准备好数据集之后就可以开始正式训练流程了。需要注意的是,在实际操作中应当预留一部分样本作为测试集合用来最终检验算法效果。此外,针对不同类型的医学影像分析任务(如分类vs分割),所采用的具体策略也会有所差异。 对于像素级语义分割问题,则可借鉴UNet及其改进版DR-Unet的设计思路,即引入跳跃连接机制以便更好地保留空间位置信息的同时提高特征提取能力。 #### 结果后处理 当得到预测结果后,如果希望恢复回原来的三维形式供临床医生查看,则还需要执行逆向的操作即将单张预测图重新组合起来形成完整的脑部或其他器官区域标注图谱。这部分工作同样依赖辅助工具函数实现,类似于之前的切分逻辑只是方向相反而已。 ```python def combine_masks(png_files, shape, output_filename): combined_data = [] for file_name in sorted(png_files): mask_img = Image.open(file_name) mask_array = np.array(mask_img)/255. combined_data.append(mask_array) final_volume = np.stack(combined_data, axis=-1) result_nifti = nib.Nifti1Image(final_volume, affine=np.eye(4)) nib.save(result_nifti, output_filename) # Usage example after prediction step completes predicted_images_folder = '/path/to/prediction_results/' all_pngs = glob.glob(os.path.join(predicted_images_folder,'*.png')) combine_masks(all_pngs, original_volume_shape, './final_segmentation_result.nii') ``` 这段代码片段说明了怎样把先前分离出来的各个层面重建成为一个整体性的三维对象,从而便于进一步的应用场景下使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值