知道片数吗?
Know slice number?
我有一个 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]);
一切都好...
问题:如果我通过CORONAL plan 对系列进行切片,切片数不是44 !!但是有多少?如果计划是 CORONAL 或 SAGITTAL,我怎么知道切片编号?
在冠状和矢状切面上,更多的是关于位置而不是切面索引。
您需要计算每个轴 (x,y,z) 的 min/max 原点
例如
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();
是的,这是另一种计算方法...在我的例子中,我有 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(矢状位),我仍然不知道我的冠状位(或矢状位)切片有多少...
我有一个 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]);
一切都好...
问题:如果我通过CORONAL plan 对系列进行切片,切片数不是44 !!但是有多少?如果计划是 CORONAL 或 SAGITTAL,我怎么知道切片编号?
在冠状和矢状切面上,更多的是关于位置而不是切面索引。
您需要计算每个轴 (x,y,z) 的 min/max 原点
例如
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();
是的,这是另一种计算方法...在我的例子中,我有 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(矢状位),我仍然不知道我的冠状位(或矢状位)切片有多少...