2012-04-20 189 views
4

我是dicom開發組的初學者。我需要在dicom圖像上創建一個本地化圖像行。那麼,有什麼好的想法。任何極客。如何在dicom中繪製偵察/參考線

+0

有幾個來源提到這裏:http://www.dclunie.com/medical-image-faq/html/part2.html沒有C#,但是,一些Java和C++,可以給你一個出發點。 – 2012-04-20 06:16:32

+0

感謝您的鏈接。我查了一下,但還是有疑問,我想畫出關於參考圖像的線條,所以我需要至少2個點,但是在計算後我只能得到一個點。我無法理解這裏的參數。我必須在那裏採取那些 參數? 。 – 2012-04-20 09:10:35

回答

13

大衛布拉班特讓你已經在正確的方向(如果你想與DICOM合作,你應該一定要閱讀並珍惜dclunie的醫學圖像FAQ)。讓我們看看我是否可以詳細闡述它,並使其更容易實施。

我假設你有一個工具/庫來從DICOM文件中提取標籤(Offis'DCMTK?)。爲了舉例說明,我將參考CT掃描(許多切片,即許多圖像)和一個偵察圖像,您要在其上顯示定位線。每個DICOM圖像,包括你的CT片和球探,包含有關其空間位置的完整信息,在這兩個標籤:

Group,Elem VR Value       Name of the tag 
--------------------------------------------------------------------- 
(0020,0032) DS [-249.51172\-417.51172\-821] # ImagePositionPatient 
       X0   Y0   Z0 

(0020,0037) DS [1\0\0\0\1\0]     # ImageOrientationPatient 
       A B C D E F 

ImagePositionPatient在傳送的第一像素的毫米全局座標( (x,y,z)表示的左上角像素)。我將它們標記爲X0,Y0,Z0。 ImageOrientationPatient包含兩個矢量,它們都是三個分量,用於指定第一行像素的方向餘弦和圖像的第一列像素。理解方向餘弦不會造成傷害(例如參見http://mathworld.wolfram.com/DirectionCosine.html),但dclunie建議的方法直接與它們一起工作,所以現在我們只是說它們會給出圖像平面空間中的方向。我給他們加上了A-F,讓配方更容易。

現在,在dclunie給出的代碼中(我相信它的意圖是C,但它非常簡單,它應該和Java,C#,awk,Vala,Octave等一樣好),約定如下:

scr_ * =指soruce圖像,即CT切片

dst_ * =是指目標圖像,即偵察

* _pos_x,* _pos_y,* _pos_z =所述X0 ,Y0,Z0以上

* _row_dircos_x,* _row_dircos_y,* _row_dircos_z =在A,B,C以上

* _col_dircos_x,* _col_dircos_y,* _col_dircos_z =的d,E,F以上

設置正確的值之後只適用這些:

dst_nrm_dircos_x = dst_row_dircos_y * dst_col_dircos_z 
        - dst_row_dircos_z * dst_col_dircos_y; 
dst_nrm_dircos_y = dst_row_dircos_z * dst_col_dircos_x 
        - dst_row_dircos_x * dst_col_dircos_z; 
dst_nrm_dircos_z = dst_row_dircos_x * dst_col_dircos_y 
        - dst_row_dircos_y * dst_col_dircos_x; 

src_pos_x -= dst_pos_x; 
src_pos_y -= dst_pos_y; 
src_pos_z -= dst_pos_z; 

dst_pos_x = dst_row_dircos_x * src_pos_x 
      + dst_row_dircos_y * src_pos_y 
      + dst_row_dircos_z * src_pos_z; 

dst_pos_y = dst_col_dircos_x * src_pos_x 
      + dst_col_dircos_y * src_pos_y 
      + dst_col_dircos_z * src_pos_z; 

dst_pos_z = dst_nrm_dircos_x * src_pos_x 
      + dst_nrm_dircos_y * src_pos_y 
      + dst_nrm_dircos_z * src_pos_z; 

或者,如果你有一些奇特的矩陣類,你可以建立這個矩陣並乘以它的點座標。

[ dst_row_dircos_x dst_row_dircos_y dst_row_dircos_z -dst_pos_x ] 
M = [ dst_col_dircos_x dst_col_dircos_y dst_col_dircos_z -dst_pos_y ] 
    [ dst_nrm_dircos_x dst_nrm_dircos_y dst_nrm_dircos_z -dst_pos_z ] 
    [ 0     0     0     1   ] 

這將是這樣的:

Scout_Point(x,y,z,1) = M * CT_Point(x,y,z,1) 

說了這麼多,這點我們應該轉換爲創建偵察員行的CT的?也正因dclunie已經提出了一種通用的解決方案:

我的做法是項目,即源圖像的邊框平方(即行加入TLHC,TRHC,BRHC和切片的BLHC)

如果您投影CT切片的四個角點,您將有一條垂直於偵察線的CT切片線和一條非垂直切片的梯形線。現在,如果您的CT切片與座標軸(即ImageOrientationPatient = [1 \ 0 \ 0 \ 0 \ 1 \ 0])對齊,則這四個點是微不足道的。您可以使用行數/列數和沿x/y方向的像素距離計算圖像的寬度/高度,並將其適當地相加。如果你想實現一般情況,那麼你需要一個小三角...或者可能不是。如果你還沒有閱讀方向餘弦的定義,那也許是時候了。

我會盡力讓你走上正軌。例如。在TRHC工作,你知道那裏的體素是在像面:

# Pixel location of the TRHC 
x_pixel = number_of_columns-1 # Counting from 0 
y_pixel = 0 
z_pixel = 0 # We're on a plane! 

在DICOM像素的距離值被稱爲圖像平面,所以你可以簡單地通過那些乘x和y值的位置以毫米爲單位,而z爲0(像素和毫米)。我說的這些值:

(0028,0011) US 512      # 2, 1 Columns 
(0028,0010) US 512      # 2, 1 Rows 
(0028,0030) DS [0.9765625\0.9765625]  # 20, 2 PixelSpacing 

矩陣M以上,是全球通用轉換到圖像座標,其方向餘弦可用。你現在需要的是反作業(圖像到全局)和源圖像(CT切片)。我會讓你去挖掘幾何圖書,但我認爲它應該是這樣的(旋轉部分被移位,翻譯沒有符號變化,當然我們使用src_ *值):

在CT片(例如四角),以毫米
 [src_row_dircos_x src_col_dircos_x src_nrm_dircos_x src_pos_x ] 
M2 = [src_row_dircos_y src_col_dircos_y src_nrm_dircos_y src_pos_y ] 
    [src_row_dircos_z src_col_dircos_z src_nrm_dircos_z src_pos_z ] 
    [0     0     0     1   ] 

轉換點,然後應用M2讓他們在全球座標。然後,您可以將它們提供給dclunie報告的過程。在使用它之前交叉檢查我的數學用於患者診斷! ;-)

希望這有助於理解更好的dclunie的方法。歡呼聲

+0

非常感謝您 – 2012-05-03 11:32:12

+0

非常歡迎和感謝您選擇我的答案。正如我所說,關於矩陣M2的**解釋**是準確的,但**矩陣**本身未經測試。如果你可以在你嘗試了它之後發表評論,並確認它可以工作,那麼它會很好... – Epikuros 2012-05-04 09:10:04

+0

如果我正確地理解M2應該將2D圖像行,col(以像素爲單位)座標轉換爲全局座標3D系統,那麼我認爲可以在http://dicom.nema.org/medical/dicom/2017b/output/chtml/part03/sect_C.7.6.2.html的公式C.7.6.2.1-1中找到適當的矩陣 – Aerik 2017-10-11 19:12:48