2013-05-28 4 views
1

나는 DICOM 이미지를 읽을 dcmtk 사용하고 있는데 나는 새로운 샘플의 속성을 다음 있습니다 : 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 

나는 int16_t 데이터를 읽기 위해 getOutputData (16)를 사용합니다. 값이 -1 * (2^16) 근처에서 음수이고 2^15로 값을 뺄 때 모든 것이 정상적으로 보이고 이미지를 볼 수 있기 때문에 놀랍습니다! :-(

지금 나는 두 가지 질문이 있습니다?!

  1. 가 왜 값 2^15을 빼야한다을하고 확인을가는 이미지에는 padding value 사용할 수 없습니다 getOutputData의 문서에서
  2. , 그건 말하기 about 렌더링 된 픽셀 데이터는 항상 부호가 없습니다. (0028,0103) 속성이 내게 말하기 때문에 이미지 데이터에 서명 할 때 특별히 의미하는 것은 무엇입니까?이 방법이 적절하지 않으면 실제 데이터를 얻을 수 있습니까? dcmtk 데이터?
+0

'getOutputData'는 [문서] (http://support.dcmtk.org/docs/classDicomImage.html#46da8f4e40464d2659938b2b0bd10519)에 따라'void *'를 반환하며 (사용자가 직접 언급 한 것처럼) 출력 데이터는 항상 서명되지 않습니다. . 그래서 대신 출력 데이터를'uint16'으로 변환해야합니까? –

+0

Paolo가 제안한대로 _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 비트 숫자에 대해 [2의 보수] (http://en.wikipedia.org/wiki/Two%27s_complement)를 계산하는 연산입니다. 이것은 부호없는 정수로 해석 된 숫자를 부호있는 정수로 해석 된 숫자로 변환하는 작업입니다. 섹션을 살펴보십시오 _Subtraction from 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 비트 데이터를 요청하면 데이터 집합에 지정된 최소 및 최대 값에 관계없이 fron 0 ~ 65535 범위의 픽셀을 얻습니다. 반환 된 데이터가 표시되기 때문에 이미지에 저장된 원래 데이터가 아닙니다. 8 비트로 값을 오른쪽으로 이동하거나 8 비트 데이터를 요청해야한다고 생각합니다. (이미지가 16 비트 인 경우에도) : 어쨌든 그레이 스케일 인 경우 그래픽 카드가 16 비트를 처리 할 수 ​​있다고 생각하지 않습니다.

0

DICOM 헤더는 데이터가 DICOM 파일에 부호있는 값으로 저장되지만 설명서에는 getOutputData가 부호없는 값으로 변환한다고되어 있습니다. 그래서 getOutputData의 출력을 int16_t 대신 uint16_t로 읽으십시오.

+0

시도했습니다. 16 번째 비트가 항상 설정됩니다! 왜 나 자신에게 묻습니까? –

+0

어쩌면 원래 값이 음수 값이되는 이유 일 수 있습니다. – jap1968

+1

uint_16의 범위는 0 ~ 65,535입니다. int_16의 범위는 -32,768 ~ 32,767입니다. 저장된 값이 32767보다 큰 경우 16 번째 비트가 설정됩니다. 그래서 당신 int_16면, 그것은 부정적인 것으로 나타납니다. –