Stationary Cone Beam Rotation CT

1 개요

고정된 콘빔 CT 시스템에서 회전하는 물체의 움직임을 고려하여 단면 영상을 복원하는 알고리즘

2 알고리즘 상세 설명

Scan Geometry
Scan Geometry
Fig. Scan Geometry Coordinates, Object Local Coordinates image.

RGB 순서대로 +X+Y+Z 축을 의미합니다. 왼쪽 하단은 source 를 원점으로 한 scan geometry coordinates 이며, 중앙 부분은 object local coordinates 입니다.

Scan Geometry Coordinates 의 +x 축과 +y 축은 source image 의 +x 축 및 +y 축 방향과 일치합니다. Scan Geometry Coordinates 의 +z 축은 source to detector 수직 입사 방향이며, 수직으로 입사된 detector 픽셀 좌표는 detector 평면 중심 픽셀 좌표에서 Principal Delta X,Y Pixel 파라미터를 더한 좌표입니다.

Object Local Coordinates 에서 -y 축을 물체의 회전축으로 삼습니다. 회전 방향은 Object Local Coordinates 기준 -y 축 상에서 원점을 바라볼 때 반시계 방향입니다. Object Local Coordinates 의 -y 축이 Scan Geometry Coordinates 상에서 -y 축이 되도록 회전한다면 두 좌표계의 방향이 일치합니다.

Source Images Destination Image
Source Image Destination Image
Fig. Source, Destination image.

Object Voxel Count 와 일치하는 크기의 단면 이미지들을 출력합니다.
Slicing Plane 지정함으로써 단면 종류를 선택할 수 있습니다.
Output Format 을 지정함으로써 출력 단면 이미지의 타입을 지정할 수 있습니다. Output Format 이 F32 인 경우 unlimited 타입이며, Sigmoid 가 적용되기 전의 복셀 값을 출력합니다. U8 과 U16 은 F32 의 수치에 Sigmoid 가 적용된 이후의 값이며, 저장 및 시각화에 유리합니다.

Destination 3D Object Destination 3D Object
Destination 3D Object Destination 3D Object
Fig. Destination 3D Object in Different View Angle

Destination 3D Object 는 Object Voxel 에 대하여 Sigmoid 및 Intensity Threshold 가 수행된 point cloud 입니다. 또한 3D View 의 Zoom Fit 상태에서 보다 시각적으로 일치하도록 x 축에 대하여 180 도 회전한 상태로 출력됩니다.

3 파라미터 설정 및 사용 방법

Scan Geometry 설정

입력 데이터 처리 방식 설정

출력 데이터 처리 방식 설정

4 예제 코드

CStationaryConeBeamRotationCT stationaryConeBeamRotationCT;

CFLImage fliSrcImage;
CFLImage fliDstImage;
CFL3DObject floDstObject;

stationaryConeBeamRotationCT.SetSourceImage(&fliSrcImage);
stationaryConeBeamRotationCT.SetDestinationImage(&fliDstImage);
stationaryConeBeamRotationCT.SetDestinationObject(&floDstObject);
stationaryConeBeamRotationCT.SetOptimizationOption(CStationaryConeBeamRotationCT::EOptimizationOption_Faster);
stationaryConeBeamRotationCT.SetDetectorCellXSizeUnit(0.248046875);
stationaryConeBeamRotationCT.SetDetectorCellYSizeUnit(0.248046875);
stationaryConeBeamRotationCT.SetSourceDetectorDistanceUnit(597.00);
stationaryConeBeamRotationCT.SetPrincipalDeltaXPixel(0.00);
stationaryConeBeamRotationCT.SetPrincipalDeltaYPixel(0.00);
stationaryConeBeamRotationCT.SetObjectRotationAngleDistanceDegree(360.00);
Base::TPoint3<double> tpObjectRotationPivotUnit;
tpObjectRotationPivotUnit.x = 0.00;
tpObjectRotationPivotUnit.y = 0.00;
tpObjectRotationPivotUnit.z = 28.6333;
stationaryConeBeamRotationCT.SetObjectRotationPivotUnit(tpObjectRotationPivotUnit);
Base::TPoint3<double> tpObjectRotationAxis;
tpObjectRotationAxis.x = 0.00;
tpObjectRotationAxis.y = -0.8191520442889918;
tpObjectRotationAxis.z = -0.573576436351046;
stationaryConeBeamRotationCT.SetObjectRotationAxis(tpObjectRotationAxis);
Base::TPoint3<double> tpObjectVoxelSizeUnit;
tpObjectVoxelSizeUnit.x = 0.01;
tpObjectVoxelSizeUnit.y = 0.02;
tpObjectVoxelSizeUnit.z = 0.01;
stationaryConeBeamRotationCT.SetObjectVoxelSizeUnit(tpObjectVoxelSizeUnit);
Base::TPoint3<int32_t> tpObjectVoxelCount;
tpObjectVoxelCount.x = 200;
tpObjectVoxelCount.y = 30;
tpObjectVoxelCount.z = 200;
stationaryConeBeamRotationCT.SetObjectVoxelCount(tpObjectVoxelCount);
stationaryConeBeamRotationCT.SetNormalizedAirThreshold(0.60);
stationaryConeBeamRotationCT.EnableFrequencyRampFilter(true);
stationaryConeBeamRotationCT.SetFrequencyWindow(CStationaryConeBeamRotationCT::EFrequencyWindow_Gaussian);
stationaryConeBeamRotationCT.SetSigma(0.50);
stationaryConeBeamRotationCT.EnableCircularMask(true);
stationaryConeBeamRotationCT.SetCircularMaskRadiusUnit(1.00);
stationaryConeBeamRotationCT.SetOutputFormat(CStationaryConeBeamRotationCT::EOutputFormat_U8);
stationaryConeBeamRotationCT.SetSigmoidB(4000.00);
stationaryConeBeamRotationCT.SetSigmoidM(0.00);
stationaryConeBeamRotationCT.SetIntensityThreshold(210);
stationaryConeBeamRotationCT.SetSlicingPlane(CStationaryConeBeamRotationCT::ESlicingPlane_Transverse);

