我有一个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,我如何知道切片编号?
答案 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(矢状)的算法,我仍然不知道我在冠状病例(或矢状面)中的切片怎么样? )...