判斷 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 影像會比較簡單