本程序是关于平面探测器的三维锥束CT。
这是为开始学习CT医学成像的学生设计的。
GPU选择:
-我提供使用内置GPU函数的投影,反投影代码(半GPU代码)
-需要Matlab 2013b以上版本的并行计算工具箱。
-你可以打开/关闭GPU的使用。
—该代码的计算时间比基于cpu的代码快几倍。速度取决于你的GPU。
例子:
- FDK(称为滤波反投影)
-最大似然期望最大化,
- SART(同时代数重建技术)
SQS(可分离二次代理)。
您可以运行:
0.请检查“ParamSetting。仔细m”。
1.进行测量:m: F5
可以施加泊松噪声。
2.重建的例子
2.1 FDK
2.2 MLEM
2.3迴旋
2.4 SQS
谢谢你!
Kyungsang金(2021)。三维锥形束CT (CBCT)投影反投影fk,迭代重建Matlab实例(//www.tatmou.com/matlabcentral/fileexchange/35548-3d-cone-beam-ct-cbct-projection-backprojection-fdk-iterative-reconstruction-matlab-examples), MATLAB中央文件交换。检索.
哇哇,非常感谢!这对我帮助很大!
非常感谢你的代码。
你能解释一下投影的算法吗?m文件?
Hi Kyunsang img28在哪里?垫文件?
反正知道怎么处理龙门倾斜的情况?
如何在MLEM重建后可视化三维体?
如果我有一组2D投影,我如何将这些图像转换为“img128。m”数据文件吗?
超级有用的代码。用我自己的数据第一次就能运行并重建。从不得不执行FDK从零开始!与所有重构代码一样:在尝试进行重构之前*首先*阅读文档,以便了解代码是如何配置的。了解你的几何和CT几何。
我如何运行这段代码?我的CUDA驱动程序或GPU设备不正确。
从x射线源到探测器的中心射线的位置输入到Matlab代码的哪里?这将是探测器上的像素位置[垂直和水平位置]
嗨,我如何从我自己的2D图像制作img。谢谢你!
它是身体的哪个部分?
要使用这个包,
1.将ZIP文件解压到一个文件夹中,并将该文件夹添加到您的路径中。
2.运行MeasurementGen()。这将创建程序。垫file which is missing when you try to run the other files.
嗨,我似乎找不到主要的演示。M代码,有人能建议吗?
谢谢
Hany
我输入一个矩阵138*157*101。运行MeasurementGen的唯一方法。M是设置参数x=157和y=138。是正常的吗?在那之后,代码返回投影给了我这个错误
反投影误差(第25行)
卷(:,:,工业区)=(比例。* interp2(项目、pu、pv param.interptype));
有人能帮我吗?
你好,Aubrey,你应该将你的投影图像转换为双数据或单数据格式。当你有图像输入,你可以使用imread,然后堆叠成3D数据。
你好所有的,
我应该以什么格式插入'img' ?
我有一系列的二维图像投影作为TIF
你好,Kyungsang金!
您能给我参考一下您研究如何实现MLEM的论文吗?
提前谢谢。
谁知道这份文件指的是哪篇论文?
谢谢你的代码!
这对我很有帮助!
不错的计划。想知道filter .m中的下面一行
项目(:,:我)= fproj(端/ 2-param.nu / 2 + 1:端/ 2 + param.nu / 2:) / 2 / param.du *(2 *π/ param.nProj) / 2 * (param.DSD / param.DSO);
你能解释为什么我们需要最后几项而不是fproj(end/2-param.nu/2+1:end/2+param.nu/2,:)吗?
谢谢,
谢谢你的代码。
有光束硬化校正算法吗?
投影x射线是单能谱还是多能谱,那么kVp和mAs又是什么呢?
非常感谢
好工作!另外,我想知道您是否能告诉我您的工作是指哪一篇论文?
好的代码。
注意,当达到45度的垂直边缘时,投影实现有一个渐近递增的误差。这是因为投射和反投射的方法是“拉伸”图像,将圆锥体转换为平行体,从而使最近的单个体素(45)非常宽。你可以用45度角的全白色“立方体图像”来测试这一点。出现奇怪的工件。距离图像中心越近,这一点的相关性就越小。工具箱对于了解医学成像仍然很有用,但这个错误(不幸的是)使它不是用于研究目的或真实图像重建的好工具箱。
您需要运行MeasurementGen。M首先生成project .mat。如果proj。Mat在文件夹中预先生成。谢谢。
你的项目在哪里?垫文件?找不到吗?
亲爱的庆尚,我可以问两个问题吗?
1-在评论中你提到了第96页《江榭》第二版;然而,我不能在投影中遵循代码。M,即它如何表示公式3.59。你能给我一些提示吗?
2-我们如何从一个病人的CT图像到您提供的样本文件?
谢谢你!
抱歉我弄错了,我找到了project .mat
你好,
项目在哪里。垫文件?
很好的贡献,非常感谢你的代码。
对他人的伟大贡献!
谢谢金京尚!
很酷的!感谢您提供的代码!我尤其喜欢看真实的幻影和动画重建。
谢谢京:-)
嗨刚毛,
请按以下要求做:
1)打开“ParamSetting.m”
2)修改为param。gpu = 0 "
那么,请再试一次。
该选项需要“并行计算工具箱”和“GPU(硬件)”,
如果您有GPU,请检查GPU的内存和核数。
此外,它将在2013b版本以上有用。
谢谢你的代码。是否有一个描述文件来解释每个文件做什么以及如何运行代码?
当我运行Recon1_FDK或MeasurmentGen时,它们都会出现错误,说某个文件或函数缺失或未定义。更具体地说,当运行Recon1_FDK时,错误建议proj。垫does not exist and when I run MeasurementGen the error suggest gpuArray (called in Projection.m) is undefined.
非常感谢您的帮助。
有可能使用这个程序向前投射一个dx=dy,但是dx=dy!=dz的3D图像吗?现在,我的参数是:
%%参数设置%%
参数。nx = 400;
参数。纽约= 400;
参数。新西兰= 66;
%探测器面板真实像素密度(像素数)
参数。ν= 400;
参数。nv = 400;
%探测器设置,根据瓦里安三部曲OBI(真实尺寸)
参数。苏= 350;%毫米
参数。sv = 350;%毫米
x射线源和探测器设置
参数。DSD = 1500;%源到检测器的距离
参数。DSO = 1000;x射线源到物体轴的距离
这个令人困惑的东西
res = (param.DSO / param.DSD) * (param.su / param.nu);
% (1000/1500) * (350/400)
参数。sx = param.nx *物;%毫米
参数。sy = param.ny *物;%毫米
参数。深圳= param.nz *物;%毫米
但这并不能创造出正确的正向预测,到目前为止,我已经能够检查。我在尝试做一些在图像处理中不可能的事情吗?
谢谢你!
请包括解析方程以便更好地理解。或者请解释一下投影m中的算法。如果可能,请包括解析方程的参考文献
嗨,埃里克,
说得好。
该因子被用于扇形光束和锥形光束的加权反投影。
(见蒋谢第二版,图3.35(理性)和3.37(几何))
在真实几何中,由于CT旋转360度(平均因子~ 1)和自身都接近于1,因此该因子对图像并不是关键因子。
但是,我想我为了快速计算而省略了它,很快我会修正它的准确性。
非常感谢。
Ps)你可以直接发电子邮件给我,有时很难在这里查看评论。
嗨,我比较了你的工作与一些论文中的FDK方程,似乎你的FDK算法省略了一个因子。我在“反向投影”中添加了这个因素。M”的算法,代码如下所示。
比率= param.DSO。^ 2. / (param.DSO-ry)。^ 2;
卷(:,:,工业区)=比率。* interp2 (uu、vv项目”,pu、光伏、“线性”);
你认为有必要加上这个因素吗?等待您的回复,谢谢。
你好埃里克,
第一个问题:
如果你有真实的投影(“RealProj”),那么首先计算:
1.I0 = max (RealProj (:));如果你不知道的话
2.项目=日志(RealProj / I0);
此处“I0”为教材中提到的空白图像(源强度)。
如果你认为最终的图像有问题,请检查1)"RealProj"有0值或2)“I0”比背景值高。
解决方案的情况下
1)第3步。项目(isinf(项目))= 0;
2)步骤1。定义I0为背景(高强度)平均值。
步骤2。项目=日志(min (RealProj /钱数,1));
然后,您可以像Demo.m中那样执行FDK或MLEM。
第二个问题:
参数设置非常重要。图像分辨率由探测器的大小和DSO的距离来定义。在你的情况下,DSD是700,DSO是560。所以比例是560/700 = 0.8。检测器的像素大小为50/1024,体素的最大分辨率为50/1024*0.8。
现在,体素分辨率“dx=dy=dz”被定义了。然后定义覆盖整个图像的体素数量(nx, ny, nz)。
因此,sx = nx*dx, sy=ny*dy, sz=nz*dz;
最后一个问题:
为了快速计算,我修改了一下。但如果你能看看蒋谢的书(第二版,第96页),就很容易理解了。
谢谢,
谢谢你的回答。我还有几个问题要问。
如果我已经得到了x射线成像系统的真实投影,例如,我得到了一只老鼠的投影,我还需要做“CTprojection”吗?在这种情况下,如果我只需要做“CTbackprojection”,如何设置重建对象的以下参数:nx, ny, nz, sx, sy,和sz。
检测器的参数设置如下:
param.su = 50; %毫米
param.sv = 50; %毫米
param.nu = 1024;
param.nv = 1024;
param.DSD = 700;
param.DSO = 560;
最后一个问题,关于不使用等中心(DSO)域的FDK算法,您能给出一些参考吗?
谢谢你!
你好埃里克,
1.w = cos(theta),为了计算w,我的代码考虑了探测器的距离,正如你的评论,许多书在等中心(DSO)域计算。在这种情况下,uu和vv的计算应该考虑源与中心的距离比和源与探测器的距离比。请考虑等中心线与延长线源体素检测器之间的夹角。
2.在我的代码中,pi/2旋转移位是为了精确计算你的注释。"interp2"函数可产生旋转90度的图像。我写了角->角- /2,我认为DSO+ry是对的。
3.如果你想获得真实的投影数据,首先设置空白扫描强度“b”,这与“剂量”有关,然后测量M = b*exp(-投影(obj))。
谢谢你的评论。
我想知道如果我有真实的投影图像,是否需要使用“CTprojection”功能?
良好的工作。我有几个问题。
首先,在“反投影”的文件中。m”,设置“w = (param.DSD)。/√(param.DSD) ^ 2 + uu。^2+ vv.^2);”,但在很多书中,他们说w应该设为“w = (param.DSO)./根号(param.DSO)^2+uu”。^ 2 + vv。^ 2);”。你能给我一个理由吗?
其次,也是在“反投影”中。m”,我认为rx, ry, pu, pv的描述应该是:
rx = xx。* cos(角)+ yy。* sin (angle_rad);
ry = - xx。* sin(角)+ yy。* cos (angle_rad);
聚氨酯= rx。* (param.DSO)。/ (param.DSO-ry);
pv = param.zs(工业区)* (param.DSO)。/ (param.DSO-ry);
你能给我一些建议吗,谢谢。
嗨,Masoud Hashemi
这个程序是平面探测器,
我觉得你应该修改一下弧线探测器的几何形状,
谢谢你使用我的软件。
我想知道投影函数是用于Arc探测器(第三代)还是Flat探测器?
太棒了!
代码可以运行,但结果不是很好,你可以上传你参考代码的参考资料,这样我们可以清楚地了解。谢谢你!
这个程序和其他程序相似,但是
快得多。
加快速度,
(1)将重建对象和投影图像定义为“单一”精度,
然后(2)使用matlabpool。
你可以使用"matlabpool"
从
因为我= 1:n(角)
投影和投影
结束
来
parfor i = 1: n(角)
投影和投影
!!请删除图形绘图功能
结束
这使四核的性能提高了两倍以上。
请更改函数代码"projection_pixel.m":
从
/√((SAD+SDD)^2 + uu. /√(SAD+SDD)^2 + uu. /√(SAD+SDD)^2 + uu. /√(SAD+SDD)^2 + uu。^ 2 + vv。^ 2)* abs (y (2) y (1));
来
dist =√((SAD+SDD)^2 + uu。^ 2 + vv。^ 2)。/ (SAD + SDD) * abs (y (2) y (1));
谢谢你,:)