您的当前位置:首页正文

CT图像重建计算机模拟实验研究

2020-11-16 来源:易榕旅网
2014年第15期总第159期 S_LICoN VALLEY CT图像重建计算机模拟实验研究 秦闻聆,何治艳,戴榕 (海南医学院,海南海口571 199) 摘 要 cT图像重建理论是医学影像技术的基础,为了帮助医学影像学专业的学生更好地理解cT图像重建的思想, 本文研究了基于MATLAB和c#的cT图像重建计算机模拟软件的制作。利用MATLAB进行编程,实现动态显示扫描过程 及断层图像的重建。利用c#进行软件界面设计,处理好MATLAB与c#的接口,最终形成的软件可以满足医学院校影 像学专业进行cT图像重建计算机模拟实验的要求。 关键词cT图像重建;MATLAB;c#;混合编程 中图分类号:TP391.41 文献标识码:A 文章编号:1671—7597(2014)1 5-0045—04 cT图像重建的思想和理论是医学影像物理学的重要内 容,涉及较多的数学知识,内容抽象难学,教学难度大,需 2 MATLAB程序优化 虽然MATLAB软件提供了大量的专业化的工具箱,但是 MATLAB语言是一种解释性语言,其执行速度较慢,当用户选 择不同的重建算法对头模型进行图像重建时,程序运行速度较 慢。主要是因为在编程时并没有考虑到程序优化。MATLAB中通 过tic函数和toc函数来查看一段程序的CPU使用时间,比较 程序优化前后的运行速度。 要开发直观形象的教学软件辅助教学。Microsoft Visual C# 是Microsoft专门为使用.NET平台开发的一种强大的、面向 组件的语言,可用于方便快捷的创建运行在.NET公共语言运 行库(common language runtime,CLR)上的Windows应用程 序Ⅲ。c#是微软.NET战略中核心的开发工具,它综合了 Visual Basic的高效率和c++功能的强大性,具有良好的界面 设计功能,可以很方便的建立应用程序的可视化界面 。但其 计算能力与MATLAB相比编程显得较为复杂。MATLAB是一种面 向科学计算、数据可视化、系统仿真及交互式程序设计的高级 语言 J。它以矩阵运算为基础,极少的代码即可实现复杂的功 能。将c#界面设计能力和MATLAB的强大科学计算能力相结合, 可以解决图像处理,工程计算等多个领域,具有良好的应用前景。 基于MATLAB和c#的CT图像重建计算机模拟软件可运用于医学 院校医学影像学专业的教学,学生可以通过本软件掌握cT图像 重建的物理原理和数学方法。 2.1使用MATLAB自带函数 MATLAB内部函数是由更底层的编程语言c构造的,它的执 行速度显然快于自己编写的程序 。这些函数都是经过严格测 试的,运行不会出现错误。这样既可以避免自己编写函数繁琐 的过程也可以加快运行速度。如在取整数的时候就可以直接使 用MATLAB自带的fix函数、round函数。 2.2大型矩阵的预先确定维数 大型矩阵动态扩展是非常耗费时间的,因为预先确定数组 维数后不允许数组动态扩展,虽然数组的适应性降低,但其访 1软件设计与实现 cT图像重建是通过c#与MATLAB混合编程实现的。软件的 设计目的是用两种x射线束(平行柬和扇形束)对不同头模型 (椭圆头模型和s—L头模型)进行扫描,用户可以选择不同的重 建算法(直接反投影法,R—L滤波反投影法,s—L滤波反投影法) 对头模型进行图像重建。此外用户还可以直观看到不同方法的 扫描过程。软件功能图如图l所示。 问速度加快,访问变得非常容易,这样可以大大减少运行时间, 所以用MATLAB的内部函数确定数组维数,然后再进行运算。比 如数值数组用zeros0,结构数组用repmatO等,用repmat0 函数能获得连续的内存块,加快的程序运行速度 。 2.3自定义函数 在编译代码时会遇到多次使用到相同语句的时候,为了减 少因为重复运行相同代码所消耗的时间,可以把程序中需要用 到的语句写成一个函数,在之后碰到相同的情况下就可以直接 调用已经定义好的函数,这样既缩短了MATLAB代码的长度,也 加快了程序运行速度。例如程序会多次用到将反投影运算,为 了避免代码重复,就可以将反投影运算单独写成一个函数,之 后再遇到反投影运算时就可以直接调用该函数,加快代码运行 速度。 2.4循环向量化法 为了避免因多次使用while和for而减慢程序运行速度, 可以将带有while和for循环的语句转化为向量操作。在很多 情况下,优先考虑利用循环过程向量化来提高MATLAB代码的运 行速度,这是MATLAB程序优化非常有效的方法。循环向量化解 决重复执行动作的思想是通过g ̄TLAB的矩阵操作完成的。向量 是矩阵的一种特殊形式,如果运算对象是向量,那么运算结果 也是向量,这就可以省去这其中循环结构的使用,大大提高运 行速度。对于不能向量化的程序,应该尽量使内循环的次数多 Y R&D 于外循环的次数 。 例1以椭圆头模型在平行束扫描下的直接反投影法为例, 程序优化前后对比,具体代码如下: 程序优化前: %N2为投影次数,Nl为x(Y)方向上的像素数。 function zj(N2,N1) tiC deta=40/N1: %每个方向取值间隔 N3=round(40*sqrt(2)/deta)+2; %每一次投影所得到的 取样数 Io=i.0: %1o为椭圆内部的密度值 d=pi/N2: %R方向的角度变化 A=10: %椭圆长半轴 B=6: %椭圆短半轴 for j=l:N3 %取样点变化 for i=l:N2 %R方向的角度变化 rr=A 2*cos(i*d)*COS(i*d)+B 2*sin(i*d)*sin(i d);%rr代表r 2 R=j*deta—N3/2*deta: %将R轴的坐标原点移 到最左边 if abs(R)<=sqrt(rr) z(i,J)=1o 2 A B sqrt(rr—R 2)/rr/8:%将 得到的投影数据存储为矩阵 e1se z(i,j)=O: end end end .f=zeros(, N1,N1): %定义一个n*n矩阵,初始化为零 矩阵 扎一 一毗一., ~., 一一~ … .,'蔷. ., 一一一 一一 一for a=l:Nl for b=l:N1 for c=1:N2 R0=(a一1咖~ )*COS(c*d)+(b一1)*sin(c*d)一(Nl. . 1)/2*(COS(c*d)+sin(c*d)):%任意一个像素(a,b)的R坐标 RI=N3/2+RO: nO=fix(R1):%整数部分 g=R1一nO: %小数部分 f(a,b)=f(a,b)+(1一g) z(C,nO) g z(C n0+1): end end end f=f/N2: imshow(f) 程序优化后: %平行束X射线扫描获得椭圆头模型的投影数据 function pv=radonel(N2,N3,deta) A=10:%椭圆长半轴 B=6:%椭圆短半轴 a=zeros(N2,N3): b=zeros(N2,N3): pv=zeros(N2,N3): m=l:N2: a=A 2:Ic(COS(m*pi/N2)). 2+B 2 (sin(m*pi/N2)). 2: ~枷一  一~咖一一., 心吼 一 吼叭.莩 狲 一州一~ 唧 一 一 ,一  一一~一 一  ~圳I至. 圳.,., ., ., 值 福一缉. , lO,20,20],’FaceColor’,’k’) rectangle(’Position’,[一3,一5,6,i0],’Curvature’,[I, 1],’FaceColor’,’w’) axiS off: daspect([1,1,1]) g=radonel(N2,N3,deta): f=iradonhy(N1,N2,N3,g): subplot(1,2,2),imshow(f/lO),title(’重建后的图’): toc 若N2=100:NI=100,则程序优化前的输出结果为:Elapsed time is 0.583443 seconds,则程序优化后的输出结果为: Elapsed time is 0.243608 seconds。程序优化前后对比,通  一一  一.,h川~ .. 一.二 

因篇幅问题不能全部显示,请点此查看更多更全内容