dicom文件的处理

一、dicom文件

  后缀为.dcm 
  每个病人的一次扫描CT(scan)可能有几十到几百个dcm数据文件(slices)。可以使用python的dicom包读取。其中的pixel_array数据
slices = [dicom.read_file(os.path.join(folder_name,filename)) for filename in os.listdir(folder_name)]
slices = np.stack([s.pixel_array for s in slices])

二、dicom格式数据处理

2.1 处理思路:
首先,医学扫描图像(scan)是三维图像,使用代码可以查看不同的切面的切片(slices),可以从不同的轴切割
其次,医学图像在扫描时,包含了人体的全部组织,需要经过一定的预处理(最重要的是放射剂量的概念)不同的放射剂量对应不同的组织器官 放射剂量单位:HU(Hounsfield Unit)

Hounsfield Unit = pixel_value * rescale_slope + rescale_intercept

一般而言 rescale slope=1,intercept=-1024
灰度值是pixel value经过重重LUT转换得到的用来进行显示的值,且这个转换不可逆,灰度值是无法转换为ct值的。只能根据窗宽窗位得到一个大概的范围。pixel value经过modality lut得到Hu,但是怀疑pixel value的读取出了问题。dicom文化中存在(0028 ,0106)(0028,0107)两个tag,分别是最大和最小pixel value,可以用来检验你读取出来的pixel value矩阵是否正确。
LUT是look up table的简称,实际上就是一张像素灰度值的映射表,他将实际采样得到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对应的灰度值,这样可以起到突出图像的有用信息,增强图像的光对比度的作用。
首先去除超过-2000的pixel_array,CT扫描边界之外的像素值固定为-2000(dicom和mhd都是这个值)。第一步是设定这些值为0

slices[slices == -2000] = 0

3.2处理dicom必要的包

# -*- coding:utf-8 -*-
import glob
import os
import pandas as pd
import SimpleITK as sitk

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import skimage, os
from skimage.morphology import ball, disk, dilation, binary_erosion, remove_small_objects, erosion, closing, reconstruction, binary_closing
from skimage.measure import label,regionprops, perimeter
from skimage.morphology import binary_dilation, binary_opening
from skimage.filters import roberts, sobel
from skimage import measure, feature
from skimage.segmentation import clear_border
from skimage import data
from scipy import ndimage as ndi
import matplotlib
#matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import dicom
import scipy.misc
import numpy as np

Dicom文件是医学图像 的标准文件,这些文件包含了诸多的元数据信息,(比如像素尺寸,每个维度的 像素代表真实人体中的长度)。下面的代码是包含了多个切片(slices)的扫描面,我们仅仅是将其存储为python列表。切片的厚度丢失,即Z轴方向上的像素尺寸,但是可以利用其它的值推测出来,加到元数据中。

# Load the scans in given folder path
def load_scan(path):
    slices = [dicom.read_file(path + '/' + s) for s in os.listdir(path)]
    slices.sort(key = lambda x: int(x.ImagePositionPatient[2]))
    try:
        slice_thickness = np.abs(slices[0].ImagePositionPatient[2] - slices[1].ImagePositionPatient[2])
    except:
        slice_thickness = np.abs(slices[0].SliceLocation - slices[1].SliceLocation)

    for s in slices:
        s.SliceThickness = slice_thickness

    return slices

猜你喜欢

转载自blog.csdn.net/weixin_42152656/article/details/83623188