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 SetDetectorCellXSize(double f64DetectorCellXSize)
Detector 단일 cell 의 x 축 방향 길이 [unit] 을 지정합니다.f64DetectorCellXSize: Detector 단일 cell 의 x 축 방향 Unit 길이 [unit]
Default: 0.24 [unit]
const CResult SetDetectorCellYSize(double f64DetectorCellYSize)
Detector 단일 cell 의 y 축 방향 길이 [unit] 을 지정합니다.f64DetectorCellYSize: Detector 단일 cell 의 y 축 방향 Unit 길이 [unit]
Default: 0.24 [unit]
const CResult SetSourceDetectorDistance(double f64SourceDetectorDistance)
Source 와 detector 간 거리 [unit] 를 설정합니다.f64SourceDetectorDistance: Source 와 detector 간 거리 [unit]
Default: 600.00 [unit]
const CResult SetObjectTotalRotationAngle(double f64ObjectTotalRotationAngle)
입력 이미지의 전체 페이지 수 + 1 에 대하여 물체의 총 회전각 거리 [degree] 를 설정합니다. 대부분의 상황에서 360 degree 일 때 유효한 결과를 얻을 수 있으며, 2 degree 씩 회전하는 이미지 180 page 인 경우 360 을 입력하면 됩니다.f64ObjectTotalRotationAngle: 물체의 총 회전각 거리 [degree]
Default: 360.00 [degree] (0.00, ..)
const CResult SetObjectLocation(const Base::TPoint3<double>& tpObjectLocation)
Source 의 위치를 원점으로 하는 Scan Geometry Coordinates 에서, 물체의 회전축이 지나는 pivot [unit] 위치이자 Object Local Coordinates 에서는 원점이 될 위치를 결정합니다.tpObjectLocation: 물체의 회전축이 지나는 pivot [unit] 위치
Default: { 0.00, 0.00, 30.00 } [unit]
const CResult SetObjectEulerAngle(const Base::TPoint3<double>& tpObjectEulerAngle)
Source 의 위치를 원점으로 하는 Scan Geometry Coordinates 에서, 물체의 회전축 [unit] 이자 Object Local Coordinates 에서는 -y 축이 될 회전축을 결정합니다. 이 방향 벡터의 부호를 반전하여 원점 대칭한 값을 설정하면 회전 방향을 반대로 설정할 수 있습니다.
object 회전축과 source to detector 수선이 수직에 가까울 수록 y 축 voxel 간 artifact 가 완화됩니다.tpObjectEulerAngle: 물체의 회전축 [unit]
Default: { 35.00, 0.00, 0.00 } [unit]
const CResult SetObjectVoxelSize(const Base::TPoint3<double>& tpObjectVoxelSize)
Object Local Coordinates 에서 정렬된 단일 직육면체 복셀의 축 방향 길이 [unit] 를 설정합니다.tpObjectVoxelSize: 단일 직육면체 복셀의 축 방향 길이 [unit]
Default: { 0.01, 0.01, 0.01 } [unit]
const CResult SetObjectVoxelCount(const Base::TPoint3<int32_t>& tpObjectVoxelCount)
Object Local Coordinates 에서 정렬된 복셀들의 축 방향 복셀 개수를 설정합니다.tpObjectVoxelCount: 축 방향 복셀 개수
Default: { 200, 60, 200 }
입력 데이터 처리 방식 설정
const CResult SetDetectorNormalizer(double f64DetectorNormalizer)
이미지 타입을 고려하여 [0, 1] 사이의 값으로 정규화 하기 위해 detector 의 수치에 곱해질 값을 의미하는 detector normalizer 를 설정합니다.
이 값을 곱한 이후 1 을 초과하는 값은 1 로 클리핑 됩니다.f64DetectorNormalizer: detector normalizer
Default: 0.00483, [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.5 (0.00, 0.50]
출력 데이터 처리 방식 설정
const CResult EnableCircularMask(bool bEnableCircularMask)
Transverse plane 에서 적용되며, circular mask radius [unit] 보다 회전축 까지의 거리가 가까운 복셀만 남기는 원형 마스킹 처리 여부를 결정합니다.bEnableCircularMask: 원형 마스킹 처리 여부
Default: true
const CResult SetCircularMaskRadius(double f64CircularMaskRadius)
Circular mask 활성화 시 transverse plane 에서 적용될 circular mask radius [unit] 를 설정합니다.f64CircularMaskRadius: circular mask radius [unit]
Default: 1.00 [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: 4000.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
Default: 220, [0, 255]
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.SetDetectorCellXSize(0.248046875);
stationaryConeBeamRotationCT.SetDetectorCellYSize(0.248046875);
stationaryConeBeamRotationCT.SetSourceDetectorDistance(597.00);
stationaryConeBeamRotationCT.SetObjectTotalRotationAngle(360.00);
Base::TPoint3<double> tpObjectLocation;
tpObjectLocation.x = 0.00;
tpObjectLocation.y = 0.00;
tpObjectLocation.z = 28.6333;
stationaryConeBeamRotationCT.SetObjectLocation(tpObjectLocation);
Base::TPoint3<double> tpObjectEulerAngle;
tpObjectEulerAngle.x = 35.00;
tpObjectEulerAngle.y = 0.00;
tpObjectEulerAngle.z = 0.00;
stationaryConeBeamRotationCT.SetObjectEulerAngle(tpObjectEulerAngle);
Base::TPoint3<double> tpObjectVoxelSize;
tpObjectVoxelSize.x = 0.01;
tpObjectVoxelSize.y = 0.01;
tpObjectVoxelSize.z = 0.01;
stationaryConeBeamRotationCT.SetObjectVoxelSize(tpObjectVoxelSize);
Base::TPoint3<int32_t> tpObjectVoxelCount;
tpObjectVoxelCount.x = 200;
tpObjectVoxelCount.y = 60;
tpObjectVoxelCount.z = 200;
stationaryConeBeamRotationCT.SetObjectVoxelCount(tpObjectVoxelCount);
stationaryConeBeamRotationCT.SetDetectorNormalizer(0.00483);
stationaryConeBeamRotationCT.EnableFrequencyRampFilter(true);
stationaryConeBeamRotationCT.SetFrequencyWindow(CStationaryConeBeamRotationCT::EFrequencyWindow_Gaussian);
stationaryConeBeamRotationCT.SetSigma(0.50);
stationaryConeBeamRotationCT.EnableCircularMask(true);
stationaryConeBeamRotationCT.SetCircularMaskRadius(1.00);
stationaryConeBeamRotationCT.SetOutputFormat(CStationaryConeBeamRotationCT::EOutputFormat_U8);
stationaryConeBeamRotationCT.SetSigmoidB(4000.00);
stationaryConeBeamRotationCT.SetSigmoidM(0.00);
stationaryConeBeamRotationCT.SetIntensityThreshold(220);
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
- 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
6 관련 알고리즘
Stationary Cone Beam Generalized CT
Stationary Cone Beam Translation CT




