Advertisement

影像组学之特征提取

阅读量:

影像组学特征提取

窗宽窗位的理解

1. 窗宽(Window Width, WW)

  • 定义 :窗宽决定了灰度级显示范围的宽度,即图像中哪些灰度值被映射到显示器的 0(黑色)到 255(白色)之间。

  • 作用: * 宽窗宽 :包含更多的灰度级,图像对比度较低(更平滑)。

    • 窄窗宽 :包含较少的灰度级,图像对比度较高(更细节化)。
  • 直观理解 :窗宽是可见灰度级的跨度,范围之外的值会被裁剪(即更暗或更亮)。

2. 窗位(Window Center, WC)

  • 定义 :窗位是显示范围的中心值,决定了感兴趣的灰度级范围的位置。

  • 作用: * 高窗位 :感兴趣的灰度范围偏亮,适合观察高密度组织(如骨骼)。

    • 低窗位 :感兴趣的灰度范围偏暗,适合观察低密度组织(如肺部)。
  • 直观理解 :窗位是控制灰度范围向上或向下移动的参考点。

窗宽窗位的灰度映射过程

  1. 灰度范围由窗宽和窗位确定:

    • 下限:WC−WW/2
    • 上限:WC+WW/2
  2. 映射规则:

    • 图像中灰度值小于下限的像素,被映射为 黑色 (0)
    • 灰度值大于上限的像素,被映射为 白色 (255)
    • 灰度值在下限和上限之间的像素,按线性关系映射到 [0, 255] 范围。

举例说明

假设有一个 CT 图像,其原始灰度值范围为 [-1000, 1000](典型的 Hounsfield 单位,HU):

  • 胸部 CT 的窗宽通常为 1500,窗位为 -600,用于观察肺部组织。
  • 脑部 CT 的窗宽为 80,窗位为 40,用于观察脑组织。
胸部 CT 示例:
  1. 窗宽 = 1500,窗位 = -600:
    • 映射范围是 −600−1500/2,−600+1500/2 = −1350,150。
    • 灰度值小于 -1350 的像素被映射为黑色,灰度值大于 150 的像素被映射为白色,范围内的值线性映射到 [0, 255]。
    • 这种设置可以清晰显示肺组织的细节。
脑部 CT 示例:
  1. 窗宽 = 80,窗位 = 40:
    • 映射范围是 40−80/2,40+80/2 = 0,80。
    • 这种设置适合观察脑组织的细节,增强软组织对比度。

直观理解

  1. 窗宽调整对比度

    • 窗宽越窄,图像对比度越强,适合观察特定组织细节。
    • 窗宽越宽,图像对比度越低,适合观察整体结构。
  2. 窗位调整亮度偏移

    • 窗位偏高,适合观察高灰度区域(如骨骼)。
    • 窗位偏低,适合观察低灰度区域(如肺部)。

应用场景

  1. 肺窗 :用于显示肺部组织(窗宽较宽,窗位较低)。
  2. 骨窗 :用于显示骨骼(窗宽较窄,窗位较高)。
  3. 软组织窗 :用于显示软组织(窗宽适中,窗位偏中)。

通过调整窗宽和窗位,可以灵活增强感兴趣区域的显示效果,从而更准确地进行诊断。

常见数值

在这里插入图片描述

步骤

  1. 用代码提取全部特征(即original,wavelet,loG…)
  2. 用代码设置bin和resample参数
  3. 利用循环代码批量提取
  4. 与3D slicer提取对比

代码

复制代码
    import os
    import SimpleITK as sitk
    import pandas as pd
    import radiomics
    from radiomics import featureextractor
    
    # 设置pyradiomics的配置参数
    settings = {
    'binWidth': 25,
    'voxelSpacing': None,  # 这通常需要根据你的影像数据来设置
    'interpolator': sitk.sitkLinear,
    'resampledPixelSpacing': [1.0, 1.0, 1.0],  # 根据需要调整
    # 添加其他你需要的设置...
    }
    
    # 初始化特征提取器
    extractor = featureextractor.RadiomicsFeatureExtractor(**settings)
    
    # 提取所有特征
    extractor.enableAllFeatures()
    
    # 定义影像和ROI文件的路径
    image_dir = r'F:/20241011/avm_done'
    mask_dir = r'F:/20241011/mask_plus'
    output_xlsx = r'F:/20241011/mask_plus/output.xlsx'
    
    # 获取所有影像和ROI文件的列表
    image_files = sorted([f for f in os.listdir(image_dir) if f.endswith('.dcm') or f.endswith('.nii.gz')])
    mask_files = sorted([f for f in os.listdir(mask_dir) if f.endswith('.dcm') or f.endswith('.nii.gz')])
    
    # 确保影像和ROI文件的数量匹配
    assert len(image_files) == len(mask_files), "Number of image files does not match number of mask files."
    
    # 创建一个空的DataFrame来存储特征
    features_df = pd.DataFrame()
    
    # 批量提取特征
    for img_file, mask_file in zip(image_files, mask_files):
    image_path = os.path.join(image_dir, img_file)
    mask_path = os.path.join(mask_dir, mask_file)
    
    # 读取影像和ROI
    image = sitk.ReadImage(image_path)
    mask = sitk.ReadImage(mask_path)
    
    # 确保影像和ROI的空间维度匹配
    assert image.GetDimension() == mask.GetDimension(), "Image and mask dimensions do not match."
    
    # 提取特征
    feature_vector = extractor.execute(image, mask)
    
    # 将特征添加到DataFrame中
    # feature_df = pd.DataFrame([feature_vector]).T
    feature_df = pd.DataFrame([feature_vector])
    feature_df['Image_ID'] = img_file.split('.')[0]  # 假设文件名包含唯一标识符
    features_df = pd.concat([features_df, feature_df], ignore_index=True)
    
    # 将特征保存到CSV文件
    features_df.to_excel(output_xlsx, index=False)
    
    print(f"Features extracted and saved to {output_xlsx}")
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/JPc18HQnL6ly3jris4mTSDhktawu.png)

全部评论 (0)

还没有任何评论哟~