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勾画