【图像重建】基于ART算法和SIRT算法实现超声CT反演附MATLAB代码

简介: 【图像重建】基于ART算法和SIRT算法实现超声CT反演附MATLAB代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

计算机层析成像(即CT)不仅是放射诊断医学领域内的里程碑,而且在现代工业无损检测和勘探等领域中也是重要的研究手段. 滤波反投影法和代数重建法是CT中最为常见的算法,基于对这两种算法的深入分析。

⛄ 部分代码

function [A,b,x,theta,p,d] = paralleltomo(N,theta,p,d,isDisp,isMatrix)

%PARALLELTOMO  Creates a 2D parallel-beam tomography test problem

%

%   [A,b,x,theta,p,d] = paralleltomo(N)

%   [A,b,x,theta,p,d] = paralleltomo(N,theta)

%   [A,b,x,theta,p,d] = paralleltomo(N,theta,p)

%   [A,b,x,theta,p,d] = paralleltomo(N,theta,p,d)

%   [A,b,x,theta,p,d] = paralleltomo(N,theta,p,d,isDisp)

%   [A,b,x,theta,p,d] = paralleltomo(N,theta,p,d,isDisp,isMatrix)

%

% This function uses the "line model" to create a 2D X-ray tomography test

% problem with an N-times-N pixel domain, using p parallel rays for each

% angle in the vector theta.

%

% Input:

%   N         Scalar denoting the number of discretization intervals in

%             each dimesion, such that the domain consists of N^2 cells.

%   theta     Vector containing the projetion angles in degrees.

%             Default: theta = 0:1:179.

%   p         Number of rays for each angle. Default: p = round(sqrt(2)*N).

%   d         Scalar denoting the distance from the first ray to the last.

%             Default: d = p-1.

%   isDisp    If isDisp is non-zero it specifies the time in seconds

%             to pause in the display of the rays. If zero (the default),

%             no display is shown.

%   isMatrix  If non-zero, a sparse matrix is returned in A (default).

%             If zero, instead a function handle is returned.

%

% Output:

%   A         If input isMatrix is 1 (default): coefficient matrix with

%             N^2 columns and length(theta)*p rows.

%             If input isMatrix is 0: A function handle representing a

%             matrix-free version of A in which the forward and backward

%             operations are computed as A(x,'notransp') and A(y,'transp'),

%             respectively, for column vectors x and y of appropriate size.

%             The size of A can be retrieved using A([],'size'). The matrix

%             is never formed explicitly, thus saving memory.

%             elements in A.

%   b         Vector containing the rhs of the test problem.

%   x         Vector containing the exact solution, with elements

%             between 0 and 1.

%   theta     Vector containing the used angles in degrees.

%   p         The number of used rays for each angle.

%   d         The distance between the first and the last ray.

%

% See also: fancurvedtomo, fanlineartomo, seismictomo, seismicwavetomo,

%           sphericaltomo.


% Reference: A. C. Kak and M. Slaney, Principles of Computerized

% Tomographic Imaging, SIAM, Philadelphia, 2001.


% Code written by: Per Christian Hansen, Jakob Sauer Jorgensen, and

% Maria Saxild-Hansen, 2010-2017.


% This file is part of the AIR Tools II package and is distributed under

% the 3-Clause BSD License. A separate license file should be provided as

% part of the package.

%

% Copyright 2017 Per Christian Hansen, Technical University of Denmark and

% Jakob Sauer Jorgensen, University of Manchester.


% Default value of the projection angles theta.

if nargin < 2 || isempty(theta)

   theta = 0:179;

end


% Make sure theta is double precison to prevent round-off issues caused by

% single input.

theta = double(theta);


% Default value of the number of rays.

if nargin < 3 || isempty(p)

   p = round(sqrt(2)*N);

end


% Default value of d.

if nargin < 4 || isempty(d)

   d = p-1;

end


% Default illustration: False

if nargin < 5 || isempty(isDisp)

   isDisp = 0;

end


% Default matrix or matrix-free function handle? Matrix

if nargin < 6 || isempty(isMatrix)

   isMatrix = 1;

