투영 데이터로부터 영상 재구성하기
이 예제에서는 머리 팬텀 영상으로부터 평행 빔 및 부채꼴 빔 투영을 형성하는 방법 그리고 라돈 및 부채꼴 빔 변환을 사용하여 영상을 재구성하는 방법을 보여줍니다.
The
radon
및 iradon
함수는 투영에 평행 빔 기하를 사용하는 반면 fanbeam
및 ifanbeam
함수는 부채꼴 빔 기하를 사용합니다. 아래의 예제에서는 평행 빔과 부채꼴 빔 기하를 비교하기 위해 기하별로 합성 투영을 만든 다음, 이 합성 투영을 사용하여 원본 영상을 재구성합니다.
영상 재구성이 필요한 실제 사례로 X 레이 흡수 단층 촬영이 있습니다. 여기서는 서로 다른 각도로 촬영 대상 신체를 통과하는 방사선의 감쇠를 측정하는 방식으로 투영을 형성합니다. 원본 영상은 촬영 대상 신체의 단면이라고 할 수 있습니다. 그 명암 값은 신체 조직의 밀도를 나타냅니다. 특수한 의료 영상 장치로 투영을 수집한 다음 iradon
또는 ifanbeam
을 사용하여 신체의 내부 영상을 재구성합니다.
함수 iradon
은 평행 빔 투영으로부터 영상을 재구성합니다. 평행 빔 기하에서는 특정 각도로 영상을 통과하는 선적분의 집합을 조합하여 각각의 투영을 형성합니다. 함수 ifanbeam
은 부채꼴 빔 투영으로부터 영상을 재구성하는데, 이 투영 장치에는 하나의 이미터와 여러 개의 센서가 있습니다.
머리 팬텀 만들기
테스트 영상은 Shepp-Logan 머리 팬텀이며, 함수 phantom
을 사용하여 만들 수 있습니다. 이 팬텀 영상은 실제 사람 두부의 단층 촬영 영상에 있는 여러 특징을 보여줍니다. 외부의 밝은 타원형 껍질은 두개골, 그 안쪽의 여러 타원은 뇌의 특징 또는 종양을 나타냅니다.
P = phantom(256); imshow(P)
평행 빔 - 합성 투영 계산하기
평행 빔 기하를 사용하여 합성 투영을 만들고 투영 각도의 수를 다르게 합니다. radon
을 호출할 때마다 행렬이 출력되는데, 각 행은 해당 theta
의 각도 중 하나에 대응하는 라돈 변환입니다.
theta1 = 0:10:170; [R1,~] = radon(P,theta1); num_angles_R1 = size(R1,2)
num_angles_R1 = 18
theta2 = 0:5:175; [R2,~] = radon(P,theta2); num_angles_R2 = size(R2,2)
num_angles_R2 = 36
theta3 = 0:2:178; [R3,xp] = radon(P,theta3); num_angles_R3 = size(R3,2)
num_angles_R3 = 90
각도별로 xp축을 따라 N개의 점에서 투영이 계산됩니다. 여기서 N은 영상의 대각선 거리에 따라 결정되는 상수이며, 가능한 모든 투영 각도에서 이러한 대각선 거리를 따라 모든 픽셀이 투영됩니다.
N_R1 = size(R1,1)
N_R1 = 367
N_R2 = size(R2,1)
N_R2 = 367
N_R3 = size(R3,1)
N_R3 = 367
따라서 더 작은 머리 팬텀을 사용할 경우 xp축에 있는 더 적은 수의 점에서 투영을 계산하게 됩니다.
P_128 = phantom(128); [R_128,xp_128] = radon(P_128,theta1); N_128 = size(R_128,1)
N_128 = 185
투영 데이터 R3
을 표시합니다. 원본 팬텀 영상의 일부 특징이 R3
의 영상에 나타납니다. R3
의 첫 번째 열은 0도에서의 투영에 해당하며, 세로 방향으로 적분됩니다. 가장 중심에 있는 열은 90도에서의 투영에 해당하며, 가로 방향으로 적분됩니다. 90도에서의 투영은 0도에서의 투영보다도 종단면(profile)이 더 넓습니다. 팬텀의 가장 바깥쪽 타원의 큰 세로 방향 반 축 때문입니다.
imagesc(theta3,xp,R3) colormap(hot) colorbar xlabel('Parallel Rotation Angle - \theta (degrees)'); ylabel('Parallel Sensor Position - x\prime (pixels)');
평행 빔 - 투영 데이터로부터 머리 팬텀 재구성하기
각각의 재구성에서 평행 회전 증분 dtheta
를 위에 사용된 것과 일치시켜 대응하는 합성 투영을 만듭니다. 실제 사례에서는 트랜스미터와 센서의 기하는 알고 있겠지만 원본 영상 P
는 모릅니다.
다음 세 가지 재구성(I1
, I2
, I3
)에서는 투영의 각도 수를 다르게 하면 어떻게 되는지 보여줍니다. I1
및 I2
에서는 원본 팬텀에 보였던 일부 특징이 불분명해집니다. 특히 각 영상의 맨 아래에 있는 3개의 타원에 주목하십시오. I3
의 결과는 원본 영상 P
와 매우 비슷합니다.
I1
및 I2
에는 아티팩트가 많습니다. 이 아티팩트를 방지하려면 각도의 개수를 늘리십시오.
% Constrain the output size of each reconstruction to be % the same as the size of the original image, |P|. output_size = max(size(P)); dtheta1 = theta1(2) - theta1(1); I1 = iradon(R1,dtheta1,output_size); dtheta2 = theta2(2) - theta2(1); I2 = iradon(R2,dtheta2,output_size); dtheta3 = theta3(2) - theta3(1); I3 = iradon(R3,dtheta3,output_size); figure montage({I1,I2,I3},'Size',[1 3]) title(['Reconstruction from Parallel Beam Projection ' ... 'with 18, 24, and 90 Projection Angles'])
부채꼴 빔 - 합성 투영 계산하기
부채꼴 빔 기하를 사용하여 합성 투영을 계산하고 'FanSensorSpacing'
을 다르게 합니다.
D = 250; dsensor1 = 2; F1 = fanbeam(P,D,'FanSensorSpacing',dsensor1); dsensor2 = 1; F2 = fanbeam(P,D,'FanSensorSpacing',dsensor2); dsensor3 = 0.25; [F3,sensor_pos3,fan_rot_angles3] = fanbeam(P,D, ... 'FanSensorSpacing',dsensor3);
투영 데이터 F3
을 표시합니다. 부채꼴 회전 각도는 0도 ~ 360도이고 동일한 패턴이 180도 떨어진 위치에 나타납니다. 같은 특징이 양쪽에서 샘플링되고 있기 때문입니다. 이 부채꼴 빔 투영 영상의 특징을 위에 있는 평행 빔 투영 영상의 같은 특징과 연관 지을 수 있습니다.
imagesc(fan_rot_angles3,sensor_pos3,F3) colormap(hot) colorbar xlabel('Fan Rotation Angle (degrees)') ylabel('Fan Sensor Position (degrees)')
부채꼴 빔 - 투영 데이터로부터 머리 팬텀 재구성하기
각각의 재구성에서 부채꼴 센서 간격을 각 합성 투영을 만드는 데 쓰인 것과 일치시킵니다. 실제 사례에서는 트랜스미터와 센서의 기하는 알고 있겠지만 원본 영상 P
는 모릅니다.
'FanSensorSpacing'
의 값을 변경하면 사실상 각 회전 각도에 쓰인 센서의 개수가 바뀝니다. 이 부채꼴 빔 재구성 각각에 같은 회전 각도가 사용됩니다. 매번 다른 회전 각도를 사용한 평행 빔 재구성과 다른 점입니다.
'FanSensorSpacing'은 fanbeam
및 ifanbeam
을 사용할 때 제어할 수 있는 여러 파라미터 중 하나일 뿐입니다. 함수 fan2para
및 para2fan
을 사용하여 병렬 빔 투영 데이터를 부채꼴 빔 투영 데이터로 변환하거나 그 반대로 변환할 수도 있습니다.
Ifan1 = ifanbeam(F1,D,'FanSensorSpacing',dsensor1, ... 'OutputSize',output_size); Ifan2 = ifanbeam(F2,D,'FanSensorSpacing',dsensor2, ... 'OutputSize',output_size); Ifan3 = ifanbeam(F3,D,'FanSensorSpacing',dsensor3, ... 'OutputSize',output_size); montage({Ifan1,Ifan2,Ifan3},'Size',[1 3]) title(['Reconstruction from Fan Beam Projection with '... '18, 24, and 90 Projection Angles'])