如何用Python将提取的影像组学特征保存至CSV文件?
问题描述
我正在使用pyfeats库,通过图像及其对应的ROI掩码提取影像组学特征,提取的特征包括形状特征和GLRLM特征。其中形状特征通过shape_parameters函数提取,可得到SHAPE_XcoordMax、SHAPE_YcoordMax、SHAPE_area、SHAPE_perimeter、SHAPE_perimeter2perArea这些值;glrlm_features函数则返回GLRLM_ShortRunEmphasis、GLRLM_LongRunEmphasis等共12个属性值。现有代码如下:
import os import numpy as np import cv2 import matplotlib.pyplot as plt from pyfeats import * import pandas as pd from scipy import ndimage as ndi #%% # define image and mask folder paths image_folder = 'images' mask_folder = 'masks' # get list of image names image_names = [f for f in os.listdir(image_folder) if f.endswith('.png')] # create an empty dictionary to store the features for each image features_dict = {} # iterate through each image and its corresponding mask for img_name in image_names: # Load image and resize to 224 x 224 img_path = os.path.join(image_folder, img_name) image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) image = cv2.resize(image, (224, 224)) # Load mask and resize to 224 x 224 mask_name = img_name mask_path = os.path.join(mask_folder, mask_name) mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) mask = cv2.resize(mask, (224, 224)) #compute perimeter mask //= 255 kernel = np.ones((5,5)) C= ndi.convolve(mask, kernel, mode='constant', cval=0) perimeter = np.where( (C>=11) & (C<=15 ), 255, 0) # extract features: Texture features = {} features['A_GLRLM'] = glrlm_features(image, mask, Ng=256) features['A_Shape_Parameters'] = shape_parameters(image, mask, perimeter, pixels_per_mm2=1) # add features to dictionary features_dict[img_name] = features #%% # convert features dictionary to a pandas DataFrame and save to CSV file
计算完成这些特征后,我希望将这些量化值与其对应的列标题(如SHAPE_XcoordMax、SHAPE_YcoordMax等)一同保存到CSV文件中,同时单独设置一列存储图像文件名(图像与掩码文件名相同,均为.png格式)。请问该如何实现将文件名与特征保存到CSV文件中?
解决方案
你需要调整特征存储的结构,将嵌套的特征数据展开为扁平的键值对,同时添加文件名字段,最终通过Pandas生成规范的DataFrame并保存为CSV。修改后的完整代码如下:
import os import numpy as np import cv2 import matplotlib.pyplot as plt from pyfeats import * import pandas as pd from scipy import ndimage as ndi # define image and mask folder paths image_folder = 'images' mask_folder = 'masks' # get list of image names image_names = [f for f in os.listdir(image_folder) if f.endswith('.png')] # 创建空列表存储每个图像的特征行数据 features_list = [] # iterate through each image and its corresponding mask for img_name in image_names: # Load image and resize to 224 x 224 img_path = os.path.join(image_folder, img_name) image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) image = cv2.resize(image, (224, 224)) # Load mask and resize to 224 x 224 mask_name = img_name mask_path = os.path.join(mask_folder, mask_name) mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) mask = cv2.resize(mask, (224, 224)) #compute perimeter mask //= 255 kernel = np.ones((5,5)) C= ndi.convolve(mask, kernel, mode='constant', cval=0) perimeter = np.where( (C>=11) & (C<=15 ), 255, 0) # 提取形状特征:返回值为(特征值列表, 特征名称列表) shape_vals, shape_names = shape_parameters(image, mask, perimeter, pixels_per_mm2=1) # 提取GLRLM特征:返回值为(特征值列表, 特征名称列表) glrlm_vals, glrlm_names = glrlm_features(image, mask, Ng=256) # 构建当前图像的特征字典 current_features = {} # 添加文件名字段 current_features['filename'] = img_name # 添加形状特征:将名称和值一一对应 for name, val in zip(shape_names, shape_vals): current_features[name] = val # 添加GLRLM特征:将名称和值一一对应 for name, val in zip(glrlm_names, glrlm_vals): current_features[name] = val # 将当前图像的特征数据加入列表 features_list.append(current_features) # 将特征列表转换为DataFrame features_df = pd.DataFrame(features_list) # 保存到CSV文件,index=False表示不保留索引列 features_df.to_csv('radiomics_features.csv', index=False)
关键修改说明:
- 替换嵌套字典为列表存储:用
features_list替代原有的features_dict,每个元素是单个图像的扁平特征字典,方便直接转为DataFrame。 - 展开特征键值对:pyfeats的特征提取函数返回
(特征值, 特征名称)的元组,通过zip将名称和值配对,直接作为字典的键值对,确保CSV列名与特征一一对应。 - 添加文件名字段:在每个图像的特征字典中加入
filename键,值为当前图像文件名,满足单独列存储的需求。 - 生成并保存CSV:用
pd.DataFrame将列表转为表格,调用to_csv保存,index=False避免生成多余的索引列。
内容的提问来源于stack exchange,提问作者shiva
相关产品推荐
相关产品推荐

