影像组学之特征提取
发布时间
阅读量:
阅读量
影像组学特征提取
窗宽窗位的理解
1. 窗宽(Window Width, WW)
-
定义 :窗宽决定了灰度级显示范围的宽度,即图像中哪些灰度值被映射到显示器的 0(黑色)到 255(白色)之间。
-
作用: * 宽窗宽 :包含更多的灰度级,图像对比度较低(更平滑)。
- 窄窗宽 :包含较少的灰度级,图像对比度较高(更细节化)。
-
直观理解 :窗宽是可见灰度级的跨度,范围之外的值会被裁剪(即更暗或更亮)。
2. 窗位(Window Center, WC)
-
定义 :窗位是显示范围的中心值,决定了感兴趣的灰度级范围的位置。
-
作用: * 高窗位 :感兴趣的灰度范围偏亮,适合观察高密度组织(如骨骼)。
- 低窗位 :感兴趣的灰度范围偏暗,适合观察低密度组织(如肺部)。
-
直观理解 :窗位是控制灰度范围向上或向下移动的参考点。
窗宽窗位的灰度映射过程
-
灰度范围由窗宽和窗位确定:
- 下限:WC−WW/2
- 上限:WC+WW/2
-
映射规则:
- 图像中灰度值小于下限的像素,被映射为 黑色 (0) 。
- 灰度值大于上限的像素,被映射为 白色 (255) 。
- 灰度值在下限和上限之间的像素,按线性关系映射到 [0, 255] 范围。
举例说明
假设有一个 CT 图像,其原始灰度值范围为 [-1000, 1000](典型的 Hounsfield 单位,HU):
- 胸部 CT 的窗宽通常为 1500,窗位为 -600,用于观察肺部组织。
- 脑部 CT 的窗宽为 80,窗位为 40,用于观察脑组织。
胸部 CT 示例:
- 窗宽 = 1500,窗位 = -600:
- 映射范围是 −600−1500/2,−600+1500/2 = −1350,150。
- 灰度值小于 -1350 的像素被映射为黑色,灰度值大于 150 的像素被映射为白色,范围内的值线性映射到 [0, 255]。
- 这种设置可以清晰显示肺组织的细节。
脑部 CT 示例:
- 窗宽 = 80,窗位 = 40:
- 映射范围是 40−80/2,40+80/2 = 0,80。
- 这种设置适合观察脑组织的细节,增强软组织对比度。
直观理解
-
窗宽调整对比度 :
- 窗宽越窄,图像对比度越强,适合观察特定组织细节。
- 窗宽越宽,图像对比度越低,适合观察整体结构。
-
窗位调整亮度偏移 :
- 窗位偏高,适合观察高灰度区域(如骨骼)。
- 窗位偏低,适合观察低灰度区域(如肺部)。
应用场景
- 肺窗 :用于显示肺部组织(窗宽较宽,窗位较低)。
- 骨窗 :用于显示骨骼(窗宽较窄,窗位较高)。
- 软组织窗 :用于显示软组织(窗宽适中,窗位偏中)。
通过调整窗宽和窗位,可以灵活增强感兴趣区域的显示效果,从而更准确地进行诊断。
常见数值

步骤
- 用代码提取全部特征(即original,wavelet,loG…)
- 用代码设置bin和resample参数
- 利用循环代码批量提取
- 与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

全部评论 (0)
还没有任何评论哟~
