Nii转png,Nii转dcm,Dcm转png

  • 前言
  • 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)  # 获取数据的arrayif IsData:  #过滤掉其他无关的组织,标签不需要这步骤data1[data1 > 250] = 250data1[data1 < -250] = -250img_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):   #将每一张切片都转为pngif IsData:  # 数据#归一化slice_i = (data1[j, :, :] - data1[j, :, :].min()) / (data1[j, :, :].max() - data1[j, :, :].min()) * 255cv2.imwrite("%s/%s-%d.png" % (png_path, img_name, j), slice_i)  #保存else:   # 标签slice_i = data1[j, :, :] * 122cv2.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)  # 获取数据的arraydata2 = sitk.ReadImage(os.path.join(label_path, nii_label))  # 读取一个数据liver_tumor_label = sitk.GetArrayFromImage(data2)  # 获取数据的arrayimg_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] = 250liver_tumor_data[liver_tumor_data < -250] = -250outpath = 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()) * 255img2 = liver_tumor_label[j, :, :] * 122cv2.imwrite("%s/%s-%d.png" % (outpath, img_name, j), img1)cv2.imwrite("%s/%s-%d.png" % (outpath2, img_name, j), img2)

Nii转DCM

注意,因为原来的nii文件中就没有DICOM文件中特有的头文件信息,所以转换出来的DICOM文件实际上是缺少了头文件的信息的,算是伪DICOM文件,在使用的时候个人感觉并没有什么不对劲的地方,DICOM文件转为PNG图片显示出来的效果基本和Nii转PNG的效果一致,但是要特别注意的是读取DICOM文件的时候要强制读取。
单个Nii转DCM

def nii2dcm_single(nii_path, IsData = True):save_folder = './dcm/dcm_single'if not os.path.exists(save_folder):os.makedirs(save_folder)ori_data = sitk.ReadImage(nii_path)  # 读取一个数据data1 = sitk.GetArrayFromImage(ori_data)  # 获取数据的arrayif IsData:  # 过滤掉其他无关的组织,标签不需要这步骤data1[data1 > 250] = 250data1[data1 < -250] = -250img_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]# 关键部分castFilter = sitk.CastImageFilter()castFilter.SetOutputPixelType(sitk.sitkInt16)for j in range(0, i):   #将每一张切片都转为pngif IsData:  # 数据slice_i = data1[j, :, :]data_img = sitk.GetImageFromArray(slice_i)# Convert floating type image (imgSmooth) to int type (imgFiltered)data_img = castFilter.Execute(data_img)sitk.WriteImage(data_img, "%s/%s-%d.dcm" % (save_folder, img_name, j))else:   # 标签slice_i = data1[j, :, :] * 122label_img = sitk.GetImageFromArray(slice_i)# Convert floating type image (imgSmooth) to int type (imgFiltered)label_img = castFilter.Execute(label_img)sitk.WriteImage(label_img, "%s/%s-%d.dcm" % (save_folder, img_name, j))

批量转换

def nii2dcm(data_path, lable_path, IsTrain = False):save_folder = './dcm'nii_list = os.listdir(lable_path)for nii_label in nii_list:print("process:", nii_label)data1 = sitk.ReadImage(os.path.join(lable_path, nii_label)) # 读取一个数据liver_tumor_label = sitk.GetArrayFromImage(data1)  # 获取数据的arrayprint(np.unique(liver_tumor_label))data2 = sitk.ReadImage(os.path.join(data_path, nii_label.replace('segmentation', 'volume')))  # 读取一个数据liver_tumor_data = sitk.GetArrayFromImage(data2)  # 获取数据的arrayslice_num = liver_tumor_label.shape[0]     # 获取切片数量if IsTrain:save_img = save_folder+'/train'else:save_img = save_folder + '/val'label_path = save_folder+'/label'     # 设置保存路径if not os.path.exists(save_img):      # 判断文件目录是否存在,不存在则创建os.makedirs(save_img)if not os.path.exists(label_path):os.makedirs(label_path)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]for i in range(0, slice_num):# 关键部分if liver_tumor_label[i, :, :].max() > 0:    # 肝脏标签图片label_img = sitk.GetImageFromArray(liver_tumor_label[i, :, :] * 122)data_img = sitk.GetImageFromArray(liver_tumor_data[i, :, :])castFilter = sitk.CastImageFilter()castFilter.SetOutputPixelType(sitk.sitkInt16)# Convert floating type image (imgSmooth) to int type (imgFiltered)label_img = castFilter.Execute(label_img)data_img = castFilter.Execute(data_img)sitk.WriteImage(label_img, "%s/%s-%d.dcm" % (label_path, img_name, i))sitk.WriteImage(data_img, "%s/%s-%d.dcm" % (save_img, img_name, i))

