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
|
GN reconstruction vs BackprojectionThe most commonly used EIT reconstruction algorithm is the backprojection algorithm of Barber and Brown, as implemented in the Sheffield Mk I EIT system.This tutorial explores the concept of reconstruction from electrical field projections, but does not implement the original backprojection algorithm. The reconstruction matrix output by the original algorithm has been made available as part of EIDORS, here
Calculate the nodal voltage field%$Id: backproj_solve01.m 4067 2013-05-26 20:17:46Z bgrychtol $ clf; imdl= mk_common_model('c2c',16); fmdl= imdl.fwd_model; ee= fmdl.elems'; xx= reshape( fmdl.nodes(ee,1),3, []); yy= reshape( fmdl.nodes(ee,2),3, []); for i=1:4 if i==1; stim= [0,1]; elseif i==2; stim= [0,2]; elseif i==3; stim= [0,4]; elseif i==4; stim= [0,8]; end fmdl.stimulation = mk_stim_patterns(16,1,stim,[0 1], {}, 1); img= mk_image(fmdl, 1); node_v= calc_all_node_voltages( img ); zz{i}= reshape( node_v(ee,4),3, []); end for i=1:4 subplot(2,4,i); cla patch(xx,yy,zz{i},zz{i}); view(0, 4); axis off end print_convert backproj_solve01a.png for i=1:4 subplot(2,4,i); cla patch(xx,yy,zz{i},zz{i}); view(0,34); axis off end print_convert backproj_solve01b.png Figure: Nodal voltages in a mesh with different stimulation patterns. From Left to right: Adjacent stimulation ([0 1]), 45° stimulation ([0 2]), 90° stimulation ([0 4]), 180° stimulation ([0 8]) Calculate Equipotential lines% $Id: backproj_solve02.m 3879 2013-04-18 09:26:22Z aadler $ clf; img = {}; % Solve voltage for 3 different models for idx=1:3 if idx==1; mdltype= 'd2C2'; elseif idx==2; mdltype= 'd2d3c'; elseif idx==3; mdltype= 'd2T2'; end pat = 4; % Stimulation pattern to show imdl= mk_common_model(mdltype,16); img{idx} = mk_image(imdl); stim = mk_stim_patterns(16,1,'{ad}','{mono}',{'meas_current','rotate_meas'},-1); img{idx}.fwd_model.stimulation = stim(pat); img{idx}.fwd_solve.get_all_meas = 1; end % Show raw voltage pattern for idx=1:3 vh = fwd_solve(img{idx}); imgn = rmfield(img{idx},'elem_data'); imgn.node_data= vh.volt; subplot(2,3,idx); show_fem(imgn); end print_convert backproj_solve02a.png % Calculate Equipotential lines for idx=1:3 vh = fwd_solve(img{idx}); imgn = rmfield(img{idx},'elem_data'); imgn.node_data= zeros(size(vh.volt,1),1); for v = 2:16 imgn.node_data(vh.volt > vh.meas(v)) = v; end subplot(2,3,idx); show_fem(imgn); end print_convert backproj_solve02b.png Figure: Equipotential lines for adjacent stimulation From Left to right: 1024 element circular mesh, 6746 element electrode refined element circular mesh, 1024 element mesh of human upper thorax Create 2D Model and simulate measurementsHere, we reuse the model from the this tutorial, below:% Compare 2D algorithms % $Id: tutorial120a.m 3273 2012-06-30 18:00:35Z aadler $ imb= mk_common_model('c2c',16); e= size(imb.fwd_model.elems,1); bkgnd= 1; % Solve Homogeneous model img= mk_image(imb.fwd_model, bkgnd); vh= fwd_solve( img ); % Add Two triangular elements img.elem_data([25,37,49:50,65:66,81:83,101:103,121:124])=bkgnd * 2; img.elem_data([95,98:100,79,80,76,63,64,60,48,45,36,33,22])=bkgnd * 2; vi= fwd_solve( img ); % Add -12dB SNR vi_n= vi; nampl= std(vi.meas - vh.meas)*10^(-18/20); vi_n.meas = vi.meas + nampl *randn(size(vi.meas)); show_fem(img); axis square; axis off print_convert('tutorial120a.png', '-density 60') Figure: Sample image to test 2D image reconstruction algorithms Image reconstruction with GN (NOSER) and Backprojection solvers% $Id: backproj_solve03.m 4839 2015-03-30 07:44:50Z aadler $ tutorial120a; % get the model from a related tutorial % Gauss Newton Solver inv_GN= eidors_obj('inv_model','GN_solver','fwd_model', img.fwd_model); inv_GN.reconst_type= 'difference'; inv_GN.solve= @inv_solve_diff_GN_one_step; inv_GN.RtR_prior= @prior_noser; inv_GN.jacobian_bkgnd.value= 1; inv_GN.hyperparameter.value= 0.2; imgr= inv_solve(inv_GN, vh,vi); imgr.calc_colours.ref_level=0; subplot(131); show_fem(imgr); axis equal; axis off % Backprojection Solver inv_BP= eidors_obj('inv_model','BP_solver','fwd_model', img.fwd_model); inv_BP.reconst_type= 'difference'; inv_BP.solve= @inv_solve_backproj; inv_BP.inv_solve_backproj.type= 'naive'; imgr= inv_solve(inv_BP, vh,vi); imgr.calc_colours.ref_level=0; subplot(132); show_fem(imgr); axis equal; axis off inv_BP.inv_solve_backproj.type= 'simple_filter'; imgr= inv_solve(inv_BP, vh,vi); imgr.calc_colours.ref_level=0; subplot(133); show_fem(imgr); axis equal; axis off print_convert inv_solve_backproj03a.png Figure: Reconstructions using: Left: GN Solver with NOSER Prior Middle: Naive Backprojection Right: Backprojection with a simple filter GN vs Sheffield BackprojectionThere are several different versions of the backprojection algorithm in existence. The matrix available with EIDORS and shown here is the version distributed with the Sheffield Mk I system, and is very similar to the algorithm distributed with the Göttingen Goe MF II EIT system. Almost all clinical and experimental publications which mention "backprojection" use this version of the algorithm.
% Sheffield MKI backprojection $Id: backproj_solve04.m 4839 2015-03-30 07:44:50Z aadler $ % Gauss Newton Solvers inv_mdl{1} = inv_GN; inv_mdl{1}.hyperparameter.value= 0.2; inv_mdl{2} = inv_GN; inv_mdl{2}.hyperparameter.value= 0.5; % Sheffield Backprojection solver inv_mdl{3} = mk_common_gridmdl('backproj'); for loop=1:3 imgr= inv_solve(inv_mdl{loop}, vh,vi); imgr.calc_colours.ref_level=0; subplot(1,3,loop); show_fem(imgr); axis equal; axis off end print_convert inv_solve_backproj04a.png Figure: Reconstructions using: Left: GN Solver with NOSER Prior (small hyperparameter) Middle:GN Solver with NOSER Prior (larger hyperparameter) Right: Sheffield Mk I Backprojection |
Last Modified: $Date: 2017-02-28 13:12:08 -0500 (Tue, 28 Feb 2017) $ by $Author: aadler $