2013-05-28 67 views
1

我使用DCMTK閱讀DICOM圖像和我有以下的新樣本屬性:當我使用dcmtk時,爲什麼要從2^15中減去我的dicom圖像的像素值?

(0028,0004) Photometric Interpretation: MONOCHROME2 
(0028,0010) Rows: 512 
(0028,0011) Columns: 512 
(0028,0030) Pixel Spacing: 0.4688\0.4688 
(0028,0100) Bits Allocated: 16 
(0028,0101) Bits Stored: 16 
(0028,0102) High Bit: 15 
(0028,0103) Pixel Representation: 1 
(0028,0106) Smallest Image Pixel Value: 0 
(0028,0107) Largest Image Pixel Value: 2732 
(0028,1050) Window Center: 1366 
(0028,1051) Window Width: 2732 

我使用getOutputData(16)讀取數據int16_t。這令我感到驚訝,因爲值接近-1 *(2^16)時爲負值,當我將值減去2^15時,一切似乎都正常,我可以看到圖像! :-(

現在我有兩個問題:?!

  1. 我爲什麼要減去值2^15,它去確定沒有padding value可在圖像
  2. getOutputData文件,它是談到呈現的像素數據一直沒有簽名。。這是什麼意思,特別是當我的圖像數據被簽名是因爲(0028,0103)屬性對我說的話?如果這種方法不正確,那麼我可以得到真實的數據來源於dcmtk?
+0

根據[documentation](http://support.dcmtk.org/docs/classDicomImage.html#46da8f4e40464d2659938b2b0bd10519),'getOutputData'返回一個'void *',並且(如您所提及的那樣)輸出數據總是無符號的。那麼你是不是應該把輸出數據轉換成uint16呢? –

+0

請問保羅建議如何爲_Rescale Slope_(0028,1053)和_Rescale Intercept_(0028,1052)提供值(如果存在的話)? – jap1968

回答

0

我找到了答案。它已經由優秀開發商解釋here。請參閱第2頁。它與DCMTK工具包完全相關。

3

關鍵是像素表示(0028,0106)數據元素。

PixelRepresentation = 0 -> unsigned 
PixelRepresentation = 1 -> signed 

在您的情況下,您的值爲'1',因此您必須將值讀取並解釋爲帶符號整數。

你可以找到更多的信息here

+0

我知道。但這不是我的問題的答案!我讀了那裏的附加信息。沒有關於爲什麼我應該減去2^15。 –

+0

這是爲16位數字計算[二進制補碼](http://en.wikipedia.org/wiki/Two%27s_complement)的操作。我的意思是,這是將解釋爲無符號整數的數字轉換爲與解釋爲有符號整數相同的數字的操作。看看_Subtraction這一節從2N_ – jap1968

2

從未使用dcmtk,但它看起來像必須應用模態VOI的斜率/截距參數才能獲得正確的數字。

請參閱rescale slope and rescale interceptWindow width and center calculation of DICOM image

+0

我在這裏共享整個標題:https://docs.google.com/document/d/1XyQXv_DVGfwmoRvnhllBu-vto9TEnxW_JQFLgMXQ3FU/edit?usp=sharing –

+0

因此,不需要重新調整數據元素。您是否嘗試將像素數據作爲有符號整數來讀取,就像我在之前的回答中所建議的那樣? – jap1968

0

根據文檔getOutputData在呈現之前應用演示文稿VOI,因此您始終可以獲取未簽名的數據。 因此,如果您要求16位數據,則​​無論數據集中指定的最小值和最大值如何,您都將獲得從0到65535範圍內的像素;這是因爲返回的數據是要顯示的,它不是存儲在圖像中的原始數據。 我認爲你應該正確地將值移位8位,或者只是要求8位數據(即使圖像是16位):我認爲無論如何灰度都不能處理16位數據。

0

DICOM標題表示數據作爲有符號值存儲在DICOM文件中,但它看起來像文檔說getOutputData將其轉換爲無符號值。因此,請嘗試將getOutputData的輸出讀取爲uint16_t而不是int16_t。

+0

我試過了。第16位始終設置!我問自己爲什麼? –

+0

也許原因是原始值是負值。 – jap1968

+1

uint_16的範圍爲0到65,535。 int_16的範圍是-32,768到32,767。如果存儲的值大於32767,則將設置第16位。這就是爲什麼如果你int_16,它會顯示爲負值。 –

相關問題