Eidors-logo    

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
                       

 

Hosted by
SourceForge.net Logo

 

Reconstructing with electrode errors

The main idea used to reconstruct with electrode errors, is to model errors as low SNR, and thus high noise, on measurements which use the affected electrodes.

Sample Data and clean reconstruction

% Sample data + Image $Id: electrode_errors01.m 4839 2015-03-30 07:44:50Z aadler $

% Sample data
load montreal_data_1995
vi = double( zc_resp );
vh = double( zc_resp(:,1) );

% Reconstruct
imdl = mk_common_model('c2t2',16);
imdl.hyperparameter.value = .3;

img = inv_solve(imdl, vh, vi);
subplot(221)
show_slices(img);
print_convert electrode_errors01a.png
close % else matlab remembers image axis
subplot(221) % to preserve size
img = inv_solve(imdl, vh, vi(:,20));
show_fem(img,[0,1,0]);axis off
print_convert electrode_errors01b.png


Figure: Reconstructions of breathing data, illustrating that a small amount of electrode error occurs at electrodes 13 and 5.

Eliminating Electrodes

These results are taken from the paper:
    Andy Adler Reference Accounting for erroneous electrode data in EIT Physiol Meas, 25(1):227-238, 2004.
% Reject electrodes + Image $Id: electrode_errors02.m 4101 2013-05-28 19:18:55Z bgrychtol $

imdl.meas_icov = meas_icov_rm_elecs( imdl, 13);

img = inv_solve(imdl, vh, vi(:,20));
show_fem(img,[0,1,0]); axis off
print_convert electrode_errors02a.png


imdl.meas_icov = meas_icov_rm_elecs( imdl, [13,5]);
img = inv_solve(imdl, vh, vi(:,20));
show_fem(img,[0,1,0]); 
print_convert electrode_errors02b.png


Figure: Reconstructions removing Left: Electrode 13, and Right: Electrodes 5 and 13

Detecting and automatically eliminating electrodes

The idea here is to compare the reciprocity match between measurements and scale the weighting of those which do not match via reciprocity. These results are taken from the paper:
    AE Hartinger, R Guardo, A Adler, H Gagnon. Real-time management of faulty electrodes in EIT IEEE T BME 2008.
% Reciprocity error + Image $Id: electrode_errors03.m 4101 2013-05-28 19:18:55Z bgrychtol $

imdl.calc_reciproc_error.tau = 3e-4;
imdl.meas_icov = calc_reciproc_error( imdl, vi );

img = inv_solve(imdl, vh, vi(:,20)); show_fem(img,[0,1,0]);axis off
print_convert electrode_errors03a.png

imdl.calc_reciproc_error.tau = 3e-2;
imdl.meas_icov = calc_reciproc_error( imdl, vi );

img = inv_solve(imdl, vh, vi(:,20)); show_fem(img,[0,1,0]);axis off
print_convert electrode_errors03b.png


Figure: Reconstructions removing Left: Parameter τ=0.0003 Right: Parameter τ=0.03

Electrode Errors with GREIT

Electrode error management with GREIT is essentially the same. The key difference is that GREIT requires a noise covariance, not the noise inverse covariance.

Create a GREIT model.

% Reject electrodes + Image $Id: electrode_errors04.m 3688 2012-12-15 07:18:33Z bgrychtol $

fmdl= mk_library_model('adult_male_16el_lungs');
% fmdl.electrode = fmdl.electrode([9:16,1:8]);

[stim,msel] = mk_stim_patterns(16,1,[0,1],[0,1],{'no_meas_current'},1);
fmdl.stimulation = stim;
fmdl = mdl_normalize(fmdl, 1);
fmdl.meas_select = msel;
img = mk_image(fmdl, 1);
img.elem_data([fmdl.mat_idx{2};fmdl.mat_idx{3}]) = 0.3; % lungs
clear opt; opt.imgsz = [32 32]; opt.square_pixels=1;
opt.noise_figure = .5;
imdl=mk_GREIT_model(img, 0.25, [], opt);

Basic GREIT reconstruction
% Basic GREIT reconst $Id: electrode_errors05.m 4101 2013-05-28 19:18:55Z bgrychtol $

imgr= inv_solve(imdl, zc_resp(:,1), zc_resp(:,22));
imgr.calc_colours.ref_level=0; show_fem(imgr,[0,1]);

axis equal; axis([-1,1.05,-.8,.8]);
print_convert electrode_errors05a.png


Figure: Basic GREIT reconstruction
GREIT with single electrode errors
% GREIT - error $Id: electrode_errors06.m 4101 2013-05-28 19:18:55Z bgrychtol $

imdl = eidors_obj('inv_model','','fwd_model',fmdl);
imdl.meas_icov_rm_elecs.elec_list = 13;
imdl.meas_icov_rm_elecs.exponent  = -1;
imdl.meas_icov_rm_elecs.SNR       = 100;
opt.noise_covar = meas_icov_rm_elecs(imdl);
imdl=mk_GREIT_model(img, 0.25, [], opt);

imgr= inv_solve(imdl, zc_resp(:,1), zc_resp(:,22));
imgr.calc_colours.ref_level=0; show_fem(imgr,[0,1]);

axis equal; axis([-1,1.05,-.8,.8]);
print_convert electrode_errors06a.png


Figure: GREIT with single electrode errors
GREIT with reciprocity-based electrode errors
% Basic GREIT reconst $Id: electrode_errors07.m 4101 2013-05-28 19:18:55Z bgrychtol $

% use -ve tau to get covariance rather than inv covar
imdl.calc_reciproc_error.tau = -3e-4;
opt.noise_covar = calc_reciproc_error( imdl, zc_resp );

imdl=mk_GREIT_model(img, 0.25, [], opt);

imgr= inv_solve(imdl, zc_resp(:,1), zc_resp(:,22));
imgr.calc_colours.ref_level=0; show_fem(imgr,[0,1]);

axis equal; axis([-1,1.05,-.8,.8]);

print_convert electrode_errors07a.png


Figure: GREIT with reciprocity-based electrode errors

Last Modified: $Date: 2017-03-01 08:44:21 -0500 (Wed, 01 Mar 2017) $ by $Author: aadler $