簡體   English   中英

將圖像方向轉換為軸向、矢狀或冠狀面

[英]Translate Image Orientation into axial, sagittal, or coronal plane

我已經通讀了這個問題( Understanding DICOM image attributes to getaxial/coronal/sagittal cut )並回答了一堆,但我似乎仍然無法弄清楚如何將圖像方向標簽中的數組連接成一個明確的關於圖像是從哪個平面拍攝的聲明。

我特別好奇的是如何獲取一個數組 [0.5,0,-0.8660254,0,1,0] 並能夠說它是一個矢狀視圖,就像 Roni 在這篇博文中所說的那樣: https://dicomiseasy .blogspot.com/2013/06/getting-orientation-using-image-plane.html尤其是當矢狀切面應該這樣定義時 - ['0', '1', '0', '0', '0' , '-1']。

我不知道是否有現有的插件供 Python 用戶進行此轉換,但如果有人可以幫助我了解該過程是如何完成的,我很樂意制作一個。

如果只對圖像的平面感興趣,則基本上需要圖像z軸的方向。 您可以通過取行和列圖像方向向量的叉積(例如,在ImageOrientationPatient中給出的向量)來得到它。 在結果向量中,您可以將主方向定義為值的絕對最大值。 在您的示例中,您有:

>>> import numpy as np
>>> a = np.array([0.5,0,-0.8660254])
>>> b = np.array([0,1,0])
>>> np.cross(a, b)
array([ 0.8660254, -0.       ,  0.5      ])

在這種情況下,主要方向是患者 x 軸(次要方向是患者 z 軸),表示矢狀視圖,次要橫向方向(x -> 矢狀,y -> 冠狀,z -> 橫向/軸向)。

因此,要確定主掃描方向,您可以執行以下操作:

import numpy as np

ds = dcmread(filename)
image_ori = ds.ImageOrientationPatient
image_y = np.array([image_ori[0], image_ori[1], image_ori[2]])
image_x = np.array([image_ori[3], image_ori[4], image_ori[5]])
image_z = np.cross(image_x, image_y)
abs_image_z = abs(image_z)
main_index = list(abs_image_z).index(max(abs_image_z))
if main_index == 0:
    main_direction = "sagittal"
elif main_index == 1:
    main_direction = "coronal"
else:
    main_direction = "transverse"
print(main_direction)

MrBean 已經很好地回答了這個問題,但我想我會詳細說明你的問題。

你說: '我特別好奇的是如何獲取一個數組 [0.5,0,-0.8660254,0,1,0] 並能夠說它是一個矢狀視圖'

矢狀面、軸向、冠狀面,如果你想嚴格一點的話,只有沿着病人的軸線 因此,正如您所指出的,只有那些在 IOP 向量中全為 1 或 0 的。


因此,對於上面的示例,您*不能說 [0.5,0,-0.8660254,0,1,0] 是矢狀的,因為它的叉積並不嚴格與任何單位向量一致。


但是每個人所做的,以及 Roni 在他偉大的帖子中所說的,你可以說一個特定的方向更多,或者最接近軸向,或者矢狀或冠狀,並稱之為。

或者,您可以在每個單位視圖周圍放置一個公差,如果它在單位矢量的公差范圍內,則僅將其稱為冠狀或軸向或矢狀 - 否則說它是未定義的。 (你可以把這個公差想象成一個角度——例如,如果它是一個單位向量的 10 度)。


所以上面 MrBean 的代碼實際上就是這樣做的——對於給定的輸入 IOP,它正在尋找最接近法線的單位向量(注意對max的調用):

main_index = list(abs_image_z).index(max(abs_image_z))


在我的代碼中,我經常使用這個定義,所以用我自己的方法來計算它。 注意,就像 MrBean 的代碼一樣,它也會找到“最接近”的方向, iop_rounded = [round(x) for x in iop] 這會將所有值四舍五入為 0 或 1,因此在一天結束時,與 MrBean 使用的相同。

def get_orientation(dcm: DcmObj) -> str:
    """Get orientation of dicom object.

    Returns one of
        Transverse
        Coronal
        Sagittal
        NA  (if ImageOrientationPatient not available)
    """

    iop = getattr(dcm, 'ImageOrientationPatient', None)

    if iop is None:
        return 'NA'

    iop_rounded = [round(x) for x in iop]
    plane_cross = np.cross(iop_rounded[0:3], iop_rounded[3:6])
    plane = [abs(x) for x in plane_cross]

    if plane[0] == 1:
        return 'Sagittal'
    elif plane[1] == 1:
        return 'Coronal'
    elif plane[2] == 1:
        return 'Transverse'
    else:
        return 'NA'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM