Python DCM转JPG转NRRD转NII方法
本文将介绍以下文件格式间的转换
DCM→JPG
JPG→DCM
DCM→NRRD
NRRD→NII
DCM文件是一种医学影像文件,除了文件信息,还包含影像数据,即图像信息,只要能够提取到这个图像信息,就可以将其转换为如JPG等图片格式。
在医学影像处理中,常用到MASK掩膜,即勾画病灶区域,以进行病理分析预测,将DCM文件转换为JPG格式后,就可以利用OpenCV2等进行病灶勾画。
将DCM转JPG需用到pydicom库,若未安装,可使用控制台输入pip install pydicom进行安装
DCM转JPG可参考这位博主的博客:用python将.dcm格式图像转为.jpg格式 完整代码如下
import pydicom
import scipy.misc
import os
import imageio
import shutil
di=r"C:\Users\Miao\Desktop\Sample\01\T1\\DICOM\\"
#↑↑↑↑ 01号病人的T1类型的DCM数据所在文件夹 ↑↑↑↑
d=r"C:\Users\Miao\Desktop\Sample\01"
#↑↑↑↑ 01号病人文件夹 ↑↑↑↑
def DCMtoJPG(file_path):
global di
global d
c = []#医学影像常使用:多个患者→多种区域或时期DCM数据→多个DCM数据
#的文件夹存储格式,所以使用c存储多个DCM数据,一次性转换所有DCM文件
names = os.listdir(file_path)#file_path为患者数据所在文件夹
for name in names:
index = name.rfind('.')
name = name[:index]
c.append(name)
for files in c:
DCMpath = d+'\T1\DICOM\\'+files+".dcm" #DCM所在文件夹
JPGpath = d+"\T1jpg\\"+files+".jpg" #将JPG保存到此文件夹
data = pydicom.read_file(DCMpath) #使用pydicom读取DCM文件
img = data.pixel_array #使用pydicom读取图像数据
imageio.imsave(JPGpath,img) #保存JPG图像到out_path
原理上讲 此行代码.jpg改为.png等则可以保存为其他图像格式
JPGpath = d+"\T1jpg\\"+files+".jpg" #将JPG保存到此文件夹
PNGpath = d+"\T1jpg\\"+files+".png" #将PNG保存到此文件夹
当然JPG也可以转换为DCM,只是需要一个DCM文件
因为机器一般会直接输出DCM文件,为了方便处理(比如勾画MASK掩膜)我们才会将其转换为JPG然后再转换为DCM,所以我们一般会有原DCM文件,只要我们将原DCM文件里存储图像的数据部分修改为新的JPG图像数据再保存即可将JPG转换为DCM文件
可参考这位博主的博客:Python JPG图片转DCM 原博客未说清为何还需要一个DCM文件才能把JPG转为DCM 在此做了一些解释
代码如下(需要下载opencv2):
import pydicom
import numpy as np
import os
from pydicom.uid import ExplicitVRLittleEndian
import cv2
import imageio
from matplotlib import pylab as plt
img = cv2.imread(r"C:\Users\Miao\Desktop\Sample\01\T1jpg\IMG-0003-00001.jpg")
#↑↑↑↑↑↑读取JPG文件↑↑↑↑↑↑
img_arr16 = np.array(img, dtype=np.uint16)
img_arr16 = img_arr16.astype('int16')
data_changed = img_arr16[:, :, 0] #灰度图像三通道数据相同读取一个通道即可
pd = data_changed.tobytes()
dcm = pydicom.dcmread("001.dcm") #需要一个已有的DCM文件 最好是转为JPG的原DCM文件
dcm.PixelData = pd #将这个DCM文件的图像像素信息修改为JPG文件的数据
dcm.save_as("002.dcm") #保存为新的DCM文件
使用radiomics等库对病理信息进行分析时,可能需要用到NRRD格式的原文件与NII格式的MASK掩膜文件,所以还需要掌握DCM转NRRD以及NRRD转NII的方法
DCM转NRRD可参考这位博主的博客:dcm图片到nrrd的格式转换(二维到三维) 核心代码如下
import SimpleITK as sitk
import os
def DCMtoNRRD(file_path):
out_path = file_path
dcms_name = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(file_path)
dcms_read = sitk.ImageSeriesReader()
dcms_read.SetFileNames(dcms_name)
dcms_series = dcms_read.Execute()
sitk.WriteImage(dcms_series,out_path+'\\NRRD'+'.nrrd') #保存
因为掩膜可能需要用到nii文件,所以还需要NRRD文件转NII文件的方法
可以参考这位博主的博客:nrrd文件格式转NIFTI 需要用到vkt库 若未安装请pip install vkt
核心代码如下:
import vtk
def readnrrd(filename):
reader = vtk.vtkNrrdReader()
reader.SetFileName(filename)
reader.Update()
info = reader.GetInformation()
return reader.GetOutput(), info
def writenifti(image,filename, info):
writer = vtk.vtkNIFTIImageWriter()
writer.SetInputData(image)
writer.SetFileName(filename)
writer.SetInformation(info)
writer.Write()
m, info = readnrrd(r'C:\Users\Miao\Desktop\T1nr\1.nrrd')
writenifti(m,r'C:\Users\Miao\Desktop\T1nr\1.nii', info)
已更新Python手动勾画病灶(Mask掩膜)的方法:Python 医学影像DCM文件Mask掩膜ROI勾画