2015-01-22 2 views
1

난 원점 간격 및 범위 아래 더불어 DICOM 시리즈 가지고 m_pReader vtkDICOMReader는 객체가슬라이스 번호를 아십니까?

int nExtent[6]; 
double dSpacing[3]; 
double dOrigin[3]; 

m_pReader->GetOutputInformation(0)->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), nExtent); 
m_pReader->GetOutput()->GetSpacing(dSpacing); 
m_pReader->GetOutput()->GetOrigin(dOrigin); 

...

dOrigin는 0, 0, 0이다;

d 스페이스 바 ID 0.447266, 0.447266, 3.998718;

nExtent는 0, 511, 0, 511, 0, 43입니다.

시리즈는 AXIAL입니다. 내가 AXIAL 계획을 통해 일련의 슬라이스 경우 지금, 나는 그 같이 44 개 조각으로 시리즈를 슬라이스 수 :

double deltaY = 0.0; 
delta += 1.0; 

pReslice->Update(); 
double dSliceSpacing = pReslice->GetOutput()->GetSpacing()[2]; 
vtkMatrix4x4* pMatrix = pReslice->GetResliceAxes(); 
// move the dCenter dPoint that we are slicing through 
double dPoint[4]; 
double dCenter[4]; 
dPoint[0] = 0.0; 
dPoint[1] = 0.0; 
dPoint[2] = dSliceSpacing * deltaY; 
dPoint[3] = 1.0; 
pMatrix->MultiplyPoint(dPoint, dCenter); 
pMatrix->SetElement(0, 3, dCenter[0]); 
pMatrix->SetElement(1, 3, dCenter[1]); 
pMatrix->SetElement(2, 3, dCenter[2]); 

모두가 무사하다 ...

문제를 : 나는이 시리즈를 통해 슬라이스 경우 CORONAL 계획, 조각 번호는 44가 아닙니다 !! 하지만 얼마나 많이? 계획이 CORONAL 또는 SAGITTAL 인 경우 슬라이스 번호를 어떻게 알 수 있습니까?

답변

2

관상 및 시상면에서 슬라이스 인덱스 대신 위치에 대한 자세한 정보를 표시합니다.

는 각 축 (X, Y, Z)

예컨대 대한 최소/최대 원점을 계산해야

myOriginMax.X = myOrigin.X + ((ImageDimension.SizeX - 1) * mySpacing.X); 

당신은 _positionDelta이 INC/DEC 값입니다 귀하의 슬라이스 이벤트에 새로운 기원을 계산할 수 있습니다. (다소 유사 코드)

double[] _origin = myImageReslice.GetResliceAxesOrigin(); 

if(_view == "SAGITTAL") 
{ 
    _origin[0] = Math.Min(_origin[0] + _positionDelta * mySpacing.X, myOriginMax.X); 
} 
else if(_view == "CORONAL") 
{ 
    _origin[1] = Math.Min(_origin[1] + _positionDelta * mySpacing.Y, myOriginMax.Y); 
} 
else //AXIAL 
{ 
    _origin[2] = Math.Min(_origin[2] + _positionDelta * mySpacing.Z, myOriginMax.Z); 
} 

myImageReslice.SetReliceAxesOrigin(_origin[0], _origin[1], _origin[2]); 

Render(); 
+0

우선, 나는 ' 모든 지원에 감사드립니다. :) – flaviu2

+0

두 번째로, 귀하의 의사 코드를 적용하기 시작합니다 ... 나는 피드백으로 돌아올 것입니다. – flaviu2

0

예, 그것은 내 경우에는 내가 적절한 아키텍처의 경우 몰라요 ... 시상 계획 축 계획 m_pReslice, 관상 계획 m_pReslice2 및 m_pReslice3이 ... 다른 계산 방법 하지만, 같은 장소 :

m_pReslice->GetResliceAxesOrigin(dOrigin); 

int nSizeX = nExtent[0] + nExtent[1]; 
int nSizeY = nExtent[2] + nExtent[3]; 
int nSizeZ = nExtent[4] + nExtent[5]; 

double dOriginMax[3]; 
dOriginMax[0] = dOrigin[0] + ((nSizeX - 1) * dSpacing[0]); 
dOriginMax[1] = dOrigin[1] + ((nSizeY - 1) * dSpacing[1]); 
dOriginMax[2] = dOrigin[2] + ((nSizeZ - 1) * dSpacing[2]); 

dOrigin[0] = min(dOrigin[0] + 1.0 * dSpacing[0], dOriginMax[0]); 
dOrigin[1] = min(dOrigin[1] + 1.0 * dSpacing[1], dOriginMax[1]); 
dOrigin[2] = min(dOrigin[2] + 1.0 * dSpacing[2], dOriginMax[2]); 

m_pReslice->SetResliceAxesOrigin(dOrigin); 

이 내가 도착 알고리즘을 적용하는 m_pReslice (축 계획)의 경우는 ... 내가 (시상) m_pReslice3 m_pReslice2 (관상)과의 알고리즘을 적용 할 경우, 나는 아직도 내가 관상면 (또는 시상)에서 가지고있는 조각이 어떻게 될지 모르지만 ...

+0

dOriginMax 배열에서 얻을 수있는 가치는 무엇입니까? – JohnnyQ

+0

첫 번째 게시물과 같은 DICOM 시리즈에 해당하는 값은 다음과 같습니다. dOriginMax [0] = 228.10546875, dOriginMax [1] = 228.10546875, dOriginMax [2] = 167.94166992. – flaviu2

+0

또한 흥미로운 것을 발견했습니다 : 테스트 한 모든 DICOM 시리즈에 대해 X 계획과 Y 계획상의 vtkDICOMReader의 크기는 512입니다 ... Z 계획의 크기는 DICOM 시리즈에 따라 다릅니다 ... – flaviu2