知道切片号码?

时间:2015-01-22 13:34:43

标签: vtk

我有一个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;

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 个答案:

答案 0 :(得分:2)

在冠状面和矢状面上切割更多关于位置而不是切片指数。

您需要计算每个轴(x,y,z)的最小/最大原点

e.g。

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

您可以在切片事件中计算新原点,其中_positionDelta是您的inc / dec值。 (或多或少的伪代码)

e.g。

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

答案 1 :(得分: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(矢状)的算法,我仍然不知道我在冠状病例(或矢状面)中的切片怎么样? )...