end


% Construct either matrix or function handle

if isMatrix

   A = get_or_apply_system_matrix(N,theta,p,d,isDisp);

else

   A = @(U,TRANSP_FLAG) get_or_apply_system_matrix(N,theta,p,d,isDisp,...

       U,TRANSP_FLAG);

end


if nargout > 1

   % Create phantom head as a reshaped vector.

   x = phantomgallery('shepplogan',N);

   x = x(:);

   % Create rhs.

   if isMatrix

       b = A*x;

   else

       b = A(x,'notransp');

   end

end



function A = get_or_apply_system_matrix(N,theta,p,d,isDisp,u,transp_flag)


% Define the number of angles.

nA = length(theta);


% The starting values both the x and the y coordinates.

x0 = linspace(-d/2,d/2,p)';

y0 = zeros(p,1);


% The intersection lines.

x = (-N/2:N/2)';

y = x;


% Prepare for illustration

if isDisp

   AA = phantomgallery('smooth',N);

   figure

end


% Deduce whether to set up matrix or apply to input, depending on whether

% input u is given.

isMatrix = (nargin < 6);


if isMatrix

   

   % Initialize vectors that contains the row numbers, the column numbers

   % and the values for creating the matrix A effiecently.

   rows = zeros(2*N*nA*p,1);

   cols = rows;

   vals = rows;

   idxend = 0;

   

   II = 1:nA;

   JJ = 1:p;

else

   % If transp_flag is 'size', only return size of operator, otherwise set

   % proper size of output.

   switch transp_flag

       case 'size'

           A = [p*nA,N^2];

           return

       case 'notransp' % Forward project.

           if length(u) ~= N^2

               error('Incorrect length of input vector')

           end

           A = zeros(p*nA,1);

       case 'transp' % Backproject

           if length(u) ~= p*nA

               error('Incorrect length of input vector')

           end

           A = zeros(N^2,1);

   end

   

   % If u is a Cartesian unit vector then we only want to compute a single

   % row of A; otherwise we want to multiply with A or A'.

   if strcmpi(transp_flag,'transp') && nnz(u) == 1 && sum(u) == 1

       % Want to compute a single row of A, stored as a column vector.

       ell = find(u==1);

       JJ = mod(ell,p);  if JJ==0, JJ = p; end

       II = (ell-JJ)/p + 1;

   else

       % Want to multiply with A or A'.

       II = 1:nA;

       JJ = 1:p;

   end

end


% Loop over the chosen angles.

