Radon Transform

1 개요

이미지의 라돈 변환을 연산하는 알고리즘입니다.

2 알고리즘 상세 설명

R(θ,ρ)=f(x,y)δ(xcosθ+ysinθρ)dxdyR(\theta, \rho) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty}f(x, y)\, \delta(x \cos\theta + y \sin\theta - \rho)\, dx\, dy

𝑓(𝑥, 𝑦) : 원본 2차원 함수

𝛿(⋅) : 디랙 델타 함수

𝜌 : 원점으로부터 선까지의 거리

𝜃 : 선의 방향 각도

라돈 변환은 2차원 함수에 대하여 모든 방향(각도)에 대해 한 줄씩 선 적분을 취하는 연산입니다.
각 방향에서 본 그림자의 투영값을 라돈 변환 결과(sinogram)로 얻을 수 있습니다.
N채널 8비트 이상 이미지 연산만 지원합니다.
해당 알고리즘은 NVIDIA Cuda 연산을 지원하기 때문에, NVIDIA Cuda 가 사용 가능한 환경에서 더 빠른 연산을 수행할 수 있습니다.

Source Image Destination Image
Source Image Destination Image
Fig. Radon Transform 동작 실행

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

멤버함수 파라미터 설 명
SetResultType EFloatingPointAccuracy eResultType IN 이미지 결과 타입

이미지 결과 타입을 설정합니다. EFloatingPointAccuracy_Bit32 로 설정 시 결과 이미지는 float 이미지로 생성되고, EFloatingPointAccuracy_Bit64 로 설정 시 결과 이미지는 double 이미지로 생성됩니다.
eResultType - Default Value: EFloatingPointAccuracy_Bit32

멤버함수 파라미터 설 명
SetStartAngle double f64StartAngle IN 변환 시작 각도

변환 시작 각도를 설정합니다.
f64StartAngle - Default Value: 0

멤버함수 파라미터 설 명
SetEndAngle double f64EndAngle IN 변환 끝 각도

변환 끝 각도를 설정합니다.
f64EndAngle - Default Value: 180

멤버함수 파라미터 설 명
EnableIncludeEndAngle bool bIncludeEndAngle IN 변환 끝 각도 사용 유무

변환 끝 각도 사용 유무를 설정합니다. true 상태 시 f64StartAngle <= Angle <= f64EndAngle 범위로 연산되고, fals 상태 시 f64StartAngle <= Angle < f64EndAngle 범위로 연산됩니다.
bIncludeEndAngle - Default Value: true

멤버함수 파라미터 설 명
EnableInscribedCircleOnly bool bInscribedCircleOnly IN 내접원 영역 연산 제한 유무

내접원 영역 연산 제한 유무를 설정합니다. true 상태 시 이미지와 동일한 중심을 가지는 내접원 영역에 대해서만 라돈 변환 연산을 진행하고, false 상태 시 이미지 전체에 대한 라돈 변환 연산을 진행합니다.
bInscribedCircleOnly - Default Value: true

멤버함수 파라미터 설 명
EnableRangePreservation bool bRangePreservation IN 값 범위 보존 유무

값 범위 보존 유무를 설정합니다. true 상태 시 이미지 값 그대로 연산하고, false 상태 시 이미지를 0~1 범위로 정규화 후 연산합니다.
bRangePreservation - Default Value: false

4 예제 코드

CRadonTransform radonTransform;

CFLImage fliSourceImage;
radonTransform.SetSourceImage(fliSourceImage);

CFLImage fliDestinationImage;
radonTransform.SetDestinationImage(fliDestinationImage);

radonTransform.SetResultType(EFloatingPointAccuracy::EFloatingPointAccuracy_Bit32);

radonTransform.SetStartAngle(0);
radonTransform.SetEndAngle(180);
radonTransform.EnableIncludeEndAngle(true);
radonTransform.EnableInscribedCircleOnly(true);
radonTransform.EnableRangePreservation(false);

radonTransform.Execute();
CRadonTransform radonTransform = new CRadonTransform();

CFLImage fliSourceImage = new CFLImage();
radonTransform.SetSourceImage(ref fliSourceImage);

CFLImage fliDestinationImage = new CFLImage();
radonTransform.SetDestinationImage(ref fliDestinationImage);

radonTransform.SetResultType(EFloatingPointAccuracy.Bit32);

radonTransform.SetStartAngle(0);
radonTransform.SetEndAngle(180);
radonTransform.EnableIncludeEndAngle(true);
radonTransform.EnableInscribedCircleOnly(true);
radonTransform.EnableRangePreservation(false);

radonTransform.Execute();
radonTransform = CRadonTransform()

fliSourceImage = CFLImage()
radonTransform.SetSourceImage(fliSourceImage)

fliDestinationImage = CFLImage()
radonTransform.SetDestinationImage(fliDestinationImage)

radonTransform.SetResultType(EFloatingPointAccuracy.Bit32)

radonTransform.SetStartAngle(0)
radonTransform.SetEndAngle(180)
radonTransform.EnableIncludeEndAngle(True)
radonTransform.EnableInscribedCircleOnly(True)
radonTransform.EnableRangePreservation(False)

radonTransform.Execute()