DCM转PNG

单个DCM转PNG

def dcm2png_single(dcm_path):save_pa = r'./png/single'if not os.path.exists(save_pa):os.makedirs(save_pa)img_name = os.path.split(dcm_path.replace('.dcm', '.png'))  # 替换后缀名并分离路径img_name = img_name[-1]ds = pydicom.read_file(dcm_path, force=True)       # 注意这里,强制读取img = ds.pixel_array  # 提取图像信息cv2.imwrite(os.path.join(save_pa, img_name), img)

批量转换

def dcm2png(dcm_path, label_path):labellist = os.listdir(label_path)save_data = r'./png/dcm_png_data'save_lab = r'./png/dcm_png_lab'if not os.path.exists(save_data):os.makedirs(save_data)if not os.path.exists(save_lab):os.makedirs(save_lab)for lab in labellist:print('process', lab)ds = pydicom.read_file(os.path.join(label_path, lab), force=True)   # 注意这里,强制读取label = ds.pixel_array  # 提取图像信息ds1 = pydicom.read_file(os.path.join(dcm_path, lab), force=True)img = ds1.pixel_array  # 提取图像信息cv2.imwrite(os.path.join(save_data, lab.replace('.dcm', '.png')), img)cv2.imwrite(os.path.join(save_lab, lab.replace('.dcm', '.png')), label)

完整代码

