Slicer渲染Dicom到nrrd
工作中遇到一些處理Dicom數據的需求,個人通過網絡上的一些教程
對于原始數據嘗試轉換到nrrd時,發現部分的窗體數據的渲染方向不一致
進一步發現這些很多定義的方向是跟設備廠家強相關的,不同廠家對于同一段的Dicom參數都有不同的實現方式,所以這個模塊個人調整了一段時間還是不夠滿意
現階段打算借助這些渲染醫學影像的工具代碼進行輔助處理,以減少這些繁瑣的數據轉換步驟
文章目錄
- Slicer渲染Dicom到nrrd
- 一、Slicer源碼跟蹤
- 二、功能塊封裝
- 2.1 初級邏輯校驗
- 2.2 開始邏輯封裝
- 2.3 使用Slicer進行調用
- 三、寫在末尾
一、Slicer源碼跟蹤
Slicer是一個相當大的工程,對于這種工程的探索感覺只能用好全局搜索+憑直覺猜測的方式進行
- 搜索DICOM database相關的組件
- Slicer的插件通常分為一組定義、一組UI、一組邏輯
- 所以按照上訴邏輯開始進行搜索
- 在相關源碼中出現了一些browser相關的字眼,我們猜測相關的邏輯代碼應該在進一步跳轉的DICOMLib中
2. 猜測SlicerDICOMBrowser的調用函數
- 主要使用load相關的字眼去搜索找到了一個類似的實現類
3. 探索DICOMUtils
- 出現了讀取序列的類似方法,猜測鏈猜測應該正確繼續
4. 尋找操作實現插件
- 函數讀取了一個外部插件,作為最終執行函數
5. 使用常見的現象對源碼進行重定向
- 通常來說讀取到Slicer內的數據會被封裝成一個Scalar數據
- 所以我們去追蹤DICOMScalarVolumePlugin,并查看其是否存在Load函數
- 最終找到了參數的封裝loadFilesWithSeriesReader
- 找到目標封裝
二、功能塊封裝
2.1 初級邏輯校驗
- 在Slicer的交互式控制臺中輸入下方圖示的代碼
- 對象可以被正常創建,函數也可以正常調用,說明之前的探索邏輯可行
- (這里有數據的人可以按照函數所需的參數填寫進去,是可以創建節點并渲染數據的)
2.2 開始邏輯封裝
Slicer是可以執行外部用戶腳本的,參數可以使用類c風格進行傳遞,也可以直接內部寫死,直接調用即可
- 邏輯封裝就是按照2.1的部分創建一個py腳本
- 初始化相關的類,并填寫相關的參數
核心封裝部分
plugins = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']()
...........
try:node = plugins.loadFilesWithSeriesReader(format, files, "reader")slicer.util.saveNode(node, output)slicer.mrmlScene.RemoveNode(node)slicer.app.processEvents() # 讓UI臨時更新一下,非ui模式注釋掉
except Exception as e:logging.error(str(e))
...........
2.3 使用Slicer進行調用
- 這部分比較簡單,相關參數可以去slicer論壇進行查詢
- 但需要注意的是,slicer的相關執行只能通過返回值進行判斷(😐 主要是沒找到slicer腳本輸出內容的重定向相關)
def run_slicer_script():command = [slicer_exe,"--python-script",script_path,自定義腳本參數1]result = subprocess.run(command)print(result.returncode)
三、寫在末尾
- 示例封裝壓縮包: https://download.csdn.net/download/qq_34524246/91359684
- Slicer執行外部腳本論壇: https://discourse.slicer.org/t/how-to-run-python-script-in-slicer/12352
- 最后放一張腳本通過二次封裝讓CPU 100%工作的圖