EIDORS: Electrical Impedance Tomography and Diffuse Optical Tomography Reconstruction Software |
EIDORS
(mirror) Main Documentation Tutorials − Image Reconst − Data Structures − Applications − FEM Modelling − GREIT − Old tutorials − Workshop Download Contrib Data GREIT Browse Docs Browse SVN News Mailing list (archive) FAQ Developer
|
GREIT algorithm: NOSERThis algorithm implements a NOSER-type (Newton's one-step error reconstructor) Gauss-Newton normalized difference inverse. This follows the reference:
GREIT NOSER algorithm for time differencefunction [img,map]= GREIT_NOSER_diff( ref_meas, reconst_meas ) % Reconstruct GREIT images using NOSER algorithm % % (C) 2008 Andy Adler. Licenced under GPL v2 or v3 % $Id: GREIT_NOSER_diff.m 1561 2008-07-27 03:43:12Z aadler $ [RM,map] = calc_NOSER_RM; % Expand ref_meas to the full size of reconst_meas num_meas = size(reconst_meas,2); ref_meas = ref_meas * ones(1,num_meas); dv = reconst_meas - ref_meas; % reconst image ds = RM*dv; img= reshape(ds, 32,32,num_meas); function [RM,map] = calc_NOSER_RM [J,map] = GREIT_Jacobian_cyl; RM = zeros(size(J')); % Remove space outside FEM model J= J(:,map); % inefficient code - but for clarity diagJtJ = diag(J'*J); R= spdiags( diagJtJ,0, length(diagJtJ), length(diagJtJ)); hp = 2.0; RM(map,:)= (J'*J + hp^2*R)\J'; GREIT NOSER algorithm for normalized time differencefunction [img,map]= GREIT_NOSER_ndiff( ref_meas, reconst_meas ) % Reconstruct GREIT images using NOSER algorithm % % (C) 2008 Andy Adler. Licenced under GPL v2 or v3 % $Id: GREIT_NOSER_ndiff.m 1561 2008-07-27 03:43:12Z aadler $ [RM,map] = calc_NOSER_RM; % Expand ref_meas to the full size of reconst_meas num_meas = size(reconst_meas,2); ref_meas = ref_meas * ones(1,num_meas); dv = ( reconst_meas - ref_meas ) ./ ref_meas; % CHANGE IS HERE: % reconst image ds = RM*dv; img= reshape(ds, 32,32,num_meas); function [RM,map] = calc_NOSER_RM [J,map,vbkgnd] = GREIT_Jacobian_cyl; J = J ./ (vbkgnd*ones(1,size(J,2))); % Normalized Jacobian RM = zeros(size(J')); % Remove space outside FEM model J= J(:,map); % inefficient code - but for clarity diagJtJ = diag(J'*J); R= spdiags( diagJtJ,0, length(diagJtJ), length(diagJtJ)); hp = 2.0; RM(map,:)= (J'*J + hp^2*R)\J'; Jacobian CalculationThe previous code depends on this function to calculate and cache the Jacobian matrix.function [J,map,vbkgnd] = GREIT_Jacobian_cyl; % Calculate the GREIT 32x32 Jacobian for a cylinder % The FEM Model ng_mdl_16x1_fine must be available % % (C) 2008 Andy Adler. Licenced under GPL v2 or v3 % $Id: GREIT_Jacobian_cyl.m 3273 2012-06-30 18:00:35Z aadler $ if exist('GREIT_Jacobian_cyl.mat','file'); load GREIT_Jacobian_cyl.mat J map vbkgnd else [J,vbkgnd,map] = Jacobian_calc; save GREIT_Jacobian_cyl.mat J map vbkgnd end function [J,vbkgnd,map] = Jacobian_calc; use_3d_model = 1; if use_3d_model % This 3D model has some problems fmdl = ng_mk_cyl_models([10,15,1.2],[16,5],[.5,0,.15]); fmdl.solve = @fwd_solve_1st_order; fmdl.jacobian = @jacobian_adjoint; fmdl.system_mat=@system_mat_1st_order; fmdl.elems = double(fmdl.elems); else imdl = mk_common_model('f2d3c',16); fmdl= imdl.fwd_model; fmdl.nodes = fmdl.nodes(:,[2,1]); end fmdl.nodes(:,1) = -fmdl.nodes(:,1); % yvec is reversed because image yaxis is reversed pixel_grid= 32; nodes= fmdl.nodes; xyzmin= min(nodes,[],1); xyzmax= max(nodes,[],1); xvec= linspace( xyzmin(1), xyzmax(1), pixel_grid+1); yvec= linspace( xyzmin(2), xyzmax(2), pixel_grid+1); % CALCULATE MODEL CORRESPONDENCES if use_3d_model zvec= [0.6*xyzmin(3)+0.4*xyzmax(3), 0.4*xyzmin(3)+0.6*xyzmax(3)]; [rmdl,c2f] = mk_grid_model(fmdl, xvec, yvec, zvec); else [rmdl,c2f] = mk_grid_model(fmdl, xvec, yvec); end img= mk_image(fmdl, 1); img.fwd_model.coarse2fine = c2f; img.rec_model= rmdl; % ADJACENT STIMULATION PATTERNS img.fwd_model.stimulation= mk_stim_patterns(16, 1, ... [0,1],[0,1], {'do_redundant', 'no_meas_current'}, 1); % SOLVERS img.fwd_model.system_mat= @system_mat_1st_order; img.fwd_model.solve= @fwd_solve_1st_order; img.fwd_model.jacobian= @jacobian_adjoint; vbkgnd = fwd_solve(img); vbkgnd = vbkgnd.meas; J= calc_jacobian(img); % map = reshape(sum(c2f,1),pixel_grid,pixel_grid)>0; [x,y]= meshgrid(linspace(-1,1,32),linspace(-1,1,32)); map = x.^2 + y.^2 < 1.1; |
Last Modified: $Date: 2017-02-28 13:12:08 -0500 (Tue, 28 Feb 2017) $ by $Author: aadler $