function initialise(ipr, img_meas, re_fg, dx_fg)
    % initialise reconstruction with a first guess of particle positions
    % and displacements
    %
    % Input:
    %   img_ary     1 x n_cameras   particle images
    %   re_fg       3 x n_part      first guess particle position
    %   dx_fg       3 x n_part      first guess particle displacement
    
    %% sanity check input
    n_part          = size(re_fg, 2);
    assert(size(re_fg, 1) == 3);
    assert(size(re_fg, 1) == 3);
    assert(size(dx_fg, 2) == n_part);
    assert(numel(img_meas) == ipr.n_cameras);
    dtype			= ipr.opts.precision;

    %% assign image array
    ipr.img_meas    = img_meas(:).';
    ipr.re_part     = re_fg;
    ipr.dx_part     = dx_fg;
    ipr.d_part      = ones(1,n_part,dtype);
    ipr.lambda      = ipr.opts.lambda0 * ones(1, n_part, dtype);
    
    %% project with unit brightness
    pimg            = ipr.project();
    
    %% evaluate brightness based on middle frame
    for ic = 1 : ipr.n_cameras
        % find optimal model parameter so that
        %  pimg_meas(:,ip) = pimg_proj(:,ip) * amplitude(ip)
		ind         = pimg(2,ic).ind;
        pimg_proj   = pimg(2,ic).img;
        pimg_meas   = pimg(2,ic).ref; 
% 		ind         = pimg(2,ic).ind;
% 		pimg_proj	= cat(1, pimg(1,ic).img, pimg(2,ic).img, pimg(3,ic).img);
% 		pimg_meas	= cat(1, pimg(1,ic).ref, pimg(2,ic).ref, pimg(3,ic).ref);

		XtX			= dot(pimg_proj, pimg_proj, 1);
		Xty			= dot(pimg_proj, pimg_meas, 1);
		amp			= Xty ./ XtX;
		% ensure brightness is non-negative
		amp			= max(0, amp);
		% average amplitude over multiple cameras
        % using geometric mean
        ipr.d_part(1,ind) = ipr.d_part(1,ind) .* sqrt(amp);
    end
    ipr.d_part = ipr.d_part.^(1./ipr.n_views(2,:));
	assert(isreal(ipr.d_part));
	
	%% remove dim particles
	b_accept		= ipr.d_part > sqrt(ipr.opts.I_min);
	disp(prctile(ipr.d_part, [5 25 50 75 95]));
	ipr.select(b_accept);
	fprintf('I%02d     reject %d new particles because they are too dim\n', ipr.riter, nnz(~b_accept));
	%% merge close particles
	ipr.merge(ipr.opts.matching.R_tolerance_obj);
end