for i = II

   

   % Illustration of the domain.

   if isDisp

       clf

       pause(isDisp)

       imagesc((-N/2+.5):(N/2-0.5),(-N/2+.5):(N/2-0.5),flipud(AA))

       colormap gray

       axis xy

       hold on

       axis equal

       axis(0.7*[-N N -N N])

   end

   

   % All the starting points for the current angle.

   x0theta = cosd(theta(i))*x0-sind(theta(i))*y0;

   y0theta = sind(theta(i))*x0+cosd(theta(i))*y0;

   

   % The direction vector for all rays corresponding to the current angle.

   a = -sind(theta(i));

   b = cosd(theta(i));

   

   % Loop over the rays.

   for j = JJ

       

       % Use the parametrisation of line to get the y-coordinates of

       % intersections with x = constant.

       tx = (x - x0theta(j))/a;

       yx = b*tx + y0theta(j);

       

       % Use the parametrisation of line to get the x-coordinates of

       % intersections with y = constant.

       ty = (y - y0theta(j))/b;

       xy = a*ty + x0theta(j);

       

       % Illustration of the rays.

       if isDisp

           

           plot(x,yx,'-','color',[220 0 0]/255,'linewidth',1.5)

           plot(xy,y,'-','color',[220 0 0]/255,'linewidth',1.5)

           

           set(gca,'Xtick',[],'Ytick',[])

           pause(isDisp)

       end

       

       % Collect the intersection times and coordinates.

       t = [tx; ty];

       xxy = [x; xy];

       yxy = [yx; y];

       

       % Sort the coordinates according to intersection time.

       [~,I] = sort(t);

       xxy = xxy(I);

       yxy = yxy(I);

       

       % Skip the points outside the box.

       I = (xxy >= -N/2 & xxy <= N/2 & yxy >= -N/2 & yxy <= N/2);

       xxy = xxy(I);

       yxy = yxy(I);

       

       % Skip double points.

       I = (abs(diff(xxy)) <= 1e-10 & abs(diff(yxy)) <= 1e-10);

       xxy(I) = [];

       yxy(I) = [];

       

       % Calculate the length within cell and determines the number of

       % cells which is hit.

       aval = sqrt(diff(xxy).^2 + diff(yxy).^2);

       col = [];

       

       % Store the values inside the box.

       if numel(aval) > 0

           

           % If the ray is on the boundary of the box in the top or to the

           % right the ray does not by definition lie with in a valid cell.

           if ~((b == 0 && abs(y0theta(j) - N/2) < 1e-15) || ...

                   (a == 0 && abs(x0theta(j) - N/2) < 1e-15)       )

               

               % Calculates the midpoints of the line within the cells.

               xm = 0.5*(xxy(1:end-1)+xxy(2:end)) + N/2;

               ym = 0.5*(yxy(1:end-1)+yxy(2:end)) + N/2;

               

               % Translate the midpoint coordinates to index.

               col = floor(xm)*N + (N - floor(ym));

                   

           end

       end

       if ~isempty(col)

           if isMatrix

               % Create the indices to store the values to vector for

               % later creation of A matrix.

               idxstart = idxend + 1;

               idxend = idxstart + numel(col) - 1;

               idx = idxstart:idxend;

               

               % Store row numbers, column numbers and values.

               rows(idx) = (i-1)*p + j;

               cols(idx) = col;

               vals(idx) = aval;

           else

               % If any nonzero elements, apply forward or back operator

               

               if strcmp(transp_flag,'notransp')

                   % Insert inner product with u into w.

                   A( (i-1)*p+j ) = aval'*u(col);

               else  % Adjoint operator.

                   A(col) = A(col) + u( (i-1)*p+j )*aval;

               end

           end

       end

   end % end j

end % end i


if isMatrix

   % Truncate excess zeros.

   rows = rows(1:idxend);

   cols = cols(1:idxend);

   vals = vals(1:idxend);

   

   % Create sparse matrix A from the stored values.

   A = sparse(rows,cols,vals,p*nA,N^2);

end

⛄ 运行结果

⛄ 参考文献

[1] 徐茂林. 透射及散射断层成像中若干反演算法的研究[D]. 浙江大学, 2004.

[2] 龙芸, 程久龙. 基于SIRT算法的声波CT反演及工程应用[C]// 2016中国地球科学联合学术年会论文集(三十)——专题54:煤炭资源与矿山地球物理. 中国地球物理学会; 中国地质学会; 中国地震学会; 中国力学学会; 中国岩石力学与工程学会, 2016.

[3] 赵祥模, 李娜, 关可,等. 基于LTI射线追踪的改进的ART算法[J]. 中国图象图形学报A, 2009.

[4] 颜华, 孙灿烽, 王伊凡. 基于改进SIRT算法的声学CT温度场重建[J]. 沈阳工业大学学报, 2021.

[5] 张顺利, 张定华, 王凯,等. 一种基于ART算法的快速图像重建技术[J]. 核电子学与探测技术, 2007(3):5.

⛳️ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
3天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
15天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
151 80
|
4天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
4天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
|
2天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
7天前
|
算法 人机交互 数据安全/隐私保护
基于图像形态学处理和凸包分析法的指尖检测matlab仿真
本项目基于Matlab2022a实现手势识别中的指尖检测算法。测试样本展示无水印运行效果,完整代码含中文注释及操作视频。算法通过图像形态学处理和凸包检测(如Graham扫描法)来确定指尖位置,但对背景复杂度敏感,需调整参数PARA1和PARA2以优化不同手型的检测精度。
|
9天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
12天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
8天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
13天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。

热门文章

最新文章

下一篇
开通oss服务