将Dicom数据集转换成raw+mhd文件

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 18:27:04

问题

原本项目用的都是自己用程序合并的raw和info.txt,info.txt里只包含Dimension和Spacing。
info.txt格式如下:

512 512 49
0.693359 0.693359 3

VNet框架需要使用到raw和mhd文件,mhd文件格式如下:

ObjectType = Image
NDims = 3
BinaryData = True
BinaryDataByteOrderMSB = False
CompressedData = False
TransformMatrix = 1 0 0 0 1 0 0 0 1
Offset = -175.153 -337.153 -54.1
CenterOfRotation = 0 0 0
AnatomicalOrientation = RAI
ElementSpacing = 0.693359 0.693359 3
DimSize = 512 512 49
ElementType = MET_SHORT
ElementDataFile = images-1.raw

各种参数的定义官方文档ITK MetaIO Document也没很具体的解释。


解决方案1

昨天发现itk-snap可以读取一个系列的Dicom数据,然后再导出成MetaImage(即raw+mhd)格式。
但是由于是深度学习数据量比较大,一个子文件夹转了半个小时才转完,这么搞下去不是事儿,得想个批量处理的办法。


解决方案2

连续找了俩星期,找到一个医学图像处理工具Convert3D,用命令行方式处理,自己编程可以做到批量处理。
可以在这下到最新版https://sourceforge.net/projects/c3d/files/,安装的时候最好将安装目录添加到环境变量中勾选,方便后续可以在命令行下任意文件夹位置直接执行c3d.exe。

假设F:/test_1/下有许多.dcm文件
第一步:列出文件夹中的DICOM图像序列(series)
语法:c3d.exe -dicom-series-list <directory>
Command > c3d.exe -dicom-series-list F:/test_1/  
通过该命令可以得到文件夹内dcm图像的Series ID,也不知道为什么跟dcm头里的信息没有一个对应的,本来第一想法是自己从dcm头里读的,后来发现找不到对应的tag的value,第二步必须要使用这个值,所以只能先调用该命令得到Series ID。
假设Series ID = 1.2.3456.789101112131415161718.1920.2122232425262728

第二步:读取一个DICOM图像序列(series)
语法:c3d.exe -dicom-series-read <directory> <series_id>
Command > c3d.exe -dicom-series-read F:/test_1/ 1.2.3456.789101112131415161718.1920.2122232425262728 -type short -omc F:/test_1/test_1.mhd
读取文件夹F:/test_1/下序列ID为1.2.3456.789101112131415161718.1920.2122232425262728的数据
-type 为数据的类型,可取的值有< char | uchar | short | ushort | int | uint | float | double >
-omc 将多个文件合并成一个

由此可以由dicom序列得到raw+mhd文件。
如果想批量处理,可以编程遍历各个文件夹及子文件夹,构造上面的转换命令执行即可。


参考

https://sourceforge.net/p/c3d/git/ci/master/tree/doc/c3d.md#-dicom-series-list-list-image-series-in-a-dicom-directory
https://github.com/pyushkevich/c3d

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!