Pyradiomics 影像组学 手动特征提取
详细
用于便于后续自我查阅与核对的目的,记录手动提取数据流程的具体操作步骤;其中主要参考了某位大佬的相关博文内容:[使用pyradiomics提取影像组学特征【详细
安装Pyradiomics
在已经安装好的Python环境下,执行:
pip install pyradiomics
导入必备包
import os
import pandas as pd
import SimpleITK as sitk
from radiomics import featureextractor
SimpleITK:便于学习这篇博文:SimpleITK的使用 - 知乎 (zhihu.com)
定义数据文件夹路径
为了实现操作的稳定性和可追溯性,我选择的是绝对路径。避免在路径中包含任何中文字符。特别提示:在处理过程中,请确保所有涉及的转义字符均为标准ASCII码中的 '/' 符号,并请严格按照原始路径配置文件进行操作。
D:\jin_hua\jin_hua_data\AIS_All
在这个文件夹里面读取数据
data_folder = "D:/jin_hua/jin_hua_data/AIS_All"
初始化特征提取器
特征提取器是一个专设用于从图像中定量分析形态与纹理特性的设备,在此过程中可综合评估多维度特性指标。初始化该提取器的主要目标在于根据不同应用需求调节参数设置,并确保所得结果数据符合既定标准与规范要求
settings = {}
settings['binWidth'] = 25
settings['sigma'] = [3, 5]
settings['resampledPixelSpacing'] = [1, 1, 1]
settings['voxelArrayShift'] = 1000
settings['normalize'] = True
settings['normalizeScale'] = 100
- binWidth: 按等间距划分箱体宽度,在计算一阶直方图特征时将原始数据按固定宽度分隔为多个箱体。
- sigma: 由LoG滤波器的标准差决定的高斯平滑操作参数,在图像处理中通过高斯函数实现空间平滑效果。
- resampledPixelSpacing: 在特征提取前确保图像一致的空间分辨率设置,在此过程中指定重新采样的像素间距以毫米为单位。
- voxelArrayShift: 用于特征计算中的数据平移量,在数值运算中防止数据溢出或溢入现象出现。
- normalize: 是否执行归一化处理决定的数据缩放方法,在算法运行前对图像数据进行标准化操作以提高收敛速度。
- normalizeScale: 指定归一化处理后数据范围的最大值,在图像处理中通过设定缩放因子控制数值大小范围。
实例化特征提取器
extractor = featureextractor.RadiomicsFeatureExtractor(**settings)
指定用于提取特征的图像类型
在该特征提取过程中,在应用LoG和Wavelet滤波器的基础上能够有效强化图像细节信息和纹理特征的表现力这一操作有助于显著提升特征提取的准确性和鲁棒性。通过这些滤波器的应用能够让特征提取器更加精准地理解和解析图像内容进而生成更具鉴别力和代表性的特征数据在pyradiomics软件包中我们提供了丰富的滤波器选择以满足不同场景的需求
# 指定使用 LoG 和 Wavelet 滤波器
extractor.enableImageTypeByName('LoG')
extractor.enableImageTypeByName('Wavelet')
LoG 滤波器 :
* LoG 滤波器是先应用高斯滤波器(Gaussian)然后应用拉普拉斯滤波器(Laplacian)得到的结果。它的作用是通过模糊和增强图像边缘来检测图像中的细节和边缘。 * LoG 滤波器可以提供更加准确的边缘检测结果,因为它在进行边缘检测时考虑了像素点的整体背景信息,从而可以更好地区分目标边缘和背景之间的差异。
Wavelet 滤波器 :
* Wavelet 滤波器是一种多尺度的滤波器,它可以将图像分解成不同尺度和方向上的分量,并对这些分量进行处理。通过分析图像的不同频率和方向成分,Wavelet 滤波器可以更好地捕获图像的纹理特征和细节信息。 * Wavelet 滤波器适用于需要考虑图像局部特征和纹理的情况,例如纹理分析、图像压缩和图像增强等应用场景。
启用全部类型的图片:
enableAllImageTypes()
如果想启用的图片类型 :enableImageTypeByName( imageType , enabled=True , customArgs=None )
指定所要提取的特征
该包为用户提供多种可供选择的功能,请参考如图所示的具体特征类型详细信息:
特征特别多还没仔细研究。。。
extractor.enableAllFeatures()
激活所有功能:调用enableAllFeatures()方法。
选择使用的功能类:通过enableFeatureClassByName(featureClass, enabled=True)方法进行设置。
遍历图像文件
掩膜图像即为经过感兴趣区域分割(ROI)并做了标记以标识需要提取特征的区域
掩模图像(Mask Image)主要用于标识图像中的感兴趣区域(Region of Interest, ROI)。其功能是通过标记特定区域来聚焦于感兴趣的部分并忽略其他部分。
其主要作用包括:
- 能够帮助识别感兴趣区域;
- 可以用来过滤图像中的干扰信息;
- 作为工具来辅助定位目标区域;
- 作为手段来限定分析范围。
# 获取所有图像文件的路径
image_files = [f for f in os.listdir(data_folder) if f.endswith('.nii.gz')]
# 存储所有图像的特征
all_features = []
# 遍历每个图像文件
for image_file in image_files:
# 获取原始图像和掩模图像的路径
image_path = os.path.join(data_folder, image_file)
roi_file = image_file.replace('_Original.nii.gz', '_ROI.nii.gz')
roi_path = os.path.join(data_folder, roi_file)
# 读取图像和掩模
image = sitk.ReadImage(image_path)
roi = sitk.ReadImage(roi_path)
# 提取特征
features = extractor.execute(image, roi)
# 将特征保存为一行数据
features['Image'] = image_file # 添加图像文件名作为特征的一部分
all_features.append(features)

存为特征表格
# 将特征转换为 DataFrame
df = pd.DataFrame(all_features)
# 保存特征表格
df.to_csv(os.path.join(data_folder, 'Radiomics-Features.csv'), index=False)
完整代码如下所示:
import os
import pandas as pd
import SimpleITK as sitk
from radiomics import featureextractor
# 定义数据集文件夹路径
data_folder = "D:/jin_hua/jin_hua_data/AIS_All"
# 初始化特征提取器的设置
settings = {}
settings['binWidth'] = 25
settings['sigma'] = [3, 5]
settings['resampledPixelSpacing'] = [1, 1, 1]
settings['voxelArrayShift'] = 1000
settings['normalize'] = True
settings['normalizeScale'] = 100
# 实例化特征提取器
extractor = featureextractor.RadiomicsFeatureExtractor(**settings)
# 指定使用 LoG 和 Wavelet 滤波器
extractor.enableImageTypeByName('LoG')
extractor.enableImageTypeByName('Wavelet')
# 选择所有特征
extractor.enableAllFeatures()
# 获取所有图像文件的路径
image_files = [f for f in os.listdir(data_folder) if f.endswith('.nii.gz')]
# 存储所有图像的特征
all_features = []
# 遍历每个图像文件
for image_file in image_files:
# 获取原始图像和掩模图像的路径
image_path = os.path.join(data_folder, image_file)
roi_file = image_file.replace('_Original.nii.gz', '_ROI.nii.gz')
roi_path = os.path.join(data_folder, roi_file)
# 读取图像和掩模
image = sitk.ReadImage(image_path)
roi = sitk.ReadImage(roi_path)
# 提取特征
features = extractor.execute(image, roi)
# 将特征保存为一行数据
features['Image'] = image_file # 添加图像文件名作为特征的一部分
all_features.append(features)
# 将特征转换为 DataFrame
df = pd.DataFrame(all_features)
# 保存特征表格
df.to_csv(os.path.join(data_folder, 'Radiomics-Features.csv'), index=False)

