以一個病人的腹部淋巴結數據爲例,查看病人的掃描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()