基于MATLAB 的X-CT图像重建计算机仿真实验研究实验

该实验基于MATLAB R2018b,通过卷积反投影法和直接反投影法实现X-CT图像重建。实验使用SheepLogan头模型,详细介绍了两种方法的原理,并提供了对应的MATLAB代码实现。实验结果显示了两种方法的图像及矩阵数据分布直方图。
摘要由CSDN通过智能技术生成

参考资料:

高上凯.医学成像系统 [M] .清华大学出版社,2000.

CT图像重构方法详解——傅里叶逆变换法、直接反投影法、滤波反投影法_Absolute Zero-CSDN博客

一、实验目的

了解X-CT工作原理,通过MATLAB R2018b使用卷积反投影法实现X-CT图像重建。

 

二、实验原理

X射线穿过人体时,人体的各种组织对X射线有不同程度的吸收,即不同的组织有不同的线性衰减系数μ。假设强度为I0的X射线穿过均匀分布衰减系数为μ的物体,行进了x的距离,强度变为1,按Beer-Lambert 定律有:

  或  

若物体是分段均匀的,系数分别是μ1、μ2、μ3…,相应的长度为x1, x2, x3…,则下式成立:

本实验就是用程序来实现下述的过程,得到投影的数值。

X射线投影分平行束和扇束投影,扇束又分为等角射线型和等距射线型。

平行束扫描就是X光束平移+旋转扫描,由于扫描时间太长,该方法一般只在第一代CT中使用。扇束扫描就是单X射线源多检测器,等角射线型就是检测器分布在等角的弧线上,等距射线型就是检测器在直线上作等距分布。相应结构如下图:

 

三、算法原理

 

A2.1 仿真头模型

在研究从投影重建图像的算法时,为了比较客观地评价各种重建算法的有效性,人们常选用公认的Sheep Logan头模型(以下简称S-L模型)作为研究对象。该模型由10个位置、大小、方向、密度各异的椭圆组成,象征一个脑断层图像,见图A2.1所示。其中,图 A2.1(a)为10个椭圆的分布图,图中英文字母是10个椭圆的编号,数字表示该区域内的密度。图 A2.1(b)是S-L模型的灰度显示图像。 

表A2-1给出了S-L头模型中10个椭圆的中心位置、长轴、短轴、旋转角度及折射指数。

表A2-1 头模型中的椭圆参数

序号

中心坐标

长轴

短轴

旋转角度

折射指数

a

(0,0)

0.92

0.69

90°

2.0

b

(0,-0.0184)

0.874

0.6624

90°

-0.98

c

(0.22,0)

0.31

0.11

72°

-0.02

d

(-0.22,0)

0.41

0.16

108°

0.01

e

(0,0.35)

0.25

0.21

90°

0.01

f

(0,0.1)

0.046

0.046

0.01

g

(0,-0.1)

0.046

0.046

0.01

h

(-0.08,-0.605)

0.046

0.023

0.01

i

(0,-0.605)

0.023

0.023

0.01

j

(0.06,-0.605)

0.046

0.023

90°

0.01

 

 

A2.2 仿真投影数据的产生

用S-L头模型进行计算机仿真研究的主要好处之一是可以获得该模型投影数据的解析表达式。

图A2.2所示是一个中心位置在原点且未经旋转的椭圆,其长轴与x轴重合,短轴与y轴重合。假设椭圆内的密度为ρ,椭圆外密度为零,则该椭圆图像可用以下方程表示:

式中A,B分别为椭圆长轴与短轴的长度。

图A2.2中gθ(R)是椭圆图像的投影函数。实际上,把投影线在椭圆内的线段长度乘以密度ρ就是该投影线上的投影值。以图A2.2中所示投影线MN为例,

已知直线MN的法线式为

联立(A2-1)和(A2-3)式求解即可得到投影线与椭圆交点M,N的坐标:

其中

于是可得线段MN长度为

进而可得投影函数的一般表达式为

图A2.3所示是一个更为一般的情况:椭圆的中心o’位于坐标(x0, y0)处,椭圆的长轴相对于x轴沿逆时针方向旋转了α角,投影函数的坐标轴R与x轴的夹角仍为θ。经过适当的坐标变换,可求得该椭圆图像的投影函数。方法如下:

在坐标系x1o’y1中,椭圆方程为

根据坐标旋转关系可得

于是,椭圆在坐标系x2o’y2中的方程为

再利用坐标平移关系

即可得到椭圆在坐标系xoy中的方程

联立(A2-3)式与(A2-9)式求解可得出投影线与椭圆的交点P,Q的坐标及线段PQ的长度:

式中:

 

进而得出相应的投影函数gθ,α(R)

 

对于由10个椭圆组成的S-L头模型,可以按照(A2-11)式进行组合,得到该模型的投影数据。

