You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:40:17