【图像重建】基于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电子书和数学建模资料


相关文章
|
2月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
147 0
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
191 8
|
2月前
|
机器学习/深度学习 编解码 算法
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
193 8
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
316 0
|
2月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
121 0
|
2月前
|
新能源 Java Go
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
141 0
|
2月前
|
机器学习/深度学习 数据采集 测试技术
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
111 8
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
197 8
|
2月前
|
编解码 运维 算法
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
183 12
|
2月前
|
人工智能 数据可视化 网络性能优化
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
148 9

热门文章

最新文章