影像组学|特征定义以及提取

news2025/1/15 19:48:19

一、 影像组学特征分类

1.1 影像组学特征分类

1.1.1 一阶统计特征

一阶统计特征,反应所测体素的对称性、均匀性以及局部强度分布变化。包括中值,平均值,最小值,最大值,标准差,偏度,峰度等。

1.1.2 形态特征

形态特征,定量描述感兴趣区的几何特性,如肿瘤的表面积、体积、表面积和体积比、球形度、紧凑性和三维直径等,这些特征可以描述肿瘤三维的大小和形态信息。

1.1.3 二阶及高阶纹理特征

此外,还有原始图像或使用不同滤波方法对影像进行滤波后的二阶及高阶纹理特征,这些特征能够反映图像体素灰度之间的空间排列关系。主要包括以下分类。
灰度共生矩阵(GrayLevelCooccurence Matrix,GLCM):反映在给定的方向和距离上体素值出现的概率。
灰度游程长度矩阵(Gray LevelRun Length Matrix,GLRLM):描述相同灰度级的体素在指定方向上连续出现的长度。
灰度尺寸区域矩阵(Gray LevelSize Zone Matrix,GLSZM):量化图像中连续体素值的区域。
**邻域灰度差矩阵(Neighbouring Gray Tone Difference Matrix,NGTDM)😗*量化体素灰度值与特定距离内邻域的平均灰度值之间的差异。
**灰度相关矩阵(Gray Level Dependence Matrix,GLDM)😗*基于体素值测量相邻体素之间的差异。

1.2 影像组学特征研究热点

挖掘与生理、病理的关系,进行解释

二、影像组学特征提取

2.1 pyradiomics安装

安装命令:pip install pyradiomics/conda install pyradiomics
如果遇到未安装pywt库的提示,请安装pywavelets库。

2.2 特征提取实战–一个简单案例

代码;

from radiomics import featureextractor
import os
basePath = "G:\\brain1\\"
imageFile =os.path.join(basePath,'brain1_image.nrrd')
maskFile = os.path.join(basePath,'brain1_label.nrrd')
extractor = featureextractor.RadiomicsFeatureExtractor()
featureVector = extractor.execute(imageFile,maskFile)
for featureName in featureVector.keys():
    print("%s : %s" % (featureName,featureVector[featureName]))

结果:
在这里插入图片描述

2.3 常用参数设置

代码:

from radiomics import featureextractor
import os
import SimpleITK as sitk
basePath = "G:\\brain1\\"
imageFile =os.path.join(basePath,'brain1_image.nrrd')
maskFile = os.path.join(basePath,'brain1_label.nrrd')
settings = {}
settings['binWith'] = 25
settings['resamplePixelSpacing'] = [3,3,3]  # unit:mm  重采样
settings['interpolator'] = sitk.sitkNearestNeighbor #插值方法
settings['normalize'] = True # 图像归一化
extractor = featureextractor.RadiomicsFeatureExtractor(**settings)
featureVector = extractor.execute(imageFile,maskFile)
for featureName in featureVector.keys():
    print("%s : %s" % (featureName,featureVector[featureName]))

SimpleITK中提供的插值方法:

在这里插入图片描述
个别特征提取:

extractor.disableAllFeatures()
extractor.enableFeaturesByName(firstorder=['Mean', 'Skewness'])
featureVector = extractor.execute(imageFile, maskFile)
for featureName in featureVector.keys():
    print("%s: %s" % (featureName, featureVector[featureName]))