A2.3 卷积反投影方法的计算机仿真实验研究

由于在用计算机重建图像时,投影数据与重建的图像都是离散的数字量,因此,本节将采用离散的数字信号与数字图像的表征方法来描述卷积反投影方法重建图像的过程。利用本节所介绍的方法可在计算机上完成卷积反投影法的仿真实验研究。

图A2.4所示是S-L头模型图像f(x,y)对应的坐标系。其中f(x,y)在x,y两方向上的范围都是从-1.0到1.0。当我们将f(x,y)离散化为一幅N×N的数字化图像时,原图像就可以用一个N×N的二维数组F(i,j)来表示,其中i=1,2,…, N ;j=1,2,…,N二维数组中元素的值与图中小方块中心点处的图像灰度值对应。小方块间的步距Δx= Δy=2.0/N。如果规定数字图像左下角的像素标号为(1,1),右下角为(N,1),左上角为 (1,N),右上角为(N,N),则二维数组中每个元素的灰度值为

 

我们取同样大步长Δ=Δx=Δy对投影数据采样,如图A2.5所示,共采集N点。也就是说,根据椭圆函数线积分解算出的连续形式的投影函数gθ(R)将被离散化为gθ(nΔ), n= -N/2,…,0,…,N/2(以下简写为gθ(n)),投影函数的坐标原点为xoy坐标系原点在n轴上的垂足。

相应地,R-L卷积函数h(R)也应离散化。R-L卷积函数的离散形式可表示为

图A2.6是h(nΔ)(以下简写为h(n))的示意图。

 

将投影函数gθ(n)与卷积函数h(n)做卷积时,投影函数将向两边分别延伸N点(如图A2. 7(a)所示),卷积函数对称地截取2N点(如图A2.7(b)所示)。卷积运算的结果为Qθ(n)示意于图A2.7(c)中。

图A2.8所示是反投影过程的示意图。

对于图像平面中的一个像素F(i,j),如果其在xoy坐标系中的坐标为(x0,y0),则其对应的投影坐标R0可表示为

 

其中,(x0,y0)与(i,j)的关系是

于是可得

指定最左边与图像平面中直径为N/2的圆相切的第一根射线为0"射线,即0"射线在R坐标轴上的垂足为函数Qθ(n)的原点,则(x0,y0)点在R轴上的垂足坐标R'0为

上式大括号中右边第三、四两项在N与θ确定后为常数,令

假设Δ=1,则有

上式中n0为R0的整数部分,δ为R'0小数部分。于是,n0将与投影函数Qθ(n)中的序号对应,0<δ<1表示(x0,y0)的垂足坐标相对于n0的偏移量。因此,在反投影过程中,(x0,y0)点上图像F(i,j)像素的取值应为

 

在整个反投影的过程中,是从(i,j)=(1,1)开始计算,像素F(1,1)在R轴上对应的坐标是Cθ,以后x方向的序号每增加1,则R'0增加cosθ;y方向的序号每增加1,则R'0增加sinθ。

A2.3 卷积反投影方法的计算机仿真实验研究

此方法可参考CT图像重构方法详解——傅里叶逆变换法、直接反投影法、滤波反投影法_Absolute Zero-CSDN博客,有完整的文字与代码解释。

四、实验软件

本实验相对来说,使用基本的常用编程语言/软件即可实现功能。

实验初期尝试使用微软公司的Visual Studio 2013进行C++语言编程,但该软件需要通过Cmake编译配置QT+VTK的视觉化函数工具库,实现实验的最终的图像输出,但环境配置较为困难,最终放弃。

MATLAB具有高效的数值计算及符号计算功能,自身带有完备的图形处理功能,实现计算结果和编程的可视化。对于本次实验的灰度图像与原理, 只需要调用imshow函数即可对二维矩阵进行图像输出,编程较简单,无需安装配置其他函数库。

在进行MATLAB编程时,只需当做最基本的函数命令调用与输出即可实现,可直接与实验原理进行嫁接转换。

本次实验仿真中,利用MATLAB自定义函数功能,自定义函数CTj进行卷积反投影法图像重建运算,自定义函数CTz进行直接反投影法图像重建运算,两个自定义函数从主函数依次接收a-j十个椭圆数据,运算并返回十个二维矩阵,主函数依次对接收到的十个二维矩阵进行叠加并以灰度凸显在窗口中显示。

受限于二维矩阵可能会集中出现在一定的范围内,而显示器硬件受限于技能无法清晰的显示,通过在主函数尾部加一个hist函数,将矩阵中的元素绘制出在直方图判断出所集中出现的区域,人工选择窗口使用imshow函数进行图像调制,直至显示出合适的图形。

 

五、实验程序代码

1.卷积反投影法子程序代码:

