Stationary Cone Beam Rotation CT
1 개요
고정된 콘빔 CT 시스템에서 회전하는 물체의 움직임을 고려하여 단면 영상을 복원하는 알고리즘
2 알고리즘 상세 설명
Scan Geometry |
---|
![]() |
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 |
---|---|
![]() |
![]() |
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 는 Object Voxel 에 대하여 Sigmoid 및 Intensity Threshold 가 수행된 point cloud 입니다. 또한 3D View 의 Zoom Fit 상태에서 보다 시각적으로 일치하도록 x 축에 대하여 180 도 회전한 상태로 출력됩니다.
3 파라미터 설정 및 사용 방법
Scan Geometry 설정
const CResult SetOptimizationOption(EOptimizationOption eOptimizationOption)
Geometry 연산 시, 최적화 옵션을 선택합니다. Accurater 에서는 FDK Siddon 방식을 사용하며, Faster 에서는 이를 근사한 FDK 방식을 사용합니다.eOptimizationOption
: 최적화 옵션 Default: EOptimizationOption_Faster- EOptimizationOption_Faster: 정확도보다 속도를 우선하는 빠른 최적화 옵션
- EOptimizationOption_Accurater: 속도보다 정확도를 우선하는 빠른 최적화 옵션
const CResult SetDetectorCellXSizeUnit(double f64DetectorCellXSizeUnit)
Detector 단일 cell 의 x 축 방향 길이 [unit] 을 지정합니다.f64DetectorCellXSizeUnit
: Detector 단일 cell 의 x 축 방향 Unit 길이 [unit]
const CResult SetDetectorCellYSizeUnit(double f64DetectorCellYSizeUnit)
Detector 단일 cell 의 y 축 방향 길이 [unit] 을 지정합니다.f64DetectorCellYSizeUnit
: Detector 단일 cell 의 y 축 방향 Unit 길이 [unit]
const CResult SetPrincipalDeltaXPixel(double f64PrincipalDeltaXPixel)
Source 에서 Detector 평면으로 수선을 내렸을 때, 평면과 만나는 점의 위치인 principal point 가 detector 중심과의 x 축 방향 위치 차이인 principal delta x [px] 를 지정합니다. Detector 의 위치에 offset 이 있거나, detector 이미지가 crop 된 경우 또는 detector 평면이 기울어진 경우를 보정하기 위해 사용됩니다.f64PrincipalDeltaXPixel
: principal delta x [px]
Default: 0.00 [px]
const CResult SetPrincipalDeltaYPixel(double f64PrincipalDeltaYPixel)
Source 에서 Detector 평면으로 수선을 내렸을 때, 평면과 만나는 점의 위치인 principal point 가 detector 중심과의 y 축 방향 위치 차이인 principal delta y [px] 를 지정합니다. Detector 의 위치에 offset 이 있거나, detector 이미지가 crop 된 경우 또는 detector 평면이 기울어진 경우를 보정하기 위해 사용됩니다.f64PrincipalDeltaYPixel
: principal delta y [px]
Default: 0.00 [px]
const CResult SetObjectRotationAngleDistanceDegree(double f64ObjectRotationAngleDistanceDegree)
입력 이미지의 전체 페이지 수 + 1 에 대하여 물체의 총 회전각 거리 [degree] 를 설정합니다. 대부분의 상황에서 360 degree 일 때 유효한 결과를 얻을 수 있으며, 2 degree 씩 회전하는 이미지 180 page 인 경우 360 을 입력하면 됩니다.f64ObjectRotationAngleDistanceDegree
: 물체의 총 회전각 거리 [degree]
Default: 360.00 [degree] (0.00, ..)
const CResult SetObjectRotationPivotUnit(const Base::TPoint3<double>& tpObjectRotationPivotUnit)
Source 의 위치를 원점으로 하는 Scan Geometry Coordinates 에서, 물체의 회전축이 지나는 pivot [unit] 위치이자 Object Local Coordinates 에서는 원점이 될 위치를 결정합니다.tpObjectRotationPivotUnit
: 물체의 회전축이 지나는 pivot [unit] 위치
const CResult SetObjectRotationAxis(const Base::TPoint3<double>& tpObjectRotationAxis)
Source 의 위치를 원점으로 하는 Scan Geometry Coordinates 에서, 물체의 회전축 [unit] 이자 Object Local Coordinates 에서는 -y 축이 될 회전축을 결정합니다. 이 방향 벡터의 부호를 반전하여 원점 대칭한 값을 설정하면 회전 방향을 반대로 설정할 수 있습니다.
object 회전축과 source to detector 수선이 수직에 가까울 수록 y 축 voxel 간 artifact 가 완화됩니다.tpObjectRotationAxis
: 물체의 회전축 [unit]
const CResult SetObjectVoxelSizeUnit(const Base::TPoint3<double>& tpObjectVoxelSizeUnit)
Object Local Coordinates 에서 정렬된 단일 직육면체 복셀의 축 방향 길이 [unit] 를 설정합니다.tpObjectVoxelSizeUnit
: 단일 직육면체 복셀의 축 방향 길이 [unit]
const CResult SetObjectVoxelCount(const Base::TPoint3<int32_t>& tpObjectVoxelCount)
Object Local Coordinates 에서 정렬된 복셀들의 축 방향 복셀 개수를 설정합니다.tpObjectVoxelCount
: 축 방향 복셀 개수
입력 데이터 처리 방식 설정
const CResult SetNormalizedAirThreshold(double f64NormalizedAirThreshold)
Air 를 촬영한 detector 의 수치가 소스 이미지 타입을 고려하여 [0, 1] 사이로 정규화 되었을 때 대략 어느정도 수치인지를 의미하는 normalized air threshold 를 설정합니다.f64NormalizedAirThreshold
: normalized air threshold
Default: 0.82 [0.00, 1.00]
const CResult EnableFrequencyRampFilter(bool bEnableFrequencyRampFilter)
FDK 에서 저주파를 억제하기 위하여 주파수 필터링 시 Ramp Filter 의 적용 여부를 설정합니다. 일반적으로 적용하는 것이 권장됩니다.bEnableFrequencyRampFilter
: 주파수 필터링 시 Ramp Filter 의 적용 여부
Default: true
const CResult SetFrequencyWindow(EFrequencyWindow eFrequencyWindow)
FDK 에서 고주파를 억제하기 위하여 주파수 필터링 시 추가적으로 적용할 window 를 설정합니다.eFrequencyWindow
: 주파수 필터링 시 추가적으로 적용할 window
Default: EFrequencyWindow_Gaussian- EFrequencyWindow_None: window 없음
- EFrequencyWindow_Hann: Hann window
- EFrequencyWindow_Hamming: Hamming window
- EFrequencyWindow_Blackman: Blackman window
- EFrequencyWindow_BlackmanNuttall: Blackman Nuttall window
- EFrequencyWindow_BlackmanHarris: Blackman Harris window
- EFrequencyWindow_Gaussian: sigma 를 파라미터로 사용하는 Gaussin window
const CResult SetSigma(double f64Sigma)
Frequency window 가 Gaussian 인 경우 사용 될 sigma 를 설정합니다.f64Sigma
: Frequency window 가 Gaussian 인 경우 사용 될 sigma
Default: 0.1 (0.00, 0.50]
출력 데이터 처리 방식 설정
const CResult EnableCircularMask(bool bEnableCircularMask)
Transverse plane 에서 적용되며, circular mask radius [unit] 보다 회전축 까지의 거리가 가까운 복셀만 남기는 원형 마스킹 처리 여부를 결정합니다.bEnableCircularMask
: 원형 마스킹 처리 여부
Default: true
const CResult SetCircularMaskRadiusUnit(double f64CircularMaskRadiusUnit)
Circular mask 활성화 시 transverse plane 에서 적용될 circular mask radius [unit] 를 설정합니다.f64CircularMaskRadiusUnit
: circular mask radius [unit]
const CResult SetOutputFormat(EOutputFormat eOutputFormat)
Slicing plane 의 출력 형식을 지정합니다. F32 는 unlimited 타입이며 수치를 확인하고 적절한 Sigmoid 값을 지정할 때 유용합니다.
U8 과 U16 은 실행 시간 절감 및 데이터 저장 용량 감소와 시각화에 유리합니다.eOutputFormat
: 출력 형식
Default: EOutputFormat_U8- EOutputFormat_U8: unsigned 8 bit 타입
- EOutputFormat_U16: unsigned 16 bit 타입
- EOutputFormat_F32: floating point 32 bit 타입, unlimited
const CResult SetSigmoidB(double f64SigmoidB)
Destination 3D object 와 U8/U16 destination image 에서 Object Voxel 에 적용할 generalized sigmoid 의 growth rate B 파라미터를 설정합니다.f64SigmoidB
: generalized sigmoid 의 growth rate B
Default: 1.00
const CResult SetSigmoidM(double f64SigmoidM)
Destination 3D object 와 U8/U16 destination image 에서 Object Voxel 에 적용할 generalized sigmoid 의 horizontal translation M 파라미터를 설정합니다.f64SigmoidM
: generalized sigmoid 의 horizontal translation M
Default: 0.00
const CResult SetIntensityThreshold(int64_t i64IntensityThreshold)
Destination 3D object 에서 Object Voxel 에 generalized sigmoid 를 적용한 이후 intensity threshold 를 설정합니다.i64IntensityThreshold
: intensity threshold
const CResult SetSlicingPlane(ESlicingPlane eSlicingPlane)
Destination image 에 출력할 slicing plane 을 설정합니다.eSlicingPlane
: slicing plane
Default: ESlicingPlane_Transverse- ESlicingPlane_Transverse: transverse 단면, 이미지의 +x, +y 축은 각각 object local coordinates 의 +x, -z 축과 대응됩니다. +page 축은 +y 축에 대응됩니다.
- ESlicingPlane_Coronal: coronal 단면, 이미지의 +x, +y 축은 각각 object local coordinates 의 +x, +y 축과 대응됩니다. +page 축은 +z 축에 대응됩니다.
- ESlicingPlane_Sagittal: sagittal 단면, 이미지의 +x, +y 축은 각각 object local coordinates 의 -z, +y 축과 대응됩니다. +page 축은 +x 축에 대응됩니다.
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();
5 기타 사항
Supported Feature
- Image
- Source Image
- Destination Image
- 3D Object
- Destination 3D Object
Supported Format
- Source
[in]
- Page
- 1
- Channel
- 1
- Value Type & Depth
- Signed: 8, 9-16, 32
- Unsigned: 8, 9-16, 32
- Floating: 32, 64
- Page
- Destination
[out]
- Page
- Object Voxel Count 및 Slicing Plane 에 의하여 결정
- Channel
- 1
- Value Type & Depth
- Output Format 파라미터 설정에 따라 U8, U16, F32 지원
- Page