import os
import SimpleITK as sitk
import cv2
import pydicom
import numpy as npdef nii2png_single(nii_path, IsData = True):ori_data = sitk.ReadImage(nii_path)  # 读取一个数据data1 = sitk.GetArrayFromImage(ori_data)  # 获取数据的arrayif IsData:  #过滤掉其他无关的组织,标签不需要这步骤data1[data1 > 250] = 250data1[data1 < -250] = -250img_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):   #将每一张切片都转为pngif IsData:  # 数据#归一化slice_i = (data1[j, :, :] - data1[j, :, :].min()) / (data1[j, :, :].max() - data1[j, :, :].min()) * 255cv2.imwrite("%s/%s-%d.png" % (png_path, img_name, j), slice_i)  #保存else:   # 标签slice_i = data1[j, :, :] * 122cv2.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)  # 获取数据的arraydata2 = sitk.ReadImage(os.path.join(label_path, nii_label))  # 读取一个数据liver_tumor_label = sitk.GetArrayFromImage(data2)  # 获取数据的arrayimg_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] = 250liver_tumor_data[liver_tumor_data < -250] = -250outpath = 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()) * 255img2 = liver_tumor_label[j, :, :] * 122cv2.imwrite("%s/%s-%d.png" % (outpath, img_name, j), img1)cv2.imwrite("%s/%s-%d.png" % (outpath2, img_name, j), img2)def nii2dcm_single(nii_path, IsData = True):save_folder = './dcm/dcm_single'if not os.path.exists(save_folder):os.makedirs(save_folder)ori_data = sitk.ReadImage(nii_path)  # 读取一个数据data1 = sitk.GetArrayFromImage(ori_data)  # 获取数据的arrayif IsData:  # 过滤掉其他无关的组织,标签不需要这步骤data1[data1 > 250] = 250data1[data1 < -250] = -250img_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]# 关键部分castFilter = sitk.CastImageFilter()castFilter.SetOutputPixelType(sitk.sitkInt16)for j in range(0, i):   #将每一张切片都转为pngif IsData:  # 数据slice_i = data1[j, :, :]data_img = sitk.GetImageFromArray(slice_i)# Convert floating type image (imgSmooth) to int type (imgFiltered)data_img = castFilter.Execute(data_img)sitk.WriteImage(data_img, "%s/%s-%d.dcm" % (save_folder, img_name, j))else:   # 标签slice_i = data1[j, :, :] * 122label_img = sitk.GetImageFromArray(slice_i)# Convert floating type image (imgSmooth) to int type (imgFiltered)label_img = castFilter.Execute(label_img)sitk.WriteImage(label_img, "%s/%s-%d.dcm" % (save_folder, img_name, j))def nii2dcm(data_path, lable_path, IsTrain = False):save_folder = './dcm'nii_list = os.listdir(lable_path)for nii_label in nii_list:print("process:", nii_label)data1 = sitk.ReadImage(os.path.join(lable_path, nii_label)) # 读取一个数据liver_tumor_label = sitk.GetArrayFromImage(data1)  # 获取数据的arrayprint(np.unique(liver_tumor_label))data2 = sitk.ReadImage(os.path.join(data_path, nii_label.replace('segmentation', 'volume')))  # 读取一个数据liver_tumor_data = sitk.GetArrayFromImage(data2)  # 获取数据的arrayslice_num = liver_tumor_label.shape[0]     # 获取切片数量if IsTrain:save_img = save_folder+'/train'else:save_img = save_folder + '/val'label_path = save_folder+'/label'     # 设置保存路径if not os.path.exists(save_img):      # 判断文件目录是否存在,不存在则创建os.makedirs(save_img)if not os.path.exists(label_path):os.makedirs(label_path)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]for i in range(0, slice_num):# 关键部分if liver_tumor_label[i, :, :].max() > 0:    # 肝脏标签图片label_img = sitk.GetImageFromArray(liver_tumor_label[i, :, :] * 122)data_img = sitk.GetImageFromArray(liver_tumor_data[i, :, :])castFilter = sitk.CastImageFilter()castFilter.SetOutputPixelType(sitk.sitkInt16)# Convert floating type image (imgSmooth) to int type (imgFiltered)label_img = castFilter.Execute(label_img)data_img = castFilter.Execute(data_img)sitk.WriteImage(label_img, "%s/%s-%d.dcm" % (label_path, img_name, i))sitk.WriteImage(data_img, "%s/%s-%d.dcm" % (save_img, img_name, i))def dcm2png_single(dcm_path):save_pa = r'./png/single'if not os.path.exists(save_pa):os.makedirs(save_pa)img_name = os.path.split(dcm_path.replace('.dcm', '.png'))  # 替换后缀名并分离路径img_name = img_name[-1]ds = pydicom.read_file(dcm_path, force=True)       # 注意这里,强制读取img = ds.pixel_array  # 提取图像信息cv2.imwrite(os.path.join(save_pa, img_name), img)def dcm2png(dcm_path, label_path):labellist = os.listdir(label_path)save_data = r'./png/dcm_png_data'save_lab = r'./png/dcm_png_lab'if not os.path.exists(save_data):os.makedirs(save_data)if not os.path.exists(save_lab):os.makedirs(save_lab)for lab in labellist:print('process', lab)ds = pydicom.read_file(os.path.join(label_path, lab), force=True)   # 注意这里,强制读取label = ds.pixel_array  # 提取图像信息ds1 = pydicom.read_file(os.path.join(dcm_path, lab), force=True)img = ds1.pixel_array  # 提取图像信息cv2.imwrite(os.path.join(save_data, lab.replace('.dcm', '.png')), img)cv2.imwrite(os.path.join(save_lab, lab.replace('.dcm', '.png')), label)if __name__ == "__main__":# 单个nii文件转pngnii_single = r'G:\Python\liversegment\ImageResource\ImageTraning\data\volume-0.nii'nii2png_single(nii_single, IsData=False)# 按照标签提取切片,只保存有肝脏的切片niipath = r'G:\Python\liversegment\ImageResource\ImageTraning\data'labpath = r'G:\Python\liversegment\ImageResource\ImageTraning\label'nii2png(niipath, labpath)# 单个nii转dcmnii2dcm_single(nii_single, True)# 批量nii转dcmnii2dcm(niipath, labpath, IsTrain=True)# 单个dcm转pngdcm_single = r'F:\Liver\Unet_4_23\dcm\train\volume-0-55.dcm'dcm2png_single(dcm_single)# 批量dcm转pngdcm_pa = r'F:\Liver\Unet_4_23\dcm\train'lab_dcm = r'F:\Liver\Unet_4_23\dcm\label'dcm2png(dcm_pa, lab_dcm)

结束语

代码基本上都是自己从网上找到,然后根据自己的实际来修改使用的,代码全部都测试过,自己用的时候没有问题。本人的水平有限,如有不当之处,敬请指正。