function y= CTj(x0,y0,a,b,q,p)
%单个椭圆卷积反投影函数,中心坐标(x0.y0),长轴a,短轴b,倾斜角q,折射系数p,返回值是N*N矩阵
N=700;
g=zeros(1,N+1);%初始化椭圆的投影函数g(投影宽度为包含从-N/2到N/2共N+1个数,共计N个△)
h=zeros(1,N+1);%R-L卷积函数的离散形式初始化
Q=zeros(1,N+1);%初始化投影函数g与R-L卷积函数进行卷积运算后的滤波投影函数Q
F=zeros(N,N);%灰度显示的图像二维数组初始化
for theta=0:1:360  %绕坐标系旋转的投影的角度θ,每次旋转1度,共旋转360度,最终叠加数组形成图像数据
    
    %求椭圆的投影函数g
    for n=-N/2:1:N/2%在坐标轴上循环求得每个像素块对应的投影函数值g(R)
        r=a^2*(cosd(theta-q))^2+b^2*(sind(theta-q))^2;% 求r^2值
        R=n*2/N;%投影函数中自变量R
        Ra=R-x0*cosd(theta)-y0*sind(theta);%Ra值
        Ra2=Ra*Ra;%Ra的平方
        if Ra2<=r
            g(n+N/2+1)=p*2*a*b*sqrt(r-Ra2)/r;%计算出投影函数g值,式A2-11
        else
            g(n+N/2+1)=0;
        end
    end
    
    %求R-L卷积函数h
    for n=-N/2:1:N/2  
        if n==0   
            h(n+1+N/2)=1/(4*(2/N)^2);
        elseif mod(n,2)==0
            h(n+1+N/2)=0;
        else
            h(n+1+N/2)=-1/(n*(2/N)*pi)^2;
        end
    end
    
    %求滤波投影函数Q(n)
    Q=conv(g,h,'same');%调用matlab卷积函数conv得到滤波投影函数Q(n)   
    
    %求反投影矩阵F
    C=N/2-(N-1)*(cosd(theta)+sind(theta))/2;%求垂足坐标R0'中的常数项
    for i=1:1:N
        for j=1:1:N          
            R0=((i-1)*cosd(theta)+(j-1)*sind(theta)+C);%求R0'
            n0=floor(R0);    %取整
            deta=R0-n0;      %取小数
            if n0<=0         %防止n0值超过Q矩阵范围
                n0=1;            
            elseif n0>N
                n0=N;
            end            
            F1(i,j)=(1-deta)*Q(n0)+deta*Q(n0+1);           
        end
    end
     F=F+F1;%把F1中的像素值累加到F中,生成反投影矩阵
end
y=F;%返回一个椭圆的反投影的二维矩阵数据
end

2.直接反投影法子程序代码:

function y = CTz(x0,y0,a,b,q,p)
%单个椭圆卷积反投影函数,中心坐标(x0.y0),长轴a,短轴b,倾斜角q,折射系数p,返回值是N*N矩阵
N=700;
g=zeros(1,N+1);%初始化椭圆的投影函数g(投影宽度为包含从-N/2到N/2共N+1个数,共计N个△)
Q=zeros(1,N+1);%初始化投影函数g与R-L卷积函数进行卷积运算后的滤波投影函数Q
F=zeros(N,N);%灰度显示的图像二维数组初始化
for theta=0:1:360  %绕坐标系旋转的投影的角度θ,每次旋转1度,共旋转360度,最终叠加数组形成图像数据
    
    %求投影函数g
    for n=-N/2:1:N/2%在坐标轴上循环求得每个像素块对应的投影函数值g(R)
        r=a^2*(cosd(theta-q))^2+b^2*(sind(theta-q))^2;% 求r^2值
        R=n*2/N;%投影函数中自变量R
        Ra=R-x0*cosd(theta)-y0*sind(theta);%Ra值
        Ra2=Ra*Ra;%Ra的平方
        if Ra2<=r
            g(n+N/2+1)=p*2*a*b*sqrt(r-Ra2)/r;%计算出投影函数g值,式A2-11
        else
            g(n+N/2+1)=0;
        end
    end
    
    %求反投影矩阵F
    C=N/2-(N-1)*(cosd(theta)+sind(theta))/2;%求垂足坐标R0'中的常数项
    for i=1:1:N
        for j=1:1:N          
            R0=((i-1)*cosd(theta)+(j-1)*sind(theta)+C);%求R0'
            n0=floor(R0);    %取整
            deta=R0-n0;      %取小数
            if n0<=0         %防止n0值超过矩阵范围
                n0=1;            
            elseif n0>N
                n0=N;
            end            
            F1(i,j)=(1-deta)*g(n0)+deta*g(n0+1);           
        end
    end
     F=F+F1;%把F1中的像素值累加到F中,生成反投影矩阵
