Python神经影像社区日趋完善,Linux shell搭配Python的神经影像工具开发方式越来越受追捧,催生出fMRIPrep、fMRIDenoise、Nipype、Nilearn、PyMVPA等优秀的toolbox,今天给大家介绍一个前期准备数据,自动整理BIDS格式的软件

基于Linux及MacOS的Heudiconv是一款很方便的dicom转nifti格式的工具,不同于dcm2nii等传统软件仅提供格式转换,Heudiconv的亮点在于自动组织图像路径,生成结构化的影像数据存储模式——BIDS格式

软件包的细节不赘述了,感兴趣的可以去Heudiconv的官网去研究:

https://neuroimaging-core-docs.readthedocs.io/en/latest/pages/heudiconv.html​neuroimaging-core-docs.readthedocs.io

这里主要分享自己使用Heudiconv的具体操作步骤:

Step 1:整理自己的Dicom数据格式

首先我们需要将自己的Dicom格式文件整理好,建议存放的路径为项目文件夹 -> Dicom数据文件夹 -> 被试文件夹 -> session文件夹 (optional) -> 各模态文件夹 -> 具体的DCM/IMA文件

/Project/SourceData/001/pretreatment (optional)T1Func.../sub002/sub003...

session一般指研究里大部分被试参与了的两次及以上相同扫描序列的扫描,纵向研究中涉及较多,如治疗前后,或者纵向多时间点随访等,如果你的数据涉及可以加这一级文件夹,如果不涉及则可以忽略这一级。

Step 2:读取原始Dicom数据头文件信息

现在开始任意读取一个Dicom数据的头文件信息

sudo docker run --rm -it -v /home/dell/project:/base nipy/heudiconv:latest -d /base/SourceData/{subject}/{session}/*/*.dcm -o /base/RawData/ -f convertall -s 001 -ss pretreatment -c none --overwrite

这里借助Docker运行(推荐),具体安装参照官网及我在fMRIPrep里给出的docker安装方法

-v 后面时定义你的project所在路径为base路径

nipy/heudiconv:latest 则是调用最新版的heudiconv

-d 后面是所有dcm文件存放的位置,利用了通配符实现,{subject}和{session}必须这样表示,用来获取相应字段名命名后续的Nifti

-o Nifti文件放置的位置,这里我们命名为RawData

-s 是你选择的被试文件夹名

-ss 是你选择的session文件夹名 (optional)

其他参数完全一致不用变

运行过后,我们会在RawData下找到一个.heudiconv的隐藏文件夹,显示隐藏文件夹如下勾选Show hidden files (Ubuntu)

这样在.heudiconv/001/info 下会有如下几个文件,我们重点关注dicominfo.tsv和heuristic.py两个文件

打开这个tsv文件,观察我们所有序列的头文件信息(用一个公开数据做演示)

观察你序列的信息用来创建关键的heuristic.py文件

我们将这里的heuristic.py文件拷贝出来,推荐RawData目录下创建一个code文件夹,符合BIDS社区规范,并且修改下权限(如果非root用户可能这个文件是只读)

# 拷贝文件
sudo cp /home/dell/project/RawData/.heudiconv/001/info/heuristic.py /home/dell/project/Rawdata/code/# 修改整个code文件夹的权限
sudo chmod -R 777 /home/dell/project/RawData/code

打开heuristic.py文件并修改,不推荐使用普通的文本编辑器打开,这样会导致一些缩进错误的问题,熟悉Python的话,最好用Pycharm打开修改,熟悉Linux的话可以尝试用vim打开修改,未经修改的文件如下:

import osdef create_key(template, outtype=('nii.gz',), annotation_classes=None):if template is None or not template:raise ValueError('Template must be a valid format string')return template, outtype, annotation_classesdef infotodict(seqinfo):"""Heuristic evaluator for determining which runs belong whereallowed template fields - follow python string module:item: index within categorysubject: participant idseqitem: run number during scanningsubindex: sub index within group"""data = create_key('run{item:03d}')info = {data: []}last_run = len(seqinfo)for s in seqinfo:"""The namedtuple `s` contains the following fields:* total_files_till_now* example_dcm_file* series_id* dcm_dir_name* unspecified2* unspecified3* dim1* dim2* dim3* dim4* TR* TE* protocol_name* is_motion_corrected* is_derived* patient_id* study_description* referring_physician_name* series_description* image_type"""info[data].append(s.series_id)return info

文件里定义了两个函数,第一个我们不用管,重点是第二个,需要参考dicominfo.tsv文件来对我们想转换的序列做筛选

比如根据上面的dicominfo.tsv我想转T1和rest两个模态,则heuristic.py文件修改如下:

import osdef create_key(template, outtype=('nii.gz',), annotation_classes=None):if template is None or not template:raise ValueError('Template must be a valid format string')return template, outtype, annotation_classesdef infotodict(seqinfo):"""Heuristic evaluator for determining which runs belong whereallowed template fields - follow python string module:item: index within categorysubject: participant idseqitem: run number during scanningsubindex: sub index within group"""t1w = create_key('sub-{subject}/ses-{session}/anat/sub-{subject}_ses-{session}_T1w')rest = create_key('sub-{subject}/ses-{session}/func/sub-{subject}_ses-{session}_task-rest_bold')info = {t1w: [], rest: []}last_run = len(seqinfo)for s in seqinfo:"""The namedtuple `s` contains the following fields:* total_files_till_now* example_dcm_file* series_id* dcm_dir_name* unspecified2* unspecified3* dim1* dim2* dim3* dim4* TR* TE* protocol_name* is_motion_corrected* is_derived* patient_id* study_description* referring_physician_name* series_description* image_type"""if (s.dim3 == 176) and ('mpr' in s.protocol_name):info[t1w].append(s.series_id)if (s.dim4 == 175) and ('rest' in s.protocol_name):info[rest].append(s.series_id)return info

这里改动了的地方(需要一些轻度Python基础):

1. data = create_key('run{item:03d}')
改为(声明Nifti文件命名规则):
t1w = create_key('sub-{subject}/ses-{session}/anat/sub-{subject}_ses-{session}_T1w')
rest = create_key('sub-{subject}/ses-{session}/func/sub-{subject}_ses-{session}_task-rest_bold')2. for循环里添加筛选条件,需要一些能区分出该序列的特征,s所涉及的所有字段都可以拿来作筛选,比如dim3(图像层数),protocol名称等
if (s.dim3 == 176) and ('mpr' in s.protocol_name):info[t1w].append(s.series_id)
if (s.dim4 == 175) and ('rest' in s.protocol_name):info[rest].append(s.series_id)

更改完成后保存退出即可

Step 3:调用dcm2niix重新运行Heudiconv,通过shell的for循环实现所有被试的批处理转换

cd /home/dell/project/SourceData/for sub in `ls -d *`
do
sudo docker run --rm -it -v /home/dell/project:/base nipy/heudiconv:latest -d /base/SourceData/{subject}/{session}/*/*.dcm -o /base/RawData/ -f /base/RawData/code/heuristic.py -s $sub -ss pretreatment -c dcm2niix -b --overwrite
done

