请参考以下代码(iDirection值分别是0,1,2, 分别代表失状、冠状和横断面;reslice是vtkImageSlabReslice,可以获得图像数据):
vtkNew<vtkEllipseArcSource> ellipse;
ellipse->SetCenter(center);
ellipse->SetSegmentAngle(360);
ellipse->SetRatio(2.0);
ellipse->SetStartAngle(0);
double dOrigin[3] = { 0.0f };
int iStencilExtent[6] = { 0 };
switch (iDirection)
{
case 0://x
{
ellipse->SetMajorRadiusVector(0, 50, 0);
dOrigin[0] = center[0];
dOrigin[1] = center[1] - 0.5 * spacing[1] * (extent[3] - extent[2]);
dOrigin[2] = center[2] - 0.5 * spacing[2] * (extent[5] - extent[4]);
ellipse->SetNormal(1, 0, 0);
iStencilExtent[0] = 0;
iStencilExtent[1] = 0;
iStencilExtent[2] = extent[2];
iStencilExtent[3] = extent[3];
iStencilExtent[4] = extent[4];
iStencilExtent[5] = extent[5];
}
break;
case 1://y
{
ellipse->SetMajorRadiusVector(50, 0, 0);
dOrigin[0] = center[0] - 0.5 * spacing[0] * (extent[1] - extent[0]);
dOrigin[1] = center[1];
dOrigin[2] = center[2] - 0.5 * spacing[2] * (extent[5] - extent[4]);
ellipse->SetNormal(0, 1, 0);
iStencilExtent[0] = extent[0];
iStencilExtent[1] = extent[1];
iStencilExtent[2] = 0;
iStencilExtent[3] = 0;
iStencilExtent[4] = extent[4];
iStencilExtent[5] = extent[5];
}
break;
case 2://z
{
ellipse->SetMajorRadiusVector(50, 0, 0);
dOrigin[0] = center[0] - 0.5 * spacing[0] * (extent[1] - extent[0]);
dOrigin[1] = center[1] - 0.5 * spacing[1] * (extent[3] - extent[2]);
dOrigin[2] = center[2];
ellipse->SetNormal(0, 0, 1);
iStencilExtent[0] = extent[0];
iStencilExtent[1] = extent[1];
iStencilExtent[2] = extent[2];
iStencilExtent[3] = extent[3];
iStencilExtent[4] = 0;
iStencilExtent[5] = 0;
}
break;
default:
break;
}
ellipse->Update();
vtkNew<vtkPolyDataToImageStencil> imageStencil;
imageStencil->SetInputData(ellipse->GetOutput());
imageStencil->SetOutputOrigin(dOrigin);
imageStencil->SetOutputSpacing(spacing);
imageStencil->SetOutputWholeExtent(iStencilExtent);
imageStencil->Update();
vtkNew<vtkImageHistogramStatistics> statics;
statics->SetInputConnection(reslice->GetOutputPort());
statics->SetStencilConnection(imageStencil->GetOutputPort());
statics->SetAutomaticBinning(true);
statics->GenerateHistogramImageOff();
statics->Update();
int ibin = statics->GetNumberOfBins();
double dmax = statics->GetMaximum();
double dmin = statics->GetMinimum();
double dsq = statics->GetStandardDeviation();
vtkNew<vtkEllipseArcSource> ellipse;
ellipse->SetCenter(center);
ellipse->SetSegmentAngle(360);
ellipse->SetRatio(2.0);
ellipse->SetStartAngle(0);
double dOrigin[3] = { 0.0f };
int iStencilExtent[6] = { 0 };
switch (iDirection)
{
case 0://x
{
ellipse->SetMajorRadiusVector(0, 50, 0);
dOrigin[0] = center[0];
dOrigin[1] = center[1] - 0.5 * spacing[1] * (extent[3] - extent[2]);
dOrigin[2] = center[2] - 0.5 * spacing[2] * (extent[5] - extent[4]);
ellipse->SetNormal(1, 0, 0);
iStencilExtent[0] = 0;
iStencilExtent[1] = 0;
iStencilExtent[2] = extent[2];
iStencilExtent[3] = extent[3];
iStencilExtent[4] = extent[4];
iStencilExtent[5] = extent[5];
}
break;
case 1://y
{
ellipse->SetMajorRadiusVector(50, 0, 0);
dOrigin[0] = center[0] - 0.5 * spacing[0] * (extent[1] - extent[0]);
dOrigin[1] = center[1];
dOrigin[2] = center[2] - 0.5 * spacing[2] * (extent[5] - extent[4]);
ellipse->SetNormal(0, 1, 0);
iStencilExtent[0] = extent[0];
iStencilExtent[1] = extent[1];
iStencilExtent[2] = 0;
iStencilExtent[3] = 0;
iStencilExtent[4] = extent[4];
iStencilExtent[5] = extent[5];
}
break;
case 2://z
{
ellipse->SetMajorRadiusVector(50, 0, 0);
dOrigin[0] = center[0] - 0.5 * spacing[0] * (extent[1] - extent[0]);
dOrigin[1] = center[1] - 0.5 * spacing[1] * (extent[3] - extent[2]);
dOrigin[2] = center[2];
ellipse->SetNormal(0, 0, 1);
iStencilExtent[0] = extent[0];
iStencilExtent[1] = extent[1];
iStencilExtent[2] = extent[2];
iStencilExtent[3] = extent[3];
iStencilExtent[4] = 0;
iStencilExtent[5] = 0;
}
break;
default:
break;
}
ellipse->Update();
vtkNew<vtkPolyDataToImageStencil> imageStencil;
imageStencil->SetInputData(ellipse->GetOutput());
imageStencil->SetOutputOrigin(dOrigin);
imageStencil->SetOutputSpacing(spacing);
imageStencil->SetOutputWholeExtent(iStencilExtent);
imageStencil->Update();
vtkNew<vtkImageHistogramStatistics> statics;
statics->SetInputConnection(reslice->GetOutputPort());
statics->SetStencilConnection(imageStencil->GetOutputPort());
statics->SetAutomaticBinning(true);
statics->GenerateHistogramImageOff();
statics->Update();
int ibin = statics->GetNumberOfBins();
double dmax = statics->GetMaximum();
double dmin = statics->GetMinimum();
double dsq = statics->GetStandardDeviation();