function [U,A]=RBMSolver(Uini,iscale,nmod,L) if nargin<4,dokk=1; else dokk=0;end ttic=cputime; load(fullfile('TMP','params'),'param'); param0=param; onflight=0; if isfield(param0,'onflight') onflight=param0.onflight; end if onflight global phiy phix Xi Yi wdetJ inde on phidf end load(fullfile('TMP',sprintf('%d_params',nmod)),'param'); psample=1; if isfield(param0,'sampling_factor') psample=param0.sampling_factor; end ncamr=1; dotopo=(~isfield(param,'topography'))&&isfield(param0,'calibration_data'); docrosscorrelation=0; if ~isfield(param0,'deformed_image') mreader=VideoReader(param0.reference_image); nbf=mreader.NumberOfFrames-1; if isfield(param0,'number_of_frames') nbf=param0.number_of_frames; end dim=1; if isfield(param0,'video_sampling') dim=param0.video_sampling; end frames=2:dim:nbf; nim=length(frames); ncamd=1; else if iscell(param0.deformed_image) nim=size(param0.deformed_image,2); ncamd=size(param0.deformed_image,1); else nim=1; ncamd=1; end end if ncamr==1 indcam=ncamd:-1:1; else if docrosscorrelation indo=(ncamd:-1:1)'; indcam=indo'; for ic=1:ncamd-1 indo=circshift(indo,1); indcam=[indcam;indo']; end else indcam=(1:ncamd)'; end end restart=1; if isfield(param0,'restart') restart=param0.restart; end reverse=0; if isfield(param0,'reverse_image') reverse=param0.reverse_image; end disct=0; maxiter=param0.iter_max; conv=param0.convergance_limit; disp(sprintf('Starting resolution for scale %d...',iscale)); pscale=2^(iscale-1); im1=0; pixint=1; U=Uini; A=zeros(size(L,2),size(U,2)); fid=fopen(fullfile('TMP',sprintf('%d_error_%d.mat',nmod,iscale-1)),'w'); if restart nmax=nim; else if iscale==1 nmax=nim; else if nim<2+dotopo nmax=nim; else nmax=2+dotopo; end if isfield(param0,'time_step') nmax=param0.time_step; end end end for ijm=1:nmax display(sprintf('Image %d/%d',ijm,nmax)); for icamr=1:ncamr if ijm==1||ncamr>1 load(fullfile('TMP',sprintf('sample%d_%d',(icamr-1),iscale-1)),'im0','sizeim','roi'); dynamic=max(im0(:))-min(im0(:)); ndim=length(sizeim); if ~onflight load(fullfile('TMP',sprintf('%d_phix_%d',nmod*10^(icamr-1),(iscale-1))),'on'); load(fullfile('TMP',sprintf('%d_phix_%d',nmod*10^(icamr-1),10*(iscale-1))),'phix','Xi','Yi','wdetJ'); load(fullfile('TMP',sprintf('%d_phiy_%d',nmod*10^(icamr-1),10*(iscale-1))),'phiy'); load(fullfile('TMP',sprintf('%d_phidf_%d',nmod*10^(icamr-1),iscale-1)),'phidf'); end load(fullfile('TMP',sprintf('%d_operator_%d',nmod*10^(icamr-1),iscale-1)),'M','R','P'); M=L'*((M+R+P)*L); load(fullfile('TMP',sprintf('%d_mask_%d',nmod,iscale-1)),'mask'); if ijm==1&&icamr==1, fwrite(fid,0);fwrite(fid,min(255,dynamic));end if iscale==1 if strcmp(param.basis,'fem')||strcmp(param.basis,'nurbs')||strcmp(param.basis,'btri') mesh_file=fullfile('TMP',sprintf('%d_mesh_%d',nmod*10^(icamr-1),iscale-1)); load(mesh_file,'ng'); if (ng>0)||isfield(param,'gp_file')||isfield(param,'extrusion_parameters')||strcmp(param.basis,'nurbs')||strcmp(param.basis,'btri') load(fullfile('TMP',sprintf('sample%d',(icamr-1))),'im0','sizeim'); [im00]=mexInterpSpline((Xi-1)*psample+roi(1),(Yi-1)*psample+roi(3),im0); im0=im00; pixint=0; end end end mean0=mean(im0(:)); std0=std(im0(:)); im0=im0-mean0; end for icamd=1:size(indcam,2) iz=indcam(icamr,icamd)+(icamr-1)*size(indcam,2)*docrosscorrelation; res=1; ii=1; if restart Ui=Uini(:,ijm,iz); Pi=zeros(size(L,2),1); else if ijm==1 Ui=Uini(:,ijm,iz); Pi=zeros(size(L,2),1); if dotopo&&(indcam(icamr,icamd)==icamr) Ui=0*Ui; res=0; disc=zeros(numel(im0),1); end elseif ijm<3+dotopo Ui=Uini(:,ijm,iz); else % DU=U(:,ijm-1,iz)-U(:,ijm-2,iz); DP=A(:,ijm-1)-A(:,ijm-2); % if incremental % Ui=DU; % else % Ui=U(:,ijm-1,iz)+DU; Pi=A(:,ijm-1)+DP; Ui=Uini(:,ijm,iz)+L*Pi; % end end end while ( res>conv && ii< maxiter) Ux=phix*Ui; Uy=phiy*Ui; NestedResidual(ijm); disc=mask*disc; merror=std(disc(on))/dynamic; F=phidf'*(wdetJ*disc); F=L'*(F-R*Ui); if isfield(param0,'solver') solv=param0.solver; if strcmp(solv,'lu') if ii==1 [LT,UT]=lu(sparse(M)); end dU=UT\(LT\F); elseif strcmp(solv,'chol') if ii==1 Rc=chol(sparse(M)); end dU=Rc\(Rc'\F); end else dU=M\F; end Pi=Pi+dU; dU=L*dU; disp(sprintf('At iteration # %d',ii)); disp(sprintf('Discrepancy wrt dyn. =%6.2f %%',merror*100)); if ii==1 nU0=max(sqrt(length(Ui)),norm(Ui+dU(:))); else if length(dU)>10 res=norm(dU(:))/nU0; else res=max(abs(dU)./Ui); end disp(sprintf('|dU|=%f',res)); end Ui=Ui+dU; %display(sprintf('uncertainty at iteration %d : %f\n',ii,sqrt(0.5*(var(Ui((1:size(U,1)/2)))+var(Ui(size(U,1)/2+(1:size(U,1)/2))))))) ii=ii+1; end U(:,ijm,iz)=Ui; A(:,ijm)=Pi; disct=disct+disc'*mask*disc; if dynamic>255 disc=255*disc/dynamic; end fwrite(fid,(abs(disc))); if pixint&&iscale==1 disc(~on)=0; VTKExportIntMap(sprintf('camr-%d-camd-%d-scale-%d-%d',icamr,icamd,iscale,ijm),'error',roi(1)-1+(1:sizeim(1)),roi(3)-1+(1:sizeim(2)),reshape(uint8(abs(disc)),sizeim),1); end end end end disp(sprintf('Enlapsed time for resolution = %6.2f s',cputime -ttic)); fclose(fid); function NestedResidual(kkk) if ii==1 if ~isfield(param0,'deformed_image') im1=double(readim(mreader,frames(kkk))); else if ~iscell(param0.deformed_image) fildef=param0.deformed_image; im1=double(readim(fildef)); else fildef=param0.deformed_image{indcam(icamr,icamd),kkk}; im1=double(readim(fildef)); end end if length(size(im1))==3 im1=mean(im1,3); end if reverse im1=im1'; end end % if iscale==1 % figure % scatter(Xi,Yi,10+0*Uy,Uy) % % imagesc(reshape(Ux,sizeim*pscale)) % pause % end sizeim1=size(im1); disc=(mexInterpSpline((Xi-1)*psample+Ux+roi(1),(Yi-1)*psample+Uy+roi(3),im1)); % disc=mexInterpSpline((Xi+Ux+roi(1)-1),(Yi+Uy+roi(3)-1),im1); if iscale>1 disc=reshape(disc,sizeim*pscale); NestedCoarseImage(pscale); end maske=disc<0; mean1=mean(disc(:)); std1=std(disc(:)); disc=disc-mean1; st=std0/std1; disc=(im0(:)-st*disc(:)); disc(maske)=0; function NestedCoarseImage(scale) imsiz0=size(disc); imsiz1=floor(imsiz0/2); nn=2*imsiz1; ndim=length(nn); if ndim==2 disc=disc(1:nn(1),1:nn(2)); elseif ndim==3 disc=disc(1:nn(1),1:nn(2),1:nn(3)); end disc=reshape(disc,scale,prod(nn)/scale); disc=mean(disc,1); nn(1)=nn(1)/scale; disc=reshape(disc,nn); if ndim==2 disc=disc'; disc=reshape(disc,scale,prod(nn)/scale); disc=mean(disc,1); nn(2)=nn(2)/scale; disc=reshape(disc,nn([2,1])); disc=disc'; %toc(); elseif ndim==3 disc=permute(disc,[2,3,1]); disc=reshape(disc,scale,prod(nn)/scale); disc=mean(disc,1); nn(2)=nn(2)/scale; disc=reshape(disc,nn([2,3,1])); disc=permute(disc,[3,1,2]); disc=permute(disc,[3,1,2]); disc=reshape(disc,scale,prod(nn)/scale); disc=mean(disc,1); nn(3)=nn(3)/scale; disc=reshape(disc,nn([3,1,2])); disc=permute(disc,[2,3,1]); end end end end