Main Content

투영 데이터로부터 영상 재구성하기

이 예제에서는 머리 팬텀 영상으로부터 평행 빔 및 부채꼴 빔 투영을 형성하는 방법 그리고 라돈 및 부채꼴 빔 변환을 사용하여 영상을 재구성하는 방법을 보여줍니다.

The radoniradon 함수는 투영에 평행 빔 기하를 사용하는 반면 fanbeamifanbeam 함수는 부채꼴 빔 기하를 사용합니다. 아래의 예제에서는 평행 빔과 부채꼴 빔 기하를 비교하기 위해 기하별로 합성 투영을 만든 다음, 이 합성 투영을 사용하여 원본 영상을 재구성합니다.

영상 재구성이 필요한 실제 사례로 X 레이 흡수 단층 촬영이 있습니다. 여기서는 서로 다른 각도로 촬영 대상 신체를 통과하는 방사선의 감쇠를 측정하는 방식으로 투영을 형성합니다. 원본 영상은 촬영 대상 신체의 단면이라고 할 수 있습니다. 그 명암 값은 신체 조직의 밀도를 나타냅니다. 특수한 의료 영상 장치로 투영을 수집한 다음 iradon 또는 ifanbeam을 사용하여 신체의 내부 영상을 재구성합니다.

함수 iradon은 평행 빔 투영으로부터 영상을 재구성합니다. 평행 빔 기하에서는 특정 각도로 영상을 통과하는 선적분의 집합을 조합하여 각각의 투영을 형성합니다. 함수 ifanbeam은 부채꼴 빔 투영으로부터 영상을 재구성하는데, 이 투영 장치에는 하나의 이미터와 여러 개의 센서가 있습니다.

머리 팬텀 만들기

테스트 영상은 Shepp-Logan 머리 팬텀이며, 함수 phantom을 사용하여 만들 수 있습니다. 이 팬텀 영상은 실제 사람 두부의 단층 촬영 영상에 있는 여러 특징을 보여줍니다. 외부의 밝은 타원형 껍질은 두개골, 그 안쪽의 여러 타원은 뇌의 특징 또는 종양을 나타냅니다.

P = phantom(256);
imshow(P)

Figure contains an axes object. The axes object contains an object of type image.

평행 빔 - 합성 투영 계산하기

평행 빔 기하를 사용하여 합성 투영을 만들고 투영 각도의 수를 다르게 합니다. 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)');

Figure contains an axes object. The axes object with xlabel Parallel Rotation Angle - blank theta blank (degrees), ylabel Parallel Sensor Position - blank x prime blank (pixels) contains an object of type image.

평행 빔 - 투영 데이터로부터 머리 팬텀 재구성하기

각각의 재구성에서 평행 회전 증분 dtheta를 위에 사용된 것과 일치시켜 대응하는 합성 투영을 만듭니다. 실제 사례에서는 트랜스미터와 센서의 기하는 알고 있겠지만 원본 영상 P는 모릅니다.

다음 세 가지 재구성(I1, I2, I3)에서는 투영의 각도 수를 다르게 하면 어떻게 되는지 보여줍니다. I1I2에서는 원본 팬텀에 보였던 일부 특징이 불분명해집니다. 특히 각 영상의 맨 아래에 있는 3개의 타원에 주목하십시오. I3의 결과는 원본 영상 P와 매우 비슷합니다.

I1I2에는 아티팩트가 많습니다. 이 아티팩트를 방지하려면 각도의 개수를 늘리십시오.

% 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'])

Figure contains an axes object. The axes object with title Reconstruction from Parallel Beam Projection with 18, 24, and 90 Projection Angles contains an object of type image.

부채꼴 빔 - 합성 투영 계산하기

부채꼴 빔 기하를 사용하여 합성 투영을 계산하고 '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)')

Figure contains an axes object. The axes object with xlabel Fan Rotation Angle (degrees), ylabel Fan Sensor Position (degrees) contains an object of type image.

부채꼴 빔 - 투영 데이터로부터 머리 팬텀 재구성하기

각각의 재구성에서 부채꼴 센서 간격을 각 합성 투영을 만드는 데 쓰인 것과 일치시킵니다. 실제 사례에서는 트랜스미터와 센서의 기하는 알고 있겠지만 원본 영상 P는 모릅니다.

'FanSensorSpacing'의 값을 변경하면 사실상 각 회전 각도에 쓰인 센서의 개수가 바뀝니다. 이 부채꼴 빔 재구성 각각에 같은 회전 각도가 사용됩니다. 매번 다른 회전 각도를 사용한 평행 빔 재구성과 다른 점입니다.

'FanSensorSpacing'은 fanbeamifanbeam을 사용할 때 제어할 수 있는 여러 파라미터 중 하나일 뿐입니다. 함수 fan2parapara2fan을 사용하여 병렬 빔 투영 데이터를 부채꼴 빔 투영 데이터로 변환하거나 그 반대로 변환할 수도 있습니다.

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'])

Figure contains an axes object. The axes object with title Reconstruction from Fan Beam Projection with 18, 24, and 90 Projection Angles contains an object of type image.