原始图像为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. valgrind——Callgrind检测程序代码的运行时间和调用过程,程序分析性能。
  2. numpy nonzero 找出非0元素
  3. Python GUI漫谈
  4. Condition中的transferForSignal()方法的不解
  5. 关于bufferKnife8.8.1点击事件无效的原因
  6. 可以这样给DataGrid加个序号列。
  7. Linux下解压:tar、rar、7z命令
  8. java微信demo_微信登陆 , 简单的demo , java
  9. 商品进销差价_商品进销差价如何核算?
  10. 海龟交易法则06_掌握优势
  11. 按钮 java_按钮大小(Java)
  12. log4j教程 11、日志记录到文件
  13. python math模块详解
  14. python mysqldb_python mysqldb 教程
  15. html为知笔记模板,为知笔记如何建立模板教程
  16. 深度学习mindspore --- win10系统cpu下安装mindspore
  17. 常见的服务器操作系统和工作站操作系统
  18. 简述https的几种加密方式
  19. Redis6简单安装
  20. 已被Windows defender smartscreen阻止

热门文章

  1. aspenv9使用_AspenONE V9详细图文安装教程
  2. Unity3d游戏地图生成器MapMagic World Generator v1.9.1
  3. 使用AS3.0开发FC超级马里奥
  4. stc15w系列单片机——TCRT5000(寻迹传感器)与光敏传感器(附代码)
  5. Python编写温度转换,逐行解释
  6. excel 根据起始日期计算到期日
  7. 粒子群算法应用于重心法选址问题-基于MATLAB实现
  8. 商务与经济统计 | 推断统计学
  9. 物联网工程设计与实施知识点
  10. 【Easyexcel】根据模板导出excel