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 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 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.