这样整个处理过程即完成,参考下我的SourceData和最后生成的RawData

SourceData
RawData
RawData for sub-B0006A

最后再把RawData放入BIDS validator验证这是不是一个有效的BIDS dataset(BIDS的介绍、命名规范以及BIDS validator,可参考之前fMRIPrep的介绍)

QKmeans:fMRIPrep安装与使用笔记---BIDS format​zhuanlan.zhihu.com

这样的RawData就可以直接放入fMRIPrep、MRIQC等支持BIDS格式的toolbox中进行预处理

关于Heudiconv更多详细信息可参考:

DICOMS to BIDS​nipy.orgBIDS Tutorial Series: HeuDiConv WalkthroughDICOMS to BIDS​nipy.orgBIDS Tutorial Series: HeuDiConv Walkthrough​reproducibility.stanford.edu

如何用手机打开dcm格式图片_实现原始Dicom自动转换BIDS格式 ——Heudiconv相关推荐

  1. 如何用手机打开dcm格式图片_手机也能当扫描仪用?如何用手机扫描图片?

    随着智能手机的普及,传真件逐渐退出了历史的舞台,"用微信拍给我"成了办公时的经常用语,但我们知道用手机拍照的照片总是不尽如人意,总是扭七歪八不是很清楚,如何用手机代替扫描仪拍出扫描 ...

  2. 如何用手机打开dcm格式图片_如何防止自己的图片被盗用?这 4 招教你优雅加水印...

    出门旅游一趟,好不容易拍到一组相当满意的图片.想要把这些图片上传到社交平台,如何才能让大家一看就知道这是自己拍的作品,同时又防止盗图呢? 答案是在图片上加上自己的水印,这次有用功将和大家分享下,如何快 ...

  3. 如何用手机打开dcm格式图片_压缩图片用这个神奇吧(电脑版)

    一码不扫, 可以扫天下? Light Image Resizer是将数码照片和图像存在电脑中,并希望重新调整图片大小,压缩,转换,创建备份,导入或组织图片的人们设计的完美工具.Light Image ...

  4. 图片格式转换器有什么,怎么无损转换heic格式

    现在应该很多人对heic格式图片多多少少有一点了解,不管是不是苹果用户,这种格式存在于苹果中,在安卓和电脑上打开需要转换格式才能打开,最常见的图片格式是jpg/png/bmp等,那图片格式转换器有什么 ...

  5. web怎么将dwg转换图片_怎么将DWG图纸转换成JPG格式图片

    AutoDWG DWG to Image Converter是一款好用的电脑DWG文档格式转换工具.使用AutoDWG DWG to Image Converter可以轻松将电脑中的DWG图纸转换成J ...

  6. 下行文格式图片_帮你填平论文投稿格式修改这个大坑,一文了解三大出版社投稿要求...

    点击上方↑ "新能源前线" ↑关注我 [引语] 科研方法:本专栏旨在为大家整理一些研究方法策略,供大家选择参考. 材料人现在已经推出了很多优质的专栏文章,所涉及领域也正在慢慢完善. ...

  7. 手机打开html没有图片,网页看不到图片怎么办?图片打不开的解决办法

    网页图片地址失效,不如图片被网站服务器删除或者网站服务器出了故障,导致图片无法打开. 1.您可以使用鼠标在图片上右键,然后选择查看[属性],然后复制图片地址,单独在浏览器打开试试,如下图所示 2.然后 ...

  8. mobi格式电子书_进阶能力 | 了解常见的电子书格式

    静读君是初中开始接触电子书的,那个时候以为电子书就是TXT,到后来渐渐地接触到了PDF.DOC.CAJ ······ 才知道原来电子书还分这么多的格式,那个时候还在想,为什么要弄这么多不同的格式呢?那 ...

  9. xml文件转换成图片_如何把pdf文件转换成图片?

    pdf文件怎么转成JPG图片呢?相信有不少人在迷惑,可能还在想着截图等操作来完成转换,但如果是截图成JPG图片后的效果可能很差,并没有之前pdf文件那么清楚.那这样往往打印出来的效果也不怎么理想,那怎 ...