end
y=F;%返回一个椭圆的反投影的二维矩阵数据
end

3.主函数程序代码

%X-CT图像重建计算机仿真实验研究
%定义卷积反投影法函数为CTj
%定义直接反投影法函数为CTjz
%N×N的数字化图像用N×N的二维数组F(i,j)来表示,不通的N所对应的窗口位置不同
%此时另N=700
N=700;
F=zeros(N,N);%初始化卷积反投影的二维矩阵
Fa=zeros(N,N);%初始化椭圆a矩阵
Fb=zeros(N,N);%初始化椭圆b矩阵
Fc=zeros(N,N);%初始化椭圆c矩阵
Fd=zeros(N,N);%初始化椭圆d矩阵
Fe=zeros(N,N);%初始化椭圆e矩阵
Ff=zeros(N,N);%初始化椭圆f矩阵
Fg=zeros(N,N);%初始化椭圆g矩阵
Fh=zeros(N,N);%初始化椭圆h矩阵
Fi=zeros(N,N);%初始化椭圆i矩阵
Fj=zeros(N,N);%初始化椭圆j矩阵
%定义主函数对载入函数的输入值格式为:[]=fun(x0,y0,a,b,q,p)[中心坐标(x0.y0),长轴a,短轴b,倾斜角q,折射系数p]
Fa=CTj(0,0,0.92,0.69,90,2);%调用函数CTj求得反回椭圆a卷积反投影矩阵
Fb=CTj(0,-0.0184,0.874,0.6624,90,-0.98);%椭圆b
Fc=CTj(0.22,0,0.31,0.11,72,-0.02);%椭圆c
Fd=CTj(-0.22,0,0.41,0.16,108,-0.02);%椭圆d
Fe=CTj(0,0.35,0.25,0.21,90,0.01);%椭圆e
Ff=CTj(0,0.1,0.046,0.046,0,0.01);%椭圆f
Fg=CTj(0,-0.1,0.046,0.046,0,0.01);%椭圆g
Fh=CTj(-0.08,-0.605,0.046,0.023,0,0.01);%椭圆h
Fi=CTj(0,-0.605,0.023,0.023,0,0.01);%椭圆i
Fj=CTj(0.06,-0.605,0.046,0.023,90,0.01);%椭圆j
F=Fa+Fb+Fc+Fd+Fe+Ff+Fg+Fh+Fi+Fj;%得到总图像F为各个分圆的叠加
figure('NumberTitle', 'off', 'Name', '卷积反投影法');%创建窗口
F=imrotate(F,90);%直接求得的图像F为默认长轴在水平的,需要逆时针旋转90度获得与书中相符合的图像
imshow(F,[32000,45000]);%灰度显示二维数组F,将灰度低于32000的像素显示为黑色,高于45000的显示为白色
title('卷积反投影法');


Fa=CTz(0,0,0.92,0.69,90,0.02);%调用函数CTz求得反回椭圆a直接反投影矩阵
Fb=CTz(0,-0.0184,0.874,0.6624,90,-0.01);%椭圆b
Fc=CTz(0.22,0,0.31,0.11,72,-0.02);%椭圆c
Fd=CTz(-0.22,0,0.41,0.16,108,-0.02);%椭圆d
Fe=CTz(0,0.35,0.25,0.21,90,0.01);%椭圆e
Ff=CTz(0,0.1,0.046,0.046,0,0.01);%椭圆f
Fg=CTz(0,-0.1,0.046,0.046,0,0.01);%椭圆g
Fh=CTz(-0.08,-0.605,0.046,0.023,0,0.01);%椭圆h
Fi=CTz(0,-0.605,0.023,0.023,0,0.01);%椭圆i
Fj=CTz(0.06,-0.605,0.046,0.023,90,0.01);%椭圆j
Fz=Fa+Fb+Fc+Fd+Fe+Ff+Fg+Fh+Fi+Fj;%得到总图像F为各个分圆的叠加
figure('NumberTitle', 'off', 'Name', '直接反投影法');
Fz=imrotate(Fz,90);
imshow(Fz,[1.5,5.8]);
title('直接反投影法');


%调用hist函数可以看出矩阵数据的分布规律,选择合适的窗位进行图像调制
figure('NumberTitle', 'off', 'Name', '卷积反投影法的矩阵数据的分布规律')
hist(Fj);
title('卷积反投影法的矩阵数据的分布规律')
figure('NumberTitle', 'off', 'Name', '直接反投影法的矩阵数据的分布规律')
hist(Fz);
title('直接反投影法的矩阵数据的分布规律')
  • 六、实验运行结果

1.卷积反投影法图像与二维矩阵分布直方图

 

 

2.直接反投影法图像与二维矩阵分布直方图

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值