Nii转png,Nii转dcm,Dcm转png

本文详细介绍了如何使用Python将Nii文件转换为PNG和DCM格式,以及将DCM转换为PNG。通过读取nii文件并将其保存为不同格式,实现了图像的格式转换。虽然DCM转出的文件缺少头文件信息,但在实际应用中显示效果良好。
摘要由CSDN通过智能技术生成

Nii转png,Nii转dcm,Dcm转png

前言

这篇文章主要是对之前使用的nii文件进行一些格式的转换,nii文件是之前用的LITS数据集,因为需要将其转为png图片和DICOM格式的二维图片。原理基本一致,先把需要转换的文件读取成numpy矩阵,然后再进行转化,主要是保存的时候更改后缀名而已。

Nii转PNG

先将nii中的每个切片读取进来,然后再一张张切片分开保存,代码如下:
单个nii转png

def nii2png_single(nii_path, IsData = True):
    ori_data = sitk.ReadImage(nii_path)  # 读取一个数据
    data1 = sitk.GetArrayFromImage(ori_data)  # 获取数据的array
    if IsData:  #过滤掉其他无关的组织,标签不需要这步骤
        data1[data1 > 250] = 250
        data1[data1 < -250] = -250
    img_name = os.path.split(nii_path)  #分离文件名
    img_name = img_name[-1]
    img_name = img_name.split('.')
    img_name = img_name[0]
    i = data1.shape[0]
    png_path = './png/single_png'   #图片保存位置
    if not os.path.exists(png_path):
        os.makedirs(png_path)
    for j in range(0, i):   #将每一张切片都转为png
        if IsData:  # 数据
            #归一化
            slice_i = (data1[j, :, :] - data1[j, :, :].min()) / (data1[j, :, :].max() - data1[j, :, :].min()) * 255
            cv2.imwrite("%s/%s-%d.png" % (png_path, img_name, j), slice_i)  #保存
        else:   # 标签
            slice_i = data1[j, :, :] * 122
            cv2.imwrite("%s/%s-%d.png" % (png_path, img_name, j), slice_i)  # 保存

批量转换

def nii2png(data_path, label_path):
    dataname_list2 = os.listdir(label_path)
    for nii_label in dataname_list2:
        print("process:", nii_label)
        data1 = sitk.ReadImage(os.path.join(data_path, nii_label.replace('segmentation', 'volume'))) # 读取一个数据
        liver_tumor_data = sitk.GetArrayFromImage(data1)  # 获取数据的array
        data2 = sitk.ReadImage(os.path.join(label_path, nii_label))  # 读取一个数据
        liver_tumor_label = sitk.GetArrayFromImage(data2)  # 获取数据的array
        img_name = os.path.split(nii_label.replace('segmentation', 'volume'))     # 分离文件名,用以保存时的文件名前缀
        img_name = img_name[-1]
        img_name = img_name.split('.')
        img_name = img_name[0]
        i = liver_tumor_label.shape[0]
        liver_tumor_data[liver_tumor_data > 250] = 250
        liver_tumor_data[liver_tumor_data < -250] = -250
        outpath = r'./png/data_png'  # 数据保存文件夹
        outpath2 = r'./png/label_png'   # 标签保存文件夹
        if not os.path.exists(outpath):
            os.makedirs(outpath)
        if not os.path.exists(outpath2):
            os.makedirs(outpath2)
        for j in range(0, i):
            if liver_tumor_label[j, :, :].max() > 0:    # 只保存有肝脏的切片
                img1 = (liver_tumor_data[j, :, :] - liver_tumor_data[j, :, :].min()) / (liver_tumor_data[j, :, :].max() - liver_tumor_data[j, :, :].min()) * 255
                img2 = liver_tumor_label[j, :, :] * 122
                cv2.imwrite("%s/%s-%d.png" % (outpath, img_name, j), img1)
                cv2.imwrite("%s/%s-%d.png" % (outpath2, img_name
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值