锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【医学图像分割】CT医学图像的预处理(重采样)

时间:2022-11-14 18:30:01 温度传感器wklct7731钳式传感器

CT图像中有两个基本概念,窗口(window width)和窗位(window center),选择感兴趣的CT由于人体组织结构不同,X线吸收程度不同,值范围不同CT值,所以可以用CT确定组织的性质是值得的。CT值的单位为Hounsfield

Hounsfield单位(HU)是计算机断层扫描(CT)无量纲单位广泛应用于标准、方便的表达CT数值。Hounsfield单位通过线性变换测量的衰减系数获得。这种转换是基于空气和密度,纯水被定义为0 Hounsfield空气被定义为-10000 Hounsfield单元。组织密度越大,x射线吸收越强,其值为正,信号明亮;低密度组织,x射线吸收较少,显示负值和暗信号。Hounsfield该单位于1979年获得诺贝尔生理学或医学奖Godfrey Hounsfield爵士的名字命名表彰他CT对发明的贡献。

窗宽是CT显示在图像上CT值范围,在此CT不同模拟灰度显示值范围内的组织和病变。而CT组织和病变的组织和病变,无论高程度如何,都以白影显示,不再有灰度差异; 相反,低于这一范围的组织结构,无论有多低,都以黑影显示,没有灰度差异。增加窗宽,图像显示CT增加值范围,显示不同密度的组织结构增加,但结构之间的灰度差减少。减少窗宽,显示的组织结构减少,但结构之间的灰度差增加。例如,观察大脑的窗宽通常为-15~ 85H,即密度在-15 ~ 85H脑质和脑脊液间隙等各种结构均以不同的灰度显示。而高于 85H骨质几颅内钙化等组织结构,虽然密度差,但白影显示,无灰度差;低于-15H皮下脂肪、乳突内气体等组织结构均以黑影显示,其间无灰度差异。

窗位是窗的中心位置,窗宽相同,因为窗位不同,包括CT值范围的CT值也有差异。例如,窗宽为100H,当窗位为0H时,其CT值范围为-50 ~ 50H ; 如窗位为 35H时,则CT值范围为-15~ 85H。通常,如果你想观察组织结构和病变,你应该使用组织CT值为窗位。例如脑质CT值约为 35H,在观察脑组织及其病变时,选择窗口 35H为妥。

常见的人体组织CT值

(1) 液体CT值:-10~10Hu,水的CT值为0Hu;

(2) 空气CT值:-1000Hu;

(3) 脂肪CT值:-10~90Hu;

(4) 软组织如肝脾肾、脑实质等CT值:20~50Hu;

(5) 骨性组织CT值一般超过300Hu;骨皮质一般CT值超过 1000Hu;

(6) 腹部常用CT值:-160~240Hu

以下是腹窗图像预处理:

# 选择腹窗 def pretreatmentImage(image):     image[image < -160] = 0     image[image > 240] = 0      return image

重采样医学图像:

对于一张大小为128*在计算机中,128的彩色图像可以表示为128*128*每个像素点的值范围为0-255,不同的值代表不同的亮度。但是对于医学图像来说,它是由几个slice假设每一个slice的大小为512*512单通道图像,每个像素点都表示一个体素的值,其范围可以-1万~2000之间。接下来,通过胰腺分割数据集中PANCREAS_0015.nii.gz例如,解释医学图像中体素的概念。Spacing(0.78125, 0.78125, 1.0)表示原始图像体素的大小,也可以Spacing想象大小为(0.78125, 0.78125, 1.0)长方体。原始图像Size为 (512, 512, 247)表示X轴原有,Y轴,Z轴中体素的数量。原始图像的size*对应的Spacing能得到真实3D图像大小(512*0.78125,512*0.78125,247*1 ),图像采样只是修改体素的大小,而真实3D图像大小保持不变,所以假设我们会Spacing修改成(1.0, 1.0, 2.0)的时候,修改后对应size应该为((512*0.78125)/ 1.0,(512*0.78125)/ 1.0,(247*1 )/ 2.0)即(400, 400, 124)。

import pydicom path = "" dcm_data = pydicom.read_file(path) print(dcm_data.PixelSpacing, dcm_data.SliceThickness) # 检查医学图像的体素大小和切片间距

