查看病人的掃描HU值分佈情況(DICOM文件格式)

以一個病人的腹部淋巴結數據爲例,查看病人的掃描HU值分佈情況

# __author: Y
# date: 2020/1/8
# -*- 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 pydicom
import scipy.misc
import numpy as np


# 載入一個掃描面,包含了多個切片(slices)。數據集中每個目錄都是一個掃描面集(一個病人)
# 有個元數據域丟失,即z軸方向上的像素尺寸,也即切片的厚度,可以用其他值推測出來,並加入到元數據中。
# Load the scans in given folder path
# path是數據集的存放路徑,根據需要換爲自己數據集的存放路徑
# path='E:/Python/Practice/ImageProcessing/ABD_LYMPH_001/09-14-2014-ABDLYMPH001-abdominallymphnodes-30274/abdominallymphnodes-26828'
def load_scan(path):
    # 獲取切片
    slices = [pydicom.read_file(path + '/' + s) for s in os.listdir(path)]
    # 按ImagePositionPatient[2]排序,否則得到的掃描面是混亂無序的
    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


# 將圖像的灰度值轉換爲CT值
def get_pixels_hu(slices):
    # 按順序將切片的像素數組壓入棧中
    image = np.stack([s.pixel_array for s in slices])
    # Convert to int16 (from sometimes int16),
    # should be possible as values should always be low enough (<32k)
    # 數據類型轉換爲int16類型的
    image = image.astype(np.int16)
    # Set outside-of-scan pixels to 0   將CT掃描邊界之外的灰度值固定爲-2000,對應空氣爲0
    # The intercept is usually -1024, so air is approximately 0
    image[image == -2000] = 0

    # Convert to Hounsfield units (HU)
    for slice_number in range(len(slices)):
        intercept = slices[slice_number].RescaleIntercept
        slope = slices[slice_number].RescaleSlope
        if slope != 1:
            image[slice_number] = slope * image[slice_number].astype(np.float64)
            image[slice_number] = image[slice_number].astype(np.int16)

        image[slice_number] += np.int16(intercept)

    return np.array(image, dtype=np.int16)


# 查看病人的掃描HU值分佈情況
INPUT_FOLDER = 'E:/Python/Practice/ImageProcessing/ABD_LYMPH_001/09-14-2014-ABDLYMPH001-abdominallymphnodes-30274/abdominallymphnodes-26828'
first_patient = load_scan(INPUT_FOLDER)
first_patient_pixels = get_pixels_hu(first_patient)
plt.hist(first_patient_pixels.flatten(), bins=80, color='c')
plt.xlabel("Hounsfield Units (HU)")
plt.ylabel("Frequency")
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章