2015-01-22 1 views
1

У меня есть ряд DICOM, с последующим происхождения, интервал и размер:Знаете номер ломтика?

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); 

где m_pReader является объектом vtkDICOMReader ...

dOrigin является 0, 0, 0;

dSpacing id 0.447266, 0.447266, 3.998718;

nКонтент является 0, 511, 0, 511, 0, 43;

серия 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]); 

Все Allright ...

Проблема: если я нарежьте серию через План CORONAL, число ломтиков не 44! Но сколько? Как узнать номер фрагмента, если этот план является CORONAL или SAGITTAL?

ответ

2

На Coronal и Sagittal нарезать его больше о позиции вместо индекса среза.

Вам необходимо рассчитать мин/макс координат для каждой оси (х, у, г)

например,

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

Вы можете рассчитать свой новый источник в вашем нарезания Event, где _positionDelta является вашим вкл значением/Декабрь (более или менее псевдокод)

например.

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

Прежде всего, t слов, чтобы поблагодарить вас за вашу поддержку! :) – 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_pReslice2 (корональной) и для m_pReslice3 (сагиттальный), Я до сих пор не знаю, как могут ломтики у меня в корональном корпусе (или сагиттале) ...

+0

Какие значения у вас есть в массиве dOriginMax? – JohnnyQ

+0

Соответствует тем же сериям DICOM, что и в моем первом сообщении, значения: dOriginMax [0] = 228.10546875, dOriginMax [1] = 228.10546875, dOriginMax [2] = 167.94166992. – flaviu2

+0

Кроме того, я заметил что-то интересное: для всех тестируемых серий DICOM размер vtkDICOMReader по плану X и Y составляет 512 ... размер по Z-плану отличается от любой серии DICOM ... – flaviu2

 Смежные вопросы

  • Нет связанных вопросов^_^