判斷 DICOM 影像方向:用六個數值精準分類 Axial / Coronal / Sagittal
在處理醫學影像(特別是 DICOM 格式的 CT / MRI)時,我們常常需要知道影像的方向(Orientation),例如:
-
Axial(橫切面)
-
Coronal(冠狀面 / 正面)
-
Sagittal(矢狀面 / 側面)
這在做 3D 重建、切片排序、資料標準化時都非常重要。
而 DICOM 影像的方向資訊,其實就藏在標籤 (0020,0037) Image Orientation Patient
裡面?
Image Orientation Patient 是什麼?
(0020,0037)
會儲存 6 個浮點數,分別代表:
RowCosines (3個數) ColCosines (3個數)
也就是:
-
前三個數字:描述圖像的「橫向」(row)的方向向量
-
後三個數字:描述圖像的「縱向」(col)的方向向量
例如這三種常見情況:
方向類型 | IOP 六個數值 |
---|---|
上下 Axial | 1 0 0 0 1 0 |
正面 Coronal | 1 0 0 0 0 -1 |
側面 Sagittal | 0 1 0 0 0 -1 |
這些向量理論上是完全精確的,但在實際 DICOM 資料中,你會看到像這樣的浮點誤差:
0.99 0.01 0.00 0.02 0.00 -0.98
這代表向量「接近」Sagittal,但不是完美的 0/1,因此我們需要一個「容錯」的方式來判斷它屬於哪一種主要方向。
常見錯誤做法
許多程式碼會把 row、col 向量各自取最接近的主軸,再根據組合來判斷方向。但這樣的問題是:
-
需要處理 ± 號邏輯(例如 col 可能是 -Z)
-
需要處理 row/col 組合出現不合理組合的情況
-
代碼變得冗長,不好維護
✅ 最簡單又穩定的方法:一次比對三種方向
我們可以直接定義三種標準方向(Axial、Coronal、Sagittal)的 6 個標準值,然後把實際的 orient_vals
跟它們一一比較,取出誤差最小的那一個。如果誤差低於一定門檻(例如 0.5),我們就認定這是那個方向。
程式碼
import numpy as np def classify_orientation(orient_vals, tol=0.5): """ orient_vals: list[float],長度 6 直接跟 axial / coronal / sagittal 三種標準方向比對 誤差小於 tol 才接受,否則回傳 None """ orient_arr = np.array(orient_vals) templates = { 'axial': np.array([1, 0, 0, 0, 1, 0]), 'coronal': np.array([1, 0, 0, 0, 0, -1]), 'sagittal': np.array([0, 1, 0, 0, 0, -1]), } min_err = float('inf') best_type = None for ori_type, tpl in templates.items(): err = np.sum(np.abs(orient_arr - tpl)) if err < min_err: min_err = err best_type = ori_type # 誤差檢查 if min_err <= tol: return best_type else: print(f"⚠️ 無法分類方向,最小誤差 {min_err:.3f} 大於容許值 {tol}") return None
測試
print(classify_orientation([1,0,0,0,1,0])) # axial print(classify_orientation([1,0,0,0,0,-1])) # coronal print(classify_orientation([0.99,0.01,0,0,0,-0.98])) # sagittal(容錯情況) print(classify_orientation([0.7,0.7,0,0,0,-1])) # None(誤差太大)
為什麼這麼做比較好?
-
✅ 不需要拆 row / col,邏輯非常乾淨
-
✅ 只要一次 for-loop,比對三組標準值
-
✅ 容錯性高,可以處理浮點誤差
-
✅ 容易加上其他方向(例如 Oblique)
-
✅ 不會把「不明方向」硬分類,安全穩定
小結
只要 20 行左右的程式碼,就能穩定判斷 DICOM 影像的三種主要方向。這段函式非常適合放在你處理醫學影像的 preprocessing pipeline 裡,在進行重採樣、重建或深度學習前統一方向,讓資料乾淨整齊 ?
✅ 重點總結:
-
(0020,0037)
給你的是 row+col 的方向 cosines -
直接跟三種標準方向比對最簡單
-
加一個容忍誤差(例如 tol=0.5)可以安全排除非標準方向
-
分類完成後,就可以根據 axial / coronal / sagittal 執行對應的影像旋轉
心得:
照理說
會用來處理的影像大多都是 axial 影像
但是某些情況
會必須使用其他方向影像來處理
那最好都統一轉到axial 影像會比較簡單
留言板
歡迎留下建議與分享!希望一起交流!感恩!