记录手动提取流程方便后期自己查看,本文参照了大佬的博文:使用pyradiomics提取影像组学特征【详细】_pyradiomics特征提取-CSDN博客
安装Pyradiomics
在已经安装好的Python环境下,执行:
pip install pyradiomics
导入必备包
import os
import pandas as pd
import SimpleITK as sitk
from radiomics import featureextractor
SimpleITK:可学习该博文:SimpleITK的使用 - 知乎 (zhihu.com)
定义数据文件夹路径
我使用的是绝对路径,注意路径中不要出现中文,注意转义字符“/”,原来的路径
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 滤波器的标准差。LoG(Laplacian of Gaussian)是一种常用的图像滤波器,它将高斯滤波器应用于图像,然后计算其拉普拉斯(二阶导数)。这里的sigma
参数指定了高斯滤波器的标准差。resampledPixelSpacing
: 重新采样后的像素间距。特征提取器在计算图像特征之前通常会对图像进行重新采样,以确保不同图像具有相同的空间分辨率。这里的resampledPixelSpacing
参数指定了重新采样后的像素间距,以毫米为单位。voxelArrayShift
: 数组中的偏移值。在计算某些特征时,会对图像数组中的值进行一些数学运算,这个参数可以用来对数组中的值进行平移,以防止数据范围过大或过小。normalize
: 是否进行归一化。归一化是将图像数据的数值范围调整为特定的范围,通常是 [0, 1] 或 [-1, 1]。这有助于提高算法的稳定性和收敛速度。normalizeScale
: 归一化的尺度。如果启用了归一化,此参数指定了归一化后的数据范围的上限值。例如,如果设置为 100,则归一化后的数据将在 [0, 100] 的范围内。
实例化特征提取器
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 )
指定所要提取的特征
pyradiomics包也为我们提供了很多种可选的特征,如下方表格,具体特征类型详细资料可参考:
特征特别多还没仔细研究。。。
extractor.enableAllFeatures()
启用所有类型:
e
nableAllFeatures( )
启用你想用的类型: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)