diagnostics_Versions_PyRadiomics: 0+unknown
diagnostics_Versions_Numpy: 1.19.2
diagnostics_Versions_SimpleITK: 2.0.2
diagnostics_Versions_PyWavelet: 1.1.1
diagnostics_Versions_Python: 3.8.5
diagnostics_Configuration_Settings: {'minimumROIDimensions': 2, 'minimumROISize': None, 'normalize': True, 'normalizeScale': 1, 'removeOutliers': None, 'resampledPixelSpacing': [3, 3, 3], 'interpolator': 1, 'preCrop': False, 'padDistance': 5, 'distances': [1], 'force2D': False, 'force2Ddimension': 0, 'resegmentRange': None, 'label': 1, 'additionalInfo': True, 'binWidth': 25}
diagnostics_Configuration_EnabledImageTypes: {'Original': {}}
diagnostics_Image-original_Hash: 5c9ce3ca174f0f8324aa4d277e0fef82dc5ac566
diagnostics_Image-original_Dimensionality: 3D
diagnostics_Image-original_Spacing: (0.7812499999999999, 0.7812499999999999, 6.499999999999998)
diagnostics_Image-original_Size: (256, 256, 25)
diagnostics_Image-original_Mean: 385.6564080810547
diagnostics_Image-original_Minimum: 0.0
diagnostics_Image-original_Maximum: 3057.0
diagnostics_Mask-original_Hash: 9dc2c3137b31fd872997d92c9a92d5178126d9d3
diagnostics_Mask-original_Spacing: (0.7812499999999999, 0.7812499999999999, 6.499999999999998)
diagnostics_Mask-original_Size: (256, 256, 25)
diagnostics_Mask-original_BoundingBox: (162, 84, 11, 47, 70, 7)
diagnostics_Mask-original_VoxelNum: 4137
diagnostics_Mask-original_VolumeNum: 2
diagnostics_Mask-original_CenterOfMassIndex: (186.98549673676578, 106.3562968334542, 14.38917089678511)
diagnostics_Mask-original_CenterOfMass: (46.47304432559825, 16.518518098863908, 15.529610829103234)
diagnostics_Image-interpolated_Spacing: (3.0, 3.0, 3.0)
diagnostics_Image-interpolated_Size: (24, 30, 27)
diagnostics_Image-interpolated_Mean: 0.44909917493419343
diagnostics_Image-interpolated_Minimum: -0.957997711468711
diagnostics_Image-interpolated_Maximum: 5.339121039019602
diagnostics_Mask-interpolated_Spacing: (3.0, 3.0, 3.0)
diagnostics_Mask-interpolated_Size: (24, 30, 27)
diagnostics_Mask-interpolated_BoundingBox: (5, 6, 7, 12, 18, 15)
diagnostics_Mask-interpolated_VoxelNum: 641
diagnostics_Mask-interpolated_VolumeNum: 2
diagnostics_Mask-interpolated_CenterOfMassIndex: (11.257410296411857, 11.249609984399376, 14.798751950078003)
diagnostics_Mask-interpolated_CenterOfMass: (46.27223088923557, 16.751170046801853, 15.646255850234056)
diagnostics_Mask-interpolated_Mean: 1.0639000504485487
diagnostics_Mask-interpolated_Minimum: 0.2964578976029255
diagnostics_Mask-interpolated_Maximum: 2.072568314407322
original_firstorder_Mean: 1.0639000504485487
original_firstorder_Skewness: 0.44927279398674264

特征类别选择:

extractor.disableAllFeatures() # 关闭所有特征
extractor.enableFeatureClassByName('glrlm')
extractor.enableFeatureClassByName('glcm')
featureVector = extractor.execute(imageFile, maskFile)
for featureName in featureVector.keys():
    print("%s: %s" % (featureName, featureVector[featureName]))

在这里插入图片描述
滤波器选择:

extractor.enableImageTypes(Original={}, LoG={"sigma" : [4.0]}, Wavelet={})
featureVector = extractor.execute(imageFile, maskFile)
for featureName in featureVector.keys():
    print("%s: %s" % (featureName, featureVector[featureName]))

在这里插入图片描述
在这里插入图片描述

三、影像组学特征批量提取

import pandas as pd
basePath = '/Users/lirenyuan/Desktop/RadiomicsWorld/course/data/featureExtraction'
folders = os.listdir(basePath)
print(folders)

在这里插入图片描述

df = pd.DataFrame()
extractor = featureextractor.RadiomicsFeatureExtractor()
for folder in folders:
    files = os.listdir(os.path.join(basePath,folder))
    print(files)
    for file in files:
        if file.endswith('image.nrrd'):
            imageFile = os.path.join(basePath,folder,file)
        if file.endswith('label.nrrd'):
            maskFile = os.path.join(basePath,folder,file)
#     print(imageFile, maskFile)
    featureVector = extractor.execute(imageFile, maskFile)
    df_new = pd.DataFrame.from_dict(featureVector.values()).T
    df_new.columns = featureVector.keys()
    df = pd.concat([df,df_new])
df.to_excel(os.path.join(basePath,'results.xlsx'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】六、Linux 基础IO(三)|文件系统|软硬链接|文件的三个时间

目录 八、文件系统 8.1 磁盘 8.1.1 磁盘的物理结构 8.1.2 磁盘的存储结构 8.1.3 磁盘的逻辑结构 8.2 inode 九、软硬链接 9.1 软链接 9.2 硬链接 9.3 当前路径(.)和上级路径(..) 十、文件的三个时间 八、文件系统 上面的内容谈论的都是一个被打开文件,那…

如何将两个录音合成一个?这篇文章告诉你

现如今,很多小伙伴都加入到短视频行业当中。而短视频的制作往往需要将多段音频进行一个合并。那么问题来了,当你想多个音频进行合并在一起的时候,你是怎么做的呢?其实很简单,我们只需要借助市面上的一些合并软件就好了…

初始网络

文章目录初始网络局域网 / 广域网IP地址 和 端口号认识协议协议分层初始网络 这里可以先自行在网上了解一下网络的发展史 也就是互联网是怎么来的. 局域网 / 广域网 关于网络的发展史 , 会涉及到两个非常重要的术语 ,也就是 局域网,和广域网 。 局域网 &…

JavaEE多线程-阻塞队列

目录一、认识阻塞队列1.1 什么是阻塞队列?1.2 生产者消费者模型1.3 标准库中的阻塞队列类二、循环队列实现简单阻塞队列2.1 实现循环队列2.2 阻塞队列实现一、认识阻塞队列 1.1 什么是阻塞队列? 阻塞队列:从名字可以看出,他也是…

简明Java讲义 2:数据类型和运算符

目录 1、安装IDE编辑器 2、关键字和保留字 3、标识符 4、分隔符 5、数据类型 6、基本类型的数据类型转换 7、表达式类型的自动提升 8、变量 9、运算符 10、运算符的优先级 1、安装IDE编辑器 在开始内容之前,先下载IDE,可以是Eclipse或STS&…

Python函数(函数定义、函数调用)用法详解

Python 中函数的应用非常广泛,前面章节中我们已经接触过多个函数,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用。除了可以直接使用的内置函数外,Python 还支持自定义函数…

LeetCode刷题模版:201 - 210

目录 简介201. 数字范围按位与202. 快乐数203. 移除链表元素204. 计数质数205. 同构字符串206. 反转链表207. 课程表【未实现】208. 实现 Trie (前缀树)209. 长度最小的子数组210. 课程表 II【未实现】结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您…

LeetCode[1319]连通网络的操作次数

难度:中等题目:用以太网线缆将 n台计算机连接成一个网络,计算机的编号从 0到 n-1。线缆用 connections表示,其中 connections[i] [a, b]连接了计算机 a和 b。网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其…

(十六)异步编程

CompletableFuture在Java8中推出,Java8中的异步编程就是依靠此类。几种任务接口四种任务无参数有一个参数有两个参数无返回值RunnableConsumerBiConsumer有返回值SupplierFunctionBiFunctionCompletionStage接口这个类中定义的许多能够链式调用的方法和组合方法时是…

Unity3DVR开发—— XRInteractionToolkit(PicoNeo3)

目录 一、开发前的准备 二、基础配置 三、Pico项目配置 四、添加基础功能 一、开发前的准备 1、为了方便开发,先在Pico开发者平台里下载预览工具 Pico开发者平台https://developer-global.pico-interactive.com/sdk?deviceId1&platformId1&itemId17 2、…

【哈希表】关于哈希表,你该了解这些!

【哈希表】理论基础1 哈希表2 哈希函数3 哈希碰撞3.1 拉链法3.2 线性探测法4 常见的三种哈希结构5 总结1 哈希表 哈希表 Hash table (一些书籍翻译为散列表) 哈希表是根据关键码的值而直接进行访问的数据结构。 直白来讲其实数组就是一张哈希表。 哈希表…

用1行Python代码识别增值税发票,YYDS

大家好,这里是程序员晚枫。 录入发票是一件繁琐的工作,如果可以自动识别并且录入系统,那可真是太好了。 今天我们就来学习一下,如何自动识别增值税发票并且录入系统~ 识别发票 识别发票的代码最简单,只需要1行代码…

CSS的总结

从HTML被发明开始,样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只包含很少的显示属性。 随着HTML的成长,为了满足页面设计者的要求,HTML添加了很多显示功能。但是随着这些功能的增加&…

ISIS的路由器级别level-1、level-2、level-1-2,报文格式

2.1.0 ISIS的路由器级别level-1、level-2、level-1-2,报文格式 通过该文章了解ISIS的路由器级别类型、级别之间建立的邻接关系、各级别的作用、ISIS报文的结构。 ISIS路由器级别 Level-1 level-1路由器又称L1路由器,是一种ISIS区域内部路由&#xff0c…

6、运算符

目录 一、赋值运算符 二、算数运算符 三、自增和自减运算符 四、比较运算符 五、逻辑运算符 六、位运算符 1. “按位与”运算 2. “按位或”运算 3. “按位取反”运算 4. “按位异或”运算 5. 移位操作 七、三元运算符 八、运算符优先级 一、赋值运算符 赋值运算…

[Android开发基础1] 五大常用界面布局

文章目录 一、线性布局 二、相对布局 三、帧布局 四、表格布局 五、约束布局 总结 一、线性布局 线性布局(LinearLayout)主要以水平或垂直方式来显示界面中的控件。当控件水平排列时,显示顺序依次为从左到右,当控件垂直排列时…

29/365 java 网络通信 IP InetAddress

1.网络通信: 如何定位到一台主机? IP地址 定位主机, 端口号定位到具体的应用程序 如何在主机之间通信(传输数据)? 网络通信协议 2.IP地址分类 IPv4: 32位 IPv6地址:128位 IPv6地址使用以冒号…

初学python100例-案例37 合并排序列表 少儿编程python编程实例讲解

目录 python合并排序列表 一、题目要求 1、编程实现 2、输入输出

C语言形参和实参的区别

如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品;从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值。这一节我们先来讲解C语言函数的参数,下一节再讲解C语言函数的返回值。C语言函数的参…

浅谈多任务学习

目录 一、前言及定义 二、多任务学习(MTL)的两种方法 2.1 参数的硬共享机制(hard parameter sharing) 2.2 参数的软共享机制(soft parameter sharing) 三、多任务学习模型 3.1 MT-DNN 3.2 ERNIE 2.0…