Nii转png,Nii转dcm,Dcm转png相关推荐

  1. CT数据将.nii格式或.nii.gz格式转换为dcm格式

    1.先转换.nii格式或.nii.gz格式转换为dcm格式 import SimpleITK as sitkimage=sitk.ReadImage(r"D:\python\project\ ...

  2. Python JPG转DCM,DCM转JPG,DCM转NRRD,NRRD转NII

    Python DCM转JPG转NRRD转NII方法 本文将介绍以下文件格式间的转换 DCM→JPG JPG→DCM DCM→NRRD NRRD→NII DCM文件是一种医学影像文件,除了文件信息,还包 ...

  3. python包NiBabel对医学影像文件格式进行读写并可视化实战:查看和显示.nii.gz、.nii文件

    python包NiBabel对医学影像文件格式进行读写并可视化实战:查看和显示.nii.gz..nii文件 目录 python包NiBabel对医学影像文件格式进行读写并可视化实战:查看和显示.nii ...

  4. python读取nii文件、nii.gz文件

    显示标准nii.gz或nii文件 import numpy as np import nibabel as nib from ipywidgets import interact, interacti ...

  5. nii格式和nii.gz格式详解

    文章目录 nii基础 hdr/header Extension Image 坐标 体素 转换矩阵 转换矩阵内部参数概念 转换矩阵组成 转换矩阵应用 nii格式 最后 nii基础 大部分医学领域导出di ...

  6. Nibabel 读取 nii 文件和 nii.gz 文件

    读取nii文件并且将nii文件转换为png格式 import numpy as np import nibabel as nib import os import imageio# 文件路径 nii_ ...

  7. MATLAB批量处理.nii文件----批量.nii转为jpg格式

    现在粗略给大家一点建议 1. NIFTI出现原因 .nii文件是NIFTI格式的文件,出现的原因是原来一种图像格式是ANALYZE 7.5 format,但是这个图像格式缺少一些信息,比如没有方向信息 ...

  8. 标定数据分析-DCM(.DCM)

    欢迎关注<汽车软件技术>公众号,回复关键字获取资料. 1. DCM介绍 DCM(Data Conservation Format)是一种标定数据文件格式,文件后缀是".dcm&q ...

  9. 批量转换nii文件为nii.gz格式

    1. 使用工具MATLAB 在nii文件的文件夹下打开matlab命令行,输入代码片段. gzip('*.nii')

最新文章

  1. 使用t-SNE算法对数据进行降维并可视化实战,与KernalPCA、LLE对比降维可视化的效果
  2. 人脸照片秒变艺术肖像画:清华大学提出APDrawingGAN CVPR 2019 oral paper
  3. TaggerX——AI数据标注引入乡村振兴工作站解决农村地区青年就业问题【数据故事计划一等奖】...
  4. 深度学习DL调参隐藏层节点数对网络性能的影响
  5. 怎么用vnc访问自己内网电脑,同时又是同一个会话?
  6. 《线性代数及其应用 第四版》习题1.4
  7. 第十三届蓝桥杯省赛Java-B组
  8. 论win10专业版,企业版和教育版之间自由切换的方法和密钥
  9. 内存条hyperx_HyperX是什么牌子内存条
  10. 东北大学计算机学院教授,东北大学之计算机系
  11. 网易MUMU模拟器怎么设置不卡?
  12. 组建计算机网络通常采用3种模式,对等网的组建_计算机中的543原则_计算机网络工作模式(2)...
  13. JDK的多版本安装 及 切换
  14. 我开发了一个机器人应用,让 HEXA 机器人可以追逐光——HEXA The Light Chaser
  15. delphi透明panel组件或者制作方法
  16. android 对象 保存,Android使用SharedPreferences保存对象
  17. 那么,我是不工作会死啦?
  18. spring boot 启动报错Log4j2 could not find a logging implementation 解决
  19. Unfolding the Alternating Optimization for Blind Super Resolution
  20. 显示器IPS屏和TN屏的优缺点及差异

热门文章

  1. :before和::before是什么区别
  2. 15个最好的免费开源电子商务平台
  3. 一文讲透aPaaS平台是什么
  4. 植物大战僵尸取消暂停
  5. 爬虫——记一次奇妙的异步请求爬取
  6. ERD Online 4.0.4 元数据在线建模(免费、私有部署)
  7. 新库上线 | CnOpenDataA股上市公司IPO申报发行文本数据
  8. linux下的php编辑器
  9. 惠普战66 三代 pro win10下安装ubuntu20.04
  10. 拨乱反正!关于LoRaWAN的7个常见误解