В этом примере показано, как использовать radon
, iradon
, fanbeam
, и ifanbeam
для формирования проекций из выборочного изображения и последующего восстановления изображения из проекций. Пока radon
и iradon
используйте параллельную геометрию для проекций, fanbeam
и ifanbeam
используйте геометрию вентилятора-балки. Чтобы сравнить параллельные и вентиляторные геометрии, приведенные ниже примеры создают синтетические проекции для каждой геометрии, а затем используют эти синтетические проекции, чтобы восстановить оригинальное изображение.
Реальным приложением, требующим реконструкции изображения, является рентгеновская абсорбционная томография, где проекции формируются путем измерения ослабления излучения, которое проходит через физический образец под различными углами. Можно рассматривать оригинальное изображение как поперечное сечение через образец, в котором значения интенсивности представляют плотность образца. Проекции собираются специальными медицинскими устройствами визуализации, а затем внутреннее изображение образца восстанавливается с помощью iradon
или ifanbeam
.
Функция iradon
восстанавливает изображение из параллельных проекций. В конфигурации с параллельным лучом каждая проекция формируется путем объединения множества интегралов линии через изображение под определенным углом. Функция ifanbeam
восстанавливает изображение из проекций вентилятора-луча, которые имеют один излучатель и несколько датчиков.
Смотрите Руководство пользователя по Image Processing Toolbox™ для схем, которые иллюстрируют обе геометрии.
Тестовое изображение является фантомом головы 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
Обратите внимание, что для каждого угла проекция вычисляется в N точек вдоль оси xp, где 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 степени из-за большой вертикальной полуоси крайнего эллипса фантома.
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
некоторые функции, которые были видны в исходном фантоме, не ясны. В частности, рассмотрим три эллипса в нижней части каждого изображения. Результат в 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); figure montage({Ifan1,Ifan2,Ifan3},'Size',[1 3]) title('Reconstruction from Fan Beam Projection with 18, 24, and 90 Projection Angles')