平行束投影数据的仿真(matlab)

1.Shepp-Logan头模型显示仿真

clc;
clear all;
close all;
I = phantom(256);

%phantom函数用于生成一个Shepp-Logan头模型;
%方法一:phantom(DEF,N); DEF为‘Shepp-Logan'和'Modified Shepp-Logan'(默认);
%方法二:phantom(E,N); E为自定义头模型参数,可不填;N为生成图像大小,默认256;

figure;
imshow(I, []); 

%imshow函数用于显示图像(主要为灰度图像);
%imshow(I); 显示灰度图像I;
%imshow(I, [low high]);  显示介于low和high之间的灰度图像(0-255),大于high显白,小于low显黑;  

2.平行束投影原理

3.仿真实验

方法一:利用radon变换产生投影数据 

RADON变换:是一种原始灰度图像到(ρ,θ)二维矩阵的映射,映射关系是灰度图像的像素值对参数(ρ,θ)的直线的线积分,或者叫投影,可理解为垂直于这个直线方向的像素值累计求和;

clc;
clear all;
close all;
I = phantom(256);
theta = 0: 179; %投影角度从0到179°;
P = radon(I, theta); 
%radon函数:返回灰度图像I在theta角度下的radon变换;

figure;
imshow(I, []);

figure;
imagesc(P), colormap(gray), colorbar;
%imagesc:自动缩放读入的图像;
%colormap:定义图像显示的颜色;
%colorbar:用于显示色彩条;

 

方法二:利用第二章内容计算投影数据

%edit medfuncParallelBeamForwardProjection;创建子程序
function P = medfuncParallelBeamForwardProjection(theta, N, N_d)
theta_num = length(theta);
P = zeros(N_d, theta_num);

%     椭圆密度rho  长轴ae   短轴be     xe     ye   旋转角度alpha
shep = [1         .69       .92       0      0        0
        -.8       .6624     .8740     0     -.0184    0
        -.2       .1100     .3100     .22    0        -18
        .1        .2100     .2500     0      .35      0
        .1        .0460     .0460     0      .1       0
        .1        .0460     .0230    -.08   -.605     0
        .1        .0230     .0230     0     -.606     0
        .1        .0230     .0460     .06   -.605     0];

rho = shep(: , 1).';
ae = 0.5 * N * shep(:, 2).';
be = 0.5 * N * shep(:, 3).';
xe = 0.5 * N * shep(:, 4).';
ye = 0.5 * N * shep(:, 5).';
alpha = shep(: , 6).';
alpha = alpha * pi/180;
theta = theta * pi/180;
TT = -(N_d-1)/2: (N_d-1)/2;      %探测器坐标-183到183,总计367个
for k1 = 1: theta_num            %theta_num(k1)代表t
    P_theta = zeros(1, N_d);     %一维向量[1, 367]
    for k2 = 1: max(size(xe))    %k2代表第几个椭圆
        a = (ae(k2)*cos(theta(k1)-alpha(k2)))^2 +  (be(k2)*sin(theta(k1)-alpha(k2)))^2;
        temp = a - (TT-xe(k2)*cos(theta(k1))-ye(k2)*sin(theta(k1))).^2;
        ind = temp > 0;          %保证根号>0,temp为根号内结果
        P_theta(ind) = P_theta(ind) + rho(k2) * (2*ae(k2)*be(k2)*sqrt(temp(ind)))./a;
    end
    P(: , k1) = P_theta.';
end

以上实验内容均学习整理于黄力宇老师等著《医学断层图像重建仿真实验》。

4.后续理解

4.1平行束投影公式理解

 4.2Sinogram举例

一个点在sinogram中展现应该为一条平行线:因为该点在中心,所以无论探测器从何角度投影,都会是中心位置的探测器探测得到同一投影值,所以是一样平行线,且灰度值一样。如下图:

而不在原点的一点在sinogram上展现应为正弦图,d=r*sinΘ,如下图:

 

一条线在sinogram中展现应该为一个亮点与很多条暗线: 亮点为投影角度刚好与该线重合,此时投影值最大,且仅有一个探测器探测到,反应为一个亮点;而在其他位置探测器探测到的投影值一样大,所以在sinogram中,在同一投影角度下,展现为一条竖直暗线。如下图:

 

 

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平行投影重建算法是一种常见的CT(计算机断层成像)重建算法,通过对平行X射线扫描数据进行处理,生成高质量的图像。在MATLAB中,我们可以使用以下步骤实现平行投影重建算法。 1. 数据预处理:从CT扫描仪获取的平行X射线扫描数据可能包含伪迹和噪声。我们需要对数据进行预处理,以提高图像质量。可以使用滤波技术(如高斯滤波)来去除噪声,并使用去伪影技术(如水平补偿)来减少伪迹。 2. 扫描几何校正:平行X射线扫描数据可能受到扫描几何方面的错误,例如由于机器运动或对齐问题导致的位置偏移。在重建之前,我们需要进行扫描几何校正,以确保数据的准确性和一致性。 3. 平行投影平行投影是CT重建算法的核心步骤。它通过将每个投影数据通过反投影算法转换为物体空间上对应的像素值,并对所有投影数据进行叠加,生成原始图像。在MATLAB中,我们可以使用反投影函数(如iradon)来实现这一步骤。 4. 图像重建校正:反投影重建得到的原始图像可能存在伪影和模糊等问题,需要进一步进行校正和增强。可以使用图像处理技术(如边缘增强、对比度调整等)来提高图像的清晰度和可视化效果。 5. 结果评估和调整:生成重建图像后,需要对其进行评估和调整。可以使用图像质量评估指标(如PSNR、SNR等)来比较不同参数或算法的重建效果,并根据实际需求进行调整和优化。 通过以上步骤,我们可以在MATLAB中实现平行投影重建算法,从而获得高质量的CT重建图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值