重采样代码:

def img_resmaple(path, new_spacing=[1.0, 1.0, 1.0]):     data = STK.ReadImage(path)     image = STK.GetArrayFromImage(data) # 获取图像     # print(image.shape)     original_spacing = data.GetSpacing()     # print(original_spacing)     original_size = data.GetSize()     # print(data.GetOrigin(), data.GetDirection())     new_shape = [         int(np.round(original_spacing[0] * original_size[0] / new_spacing[0])),         int(np.round(original_spacing[1] * original_size[1] / new_spacing[1])),         int(np.round(original_spacing[2] * original_size[2] / new_spacing[2])),     ]     resmaple = STK.ResampleImageFilter()     resmaple.SetInterpolator(STK.sitkLinear)     resmaple.SetDefaultPixelValue(0)     resmaple.SetOutputSpacing(new_spacing)     resmaple.SetOutputOrigin(data.GetOrigin())     resmaple.SetOutputDirection(data.GetDirection())     resmaple.SetSize(new_shape)     data = resmaple.Execute(data)     image = STK.GetArrayFromImage(data)     # print(image.shape)     return image

按图像中心切割:

def centerCrop(image, label, output_size):     if image.shape[0] <= output_size[0] or image.shape[1] <= output_size[1] or image.shape[2] <= output_size[2]:         pw = max((output_size[0] - image.shape[0]) // 2   3, 0)         ph = max((output_size[1] - image.shape[1]) // 2   3, 0)         pd = max((output_size[2] - image.shape[2]) // 2   3, 0)         image = np.pad(image, [(pw, pw), (ph, ph), (pd, pd)], mode='constant', constant_values=0)         label = np.pad(label, [(pw, pw), (ph, ph), (pd, pd)], mode='constant', constant_values=0)      (w, h, d) = image.shape      w1 = int(round((w - output_size[0]) / 2.))     h1 = int(round((h - output_size[1]) / 2.))     d1 = int(round((d - output_size[2]) / 2.))      # print(image.shape, output_size, get_center(label), w1, h1, d1)     image = image[w1:w1   output_size[0], h1:h1   output_size[1], d1:d1   output_size[2]]     label = label[w1:w1   output_size[0], h1:h1   output_size[1], d1:d1   output_size[2]]      return image, label

两种常用的归一化方法

1)min-max标准化

(2)Z-score标准化方法

(1)min-max标准化(Min-Max Normalization)(线性函数归一化)
定义:又称离差标准化,是对原始数据的线性转换,使结果映射到0-1之间。
本质:将数变为0,1之间的小数。
转换函数:(X-Min)/(Max-Min)
如果想要将数据映射到-1,1,则将公式换成:(X-Mean)/(Max-Min)
其中:max样本数据的最大值,min样本数据的最小值,Mean表示数据的平均值。

缺陷:当添加新数据时,会导致max和min需要重新定义的变化。

(2)0均值标准化(Z-score standardization)
定义:该方法给出原始数据的平均值(mean)和标准差(standard deviation)标准化数据。处理后的数据符合标准正态分布,即平均值为0,标准差为1.
本质:将有量纲表达式转化为无量纲表达式。
转换函数:(X-Mean)/(Standard deviation)
其中,Mean均值为所有样本数据。Standard deviation所有样本数据的标准。

两种归一化方法的使用场景:
(1)在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

因为:第一种方法(线性变换后),其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。

(2)在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在(0 ,255)的范围。

因为:第二种归一化方式中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。

代码实现:

def MinMax(image):
    image = image - np.mean(image)  # 零均值
    if np.max(image) - np.min(image) != 0:
        image = (image - np.min(image)) / (np.max(image) - np.min(image))  # 归一化

    return image

def zsorce(image):
    image = (image - np.mean(image)) / np.std(image)
    return image

参考:

CT图像之Hu值变换与窗宽窗位调整_HuiYu-Li的博客-CSDN博客_ct图像调窗

CT医学影像的窗高窗位、CT值(Hu值)_土豆娃wkl的博客-CSDN博客_hu影像学单位

医学图像预处理之重采样_YYLin-AI的博客-CSDN博客_医学图像重采样

机器学习-数据归一化方法(Normalization Method)_Microstrong0305的博客-CSDN博客_数据归一化

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章