1. 程式人生 > >將Dicom資料集轉換成raw+mhd檔案

將Dicom資料集轉換成raw+mhd檔案

問題

原本專案用的都是自己用程式合併的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

解決方案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檔案。
如果想批量處理,可以程式設計遍歷各個資料夾及子資料夾,構造上面的轉換命令執行即可。

參考