最新文章

  1. Java中比较对象的两个接口Comparable接口和Comparator接口
  2. bootloader烧写
  3. 用Kotlin开发android平台语音识别语义理解应用
  4. URI概念的简单介绍
  5. SpringBoot的配置文件-通过@ConfigurationProperties映射数据
  6. 【专场报名】七牛云音画质量优化专场
  7. EntitySpaces2009的开发文档地址
  8. MFC开发IM-第四篇、mfc 对话框dialog的属性意思
  9. 谁为“上班玩耍”买单
  10. maven3实战之设置HTTP代理
  11. 工业大数据分析应用在哪方面
  12. 82相似标准形03——不变因子、行列式因子、相抵标准形的唯一性、用求行列式因子法求标准形
  13. 【转】杜月笙识人秘诀!!
  14. 几种类型的db,以及最新的db排名,看一下
  15. 私活,永远解救不了自己屌丝的人生!
  16. 次氯酸钠phP,次氯酸钠
  17. Hive批量删除历史分区
  18. Java语言 随机点名程序
  19. java让一个方法等待_如何写一个“等待”的方法?
  20. 机器学习——数据的共线性问题(岭回归、LASSO回归、逐步回归、主成分回归)

热门文章

  1. arch linux 时间,archlinux入门--设置时钟 - webdancer's Blog
  2. 微服务权限控制(二)共享Session方式的登录认证
  3. OpenShift Security (11) - 用RHACS在DevOps的CICD中扫描部署中的安全风险
  4. OpenShift 4 - 基于Memory的HPA
  5. OpenShift - 扩展收缩应用部署规模
  6. OpenShift 4 之通过命令创建Service Mesh环境
  7. OpenShift 4 之获取全部CRD用户资源定义对象
  8. 手写数字阅读器用户界面
  9. 100m光纤测速多少正常_光纤收发器的分类知识详解
  10. 计算机基础ppt_为什么大学老师教编程上课都不敲代码?为何老师上课都是PPT讲解,实战呢?...