stationaryConeBeamRotationCT.Execute();
CStationaryConeBeamRotationCT stationaryConeBeamRotationCT = new CStationaryConeBeamRotationCT();

CFLImage fliSrcImage = new CFLImage();
CFLImage fliDstImage = new CFLImage();
CFL3DObject floDestination = new CFL3DObject();

stationaryConeBeamRotationCT.SetSourceImage(ref fliSrcImage);
stationaryConeBeamRotationCT.SetDestinationImage(ref fliDstImage);
stationaryConeBeamRotationCT.SetDestinationObject(ref floDestination);
stationaryConeBeamRotationCT.SetOptimizationOption(CStationaryConeBeamRotationCT.EOptimizationOption.Faster);
stationaryConeBeamRotationCT.SetDetectorCellXSizeUnit(0.248046875);
stationaryConeBeamRotationCT.SetDetectorCellYSizeUnit(0.248046875);
stationaryConeBeamRotationCT.SetSourceDetectorDistanceUnit(597.00);
stationaryConeBeamRotationCT.SetPrincipalDeltaXPixel(0.00);
stationaryConeBeamRotationCT.SetPrincipalDeltaYPixel(0.00);
stationaryConeBeamRotationCT.SetObjectRotationAngleDistanceDegree(360.00);
TPoint3<double> tpObjectRotationPivotUnit = new TPoint3<double>();
tpObjectRotationPivotUnit.x = 0.00;
tpObjectRotationPivotUnit.y = 0.00;
tpObjectRotationPivotUnit.z = 28.6333;
stationaryConeBeamRotationCT.SetObjectRotationPivotUnit(tpObjectRotationPivotUnit);
TPoint3<double> tpObjectRotationAxis = new TPoint3<double>();
tpObjectRotationAxis.x = 0.00;
tpObjectRotationAxis.y = -0.8191520442889918;
tpObjectRotationAxis.z = -0.573576436351046;
stationaryConeBeamRotationCT.SetObjectRotationAxis(tpObjectRotationAxis);
TPoint3<double> tpObjectVoxelSizeUnit = new TPoint3<double>();
tpObjectVoxelSizeUnit.x = 0.01;
tpObjectVoxelSizeUnit.y = 0.02;
tpObjectVoxelSizeUnit.z = 0.01;
stationaryConeBeamRotationCT.SetObjectVoxelSizeUnit(tpObjectVoxelSizeUnit);
TPoint3<Int32> tpObjectVoxelCount = new TPoint3<Int32>();
tpObjectVoxelCount.x = 200;
tpObjectVoxelCount.y = 30;
tpObjectVoxelCount.z = 200;
stationaryConeBeamRotationCT.SetObjectVoxelCount(tpObjectVoxelCount);
stationaryConeBeamRotationCT.SetNormalizedAirThreshold(0.60);
stationaryConeBeamRotationCT.EnableFrequencyRampFilter(true);
stationaryConeBeamRotationCT.SetFrequencyWindow(CStationaryConeBeamRotationCT.EFrequencyWindow.Gaussian);
stationaryConeBeamRotationCT.SetSigma(0.50);
stationaryConeBeamRotationCT.EnableCircularMask(true);
stationaryConeBeamRotationCT.SetCircularMaskRadiusUnit(1.00);
stationaryConeBeamRotationCT.SetOutputFormat(CStationaryConeBeamRotationCT.EOutputFormat.U8);
stationaryConeBeamRotationCT.SetSigmoidB(4000.00);
stationaryConeBeamRotationCT.SetSigmoidM(0.00);
stationaryConeBeamRotationCT.SetIntensityThreshold(210);
stationaryConeBeamRotationCT.SetSlicingPlane(CStationaryConeBeamRotationCT.ESlicingPlane.Transverse);

stationaryConeBeamRotationCT.Execute();
stationaryConeBeamRotationCT = CStationaryConeBeamRotationCT()

fliSrcImage = CFLImage()
fliDstImage = CFLImage()
floDestination = CFL3DObject()

stationaryConeBeamRotationCT.SetSourceImage(fliSrcImage)
stationaryConeBeamRotationCT.SetDestinationImage(fliDstImage)
stationaryConeBeamRotationCT.SetDestinationObject(floDestination)
stationaryConeBeamRotationCT.SetOptimizationOption(CStationaryConeBeamRotationCT.EOptimizationOption.Faster)
stationaryConeBeamRotationCT.SetDetectorCellXSizeUnit(0.248046875)
stationaryConeBeamRotationCT.SetDetectorCellYSizeUnit(0.248046875)
stationaryConeBeamRotationCT.SetSourceDetectorDistanceUnit(597.00)
stationaryConeBeamRotationCT.SetPrincipalDeltaXPixel(0.00)
stationaryConeBeamRotationCT.SetPrincipalDeltaYPixel(0.00)
stationaryConeBeamRotationCT.SetObjectRotationAngleDistanceDegree(360.00)
tpObjectRotationPivotUnit = TPoint3[Double]()
tpObjectRotationPivotUnit.x = 0.00
tpObjectRotationPivotUnit.y = 0.00
tpObjectRotationPivotUnit.z = 28.6333
stationaryConeBeamRotationCT.SetObjectRotationPivotUnit(tpObjectRotationPivotUnit)
tpObjectRotationAxis = TPoint3[Double]()
tpObjectRotationAxis.x = 0.00
tpObjectRotationAxis.y = -0.8191520442889918
tpObjectRotationAxis.z = -0.573576436351046
stationaryConeBeamRotationCT.SetObjectRotationAxis(tpObjectRotationAxis)
tpObjectVoxelSizeUnit = TPoint3[Double]()
tpObjectVoxelSizeUnit.x = 0.01
tpObjectVoxelSizeUnit.y = 0.02
tpObjectVoxelSizeUnit.z = 0.01
stationaryConeBeamRotationCT.SetObjectVoxelSizeUnit(tpObjectVoxelSizeUnit)
tpObjectVoxelCount = TPoint3[int]()
tpObjectVoxelCount.x = 200
tpObjectVoxelCount.y = 30
tpObjectVoxelCount.z = 200
stationaryConeBeamRotationCT.SetObjectVoxelCount(tpObjectVoxelCount)
stationaryConeBeamRotationCT.SetNormalizedAirThreshold(0.60)
stationaryConeBeamRotationCT.EnableFrequencyRampFilter(True)
stationaryConeBeamRotationCT.SetFrequencyWindow(CStationaryConeBeamRotationCT.EFrequencyWindow.Gaussian)
stationaryConeBeamRotationCT.SetSigma(0.50)
stationaryConeBeamRotationCT.EnableCircularMask(True)
stationaryConeBeamRotationCT.SetCircularMaskRadiusUnit(1.00)
stationaryConeBeamRotationCT.SetOutputFormat(CStationaryConeBeamRotationCT.EOutputFormat.U8)
stationaryConeBeamRotationCT.SetSigmoidB(4000.00)
stationaryConeBeamRotationCT.SetSigmoidM(0.00)
stationaryConeBeamRotationCT.SetIntensityThreshold(210)
stationaryConeBeamRotationCT.SetSlicingPlane(CStationaryConeBeamRotationCT.ESlicingPlane.Transverse)

stationaryConeBeamRotationCT.Execute()

5 기타 사항

Supported Feature

Supported Format

6 관련 알고리즘