原始图像为dicom格式,mask图像为nrrd格式

1. 读取 dicom 和 nrrd

2. 设置 logger 和 setting

3. 初始化特征提取器,设置图像空间和特征类型

4. 特征提取和保存显示

单个subject影像组学特征提取

from __future__ import print_function
import logging
import SimpleITK as sitk
import radiomics
from radiomics import featureextractor
import six# The original image is in dicom format
readerC = sitk.ImageSeriesReader()
dicom_names = readerC.GetGDCMSeriesFileNames('/project/patient/000000')
readerC.SetFileNames(dicom_names)
readerC.MetaDataDictionaryArrayUpdateOn()
readerC.LoadPrivateTagsOn()
imageName = readerC.Execute()# The mask image is in nrrd format
maskName = sitk.ReadImage('/project/mask/000000/mask.nrrd')# Logger setting
logger = radiomics.logger
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='testLog.txt', mode='w')
formatter = logging.Formatter("%(levelname)s:%(name)s: %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)# Define settings for signature calculation
# These are currently set equal to the respective default values
settings = {}
settings['binWidth'] = 25
settings['resampledPixelSpacing'] = None  # [3,3,3] is an example for defining resampling (voxels with size 3x3x3mm)
settings['interpolator'] = sitk.sitkBSpline
settings['correctMask'] = True
settings['geometryTolerance'] = 1# Initialize feature extractor
extractor = featureextractor.RadiomicsFeatureExtractor(**settings)# Enable the image type
extractor.enableAllImageTypes()
# extractor.enableImageTypes(Original={}, LoG={}, Wavelet={})# Enable the feature type
# extractor.disableAllFeatures()
extractor.enableFeatureClassByName('firstorder')
# extractor.enableFeaturesByName(firstorder=['Mean', 'Skewness'])
# extractor.enableAllFeatures()# Output the result
print("Calculating features")
featureVector = extractor.execute(imageName, maskName)
radiomicsList = []
header = []
for key, val in six.iteritems(featureVector):if not key.startswith('diagnostics'):header.append(key)radiomicsList.append(str(val))
print(header)
print(radiomicsList)for featureName in featureVector.keys():print("Computed %s: %s" % (featureName, featureVector[featureName]))

从excel中读取subject名字,进行批量处理

问题一:由于一个 subject 存在多个 mask,所以 excel 中的 subject ID 一列存在重复项

解决方案:读取到一个新的 subject ID 之后,遍历该文件夹内的所有 mask,进行组学特征提取;若当前读取的subject ID为已处理过的重复项,则跳过

问题二:原始图像为 dicom,mask为 nrrd ,存在 dicom 尺寸和 mask 尺寸不匹配的情况

解决方案:读取 dicom 序列文件,计算其层数和尺寸,读取nrrd文件,计算其层数和尺寸,如果两者相等,则计算组学特征并保存,如果不相等,则跳过

问题三:由于影像组学计算过程中需要 image 和 mask 的严格位置匹配,但是由于保存原因,dicom 和 nrrd 的坐标中心可能存在极微小的差异,比如 2.99999 和 3.0 这样子

解决方案:在 setting 中设置 correct mask 和 geometry tolerence 选项,进行位置自动匹配调整

问题四:需要将 subject ID,mask name,和计算出来的组学特征写入 csv 文件,并在第一行保存标题

解决方案:要考虑到问题二中的情况,不匹配的就只写入subject ID 和 mask name;要设置一个count,当 count = 0 才保存标题;要读取 mask 的名字,写入 mask name

import numpy as np
import xlrd
import os
import nrrd
import six
import csv
import SimpleITK as sitk
from radiomics import featureextractordef count_file_number(filepath, filetype):count = 0for root, dirname, filenames in os.walk(filepath):for filename in filenames:if os.path.splitext(filename)[1] == filetype:count += 1return count, filenamesdef dcmseriesread(dicompath):readerC = sitk.ImageSeriesReader()dicom_names = readerC.GetGDCMSeriesFileNames(dicompath)readerC.SetFileNames(dicom_names)readerC.MetaDataDictionaryArrayUpdateOn()readerC.LoadPrivateTagsOn()dicomImage = readerC.Execute()return dicomImagedef radiomics_feature_extractor(image, mask):settings = {}settings['binWidth'] = 25settings['resampledPixelSpacing'] = None  # [3,3,3] is an example for defining resampling (voxels with size 3x3x3mm)settings['interpolator'] = sitk.sitkBSplinesettings['correctMask'] = Truesettings['geometryTolerance'] = 1extractor = featureextractor.RadiomicsFeatureExtractor(**settings)extractor.enableAllImageTypes()# extractor.enableFeatureClassByName('firstorder')# extractor.enableFeatureClassByName('shape', 'texture')featureVector = extractor.execute(image, mask)radiomicsList = []header = []for key, val in six.iteritems(featureVector):if not key.startswith('diagnostics'):header.append(key)radiomicsList.append(str(val))return header, radiomicsListpath = '/project/'
SKindex = xlrd.open_workbook(os.path.join(path, 'index.xlsx')).sheets()[0]
subIDtemp = np.array(SKindex.col_values(0))[12:]
subID = [x[:-2].zfill(6) for x in subIDtemp]
# print(subID)
counter = 0for i in range(len(subID)):if i > 0 and subID[i] == subID[i-1]:passelse:patientPath = os.path.join(path, 'patient', subID[i])maskPath = os.path.join(path, 'mask', subID[i])dicomSlices, dicomNames = count_file_number(patientPath, '.dcm')originalImage = dcmseriesread(patientPath)maskNumber, maskNames = count_file_number(maskPath, '.nrrd')for maskName in maskNames:print([str(subID[i]), maskName, 'processing....'])maskMatrix, options = nrrd.read(os.path.join(maskPath, maskName))maskSlices = maskMatrix.shape[-1]if maskSlices == dicomSlices:maskImage = sitk.ReadImage(os.path.join(maskPath, maskName))header, radiomicsList = radiomics_feature_extractor(originalImage, maskImage)with open(os.path.join('/Desktop/data_files', 'radiomics_feature_all.csv'), 'a', newline='') as outcsv:writer = csv.writer(outcsv)if counter == 0:writer.writerow(['patientID', 'maskName'] + header)writer.writerow([str(subID[i]), maskName] + radiomicsList)counter += 1else:with open(os.path.join('/Desktop/data_files', 'radiomics_feature_all.csv'), 'a', newline='') as outcsv:writer = csv.writer(outcsv)writer.writerow([str(subID[i]), maskName])

影像组学特征提取 — 原始图像为dicom格式,mask图像为nrrd格式相关推荐

  1. 影像组学视频学习笔记(35)-基于2D超声影像的影像组学特征提取、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/f82d30289d68 来源:简书,已获转载授权 RadiomicsWorld.com "影像组学世界" ...

  2. 疗效预测中的影像组学特征提取

    介绍 最近一直在做关于肿瘤的放疗疗效预测相关的工作,遇到了一些问题主要是关于影像组学特征提取相关的问题,在这里做一个总结,主要是关于基于python提取影像组学特征: 需要的module: 主要需要的 ...

  3. 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/c3e6de2f79b3 来源:简书,已获转载授权 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(42)主要 ...

  4. Li‘s 影像组学radiomics视频学习笔记(42)-影像组学特征提取问题解决过程复现

    作者:北欧森林 链接:https://www.jianshu.com/p/c3e6de2f79b3 来源:简书,已获转载授权 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(42)主要 ...

  5. 20221128 影像组学特征提取

    在做影像组学类项目时,由于客户提供的数据资源不尽相同,对于以下这个案例,客户提供的原始图像是PNG文件,对应ROI也是2维的PNG文件图像,于是对于此类的图像数据有两步主要处理办法: 第一步:将所有的 ...

  6. 影像组学特征提取流程图

    原文: 对影像组学不熟悉的同学可能有疑惑.直接在原始图像上进行特征提取就可以了,为什么还需要这些不同类型的滤波图像?大家应该看过一些影像组学的论文,里面动辄就提取出上千种特征.这上千种怎么来的?秘诀就 ...

  7. 影像组学视频学习笔记(18)-使用MRIcroGL软件格式转换、勾画ROI、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(18)主要介绍: 使用MRIcroGL软件进行格式转换.勾画ROI并保存为mask文件 MRIcroGL 是一款免费.开源的轻量级软件: ...

  8. 影像组学训练营 第三天(共三天)

    文章目录 影像组学论文剖析 文章宏观分析 文章背景介绍 影像组学模型构建 高质量标准化MRI影像数据获取及分析 感兴趣体积VOI分割 图像预处理 特征提取 特征一致性评价 第七步 特征选择 数据库 一 ...

  9. 影像组学视频学习笔记(21)-影像组学常用软件推荐、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(21)主要介绍: 压箱底的好用软件推荐 [注]:李博士主要从事脑神经领域的研究,所以部分软件具有专业性. dicom到nifti的格式转 ...

最新文章

  1. [LeetCode]Implement Trie (Prefix Tree)
  2. 软件设计是决定软件性能的关键
  3. python sql in list
  4. Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)
  5. JZOJ 5257. 小X的佛光
  6. Python3爬虫知识点总结
  7. 《Java 核心技术卷1 第10版》学习笔记------Object类的 equals 方法
  8. wxWidgets:使用文本模板
  9. 使用devenv/MSBuild在命令行编译单个project
  10. 黄聪:ThinkSAAS开发文档 常用函数 模版修改
  11. tesseract-ocr 识别中文扫描图片
  12. AcWing 338. 计数问题(数位DP)
  13. Vissim与java(IntelliJ IDEA )联调环境配置
  14. 计算机一级报名照片是几寸的,法考报名照片要求几寸
  15. xlsx 解析excel 后渲染到表格里(前端实现 解析excel渲染到表格)
  16. 老司机用CATIA的实用默认值更改
  17. OpenSSL之自签名证书认证
  18. 小愿景,职业发展,思维拓展
  19. 系统漏洞解析含flag
  20. 关于安科瑞电气安全产品在医药工业洁净厂房的电气工程设计与应用

热门文章

  1. dorado7.x积累
  2. 深入理解JVM(四)JVM的垃圾回收机制
  3. 计算机四级信息安全工程师报名,2017计算机四级信息安全工程师考试练习题
  4. 拉普拉斯------拉普拉斯变换
  5. 经合经验模态分解res残差
  6. android安装apk时提示安装包异常导致安装失败,常见apk安装失败的错误及原因
  7. python清洗文本非法字符_Python 文本字符串清理
  8. three.js 设置雾化效果(Fog)
  9. 获取Alexa排名数据接口
  10. 51单片机流水灯LED