% est_pchirp2weighteddirect... Steve Mann, 1992-1993 % % estimate the 8 projective parameters from a pair of images, simplistic weighting % % sign convention: m (or X) down, n (or Y) to right % properly handles situation when one or both images contain some NaN points % % See also: est_affine.m, est_pseudo.m, etc... function [p1,p2,p3,p4,p5,p6,p7,p8]=f(E1,E2); % two images in, 0,1,or 8 outs %%%%mask = isnan(E1).*isnan(E2); % NaN mask: regions where either is undefined % doesnt work because nanmask makes it still nan [El,Em,En] = derivatives(E1,E2); [M,N]= size(El); % size of any of the 3 derivative matrices [n m]=meshdom(1:N,M:-1:1); % variables ``x'' and ``y'' %disp('est_pseudo: converting from pixels to units on [0,1); doesn''t work???') %m=m/M; disp('doesnt work?') %n=n/N; disp('doesnt work?') DERIVATIVES = ... [... [sum2nan(m.*Em .* m.*Em) sum2nan(m.*Em .* n.*Em) sum2nan(m.*Em .* Em ) sum2nan(m.*Em .* m.*En)... sum2nan(m.*Em .* n.*En) sum2nan(m.*Em .* En ) sum2nan(m.*Em .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan(m.*Em .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan(n.*Em .* m.*Em) sum2nan(n.*Em .* n.*Em) sum2nan(n.*Em .* Em ) sum2nan(n.*Em .* m.*En)... sum2nan(n.*Em .* n.*En) sum2nan(n.*Em .* En ) sum2nan(n.*Em .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan(n.*Em .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan(Em .* m.*Em) sum2nan(Em .* n.*Em) sum2nan(Em .* Em ) sum2nan(Em .* m.*En)... sum2nan(Em .* n.*En) sum2nan(Em .* En ) sum2nan(Em .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan(Em .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan(m.*En .* m.*Em) sum2nan(m.*En .* n.*Em) sum2nan(m.*En .* Em ) sum2nan(m.*En .* m.*En)... sum2nan(m.*En .* n.*En) sum2nan(m.*En .* En ) sum2nan(m.*En .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan(m.*En .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan(n.*En .* m.*Em) sum2nan(n.*En .* n.*Em) sum2nan(n.*En .* Em ) sum2nan(n.*En .* m.*En)... sum2nan(n.*En .* n.*En) sum2nan(n.*En .* En ) sum2nan(n.*En .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan(n.*En .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan(En .* m.*Em) sum2nan(En .* n.*Em) sum2nan(En .* Em ) sum2nan(En .* m.*En)... sum2nan(En .* n.*En) sum2nan(En .* En ) sum2nan(En .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan(En .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* m.*Em) sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* n.*Em) sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* Em ) sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* m.*En)... sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* n.*En) sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* En ) sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan((m.*El-m.*m.*Em-m.*n.*En) .* (n.*El-m.*n.*Em-n.*n.*En))];... [sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* m.*Em) sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* n.*Em) sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* Em ) sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* m.*En)... sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* n.*En) sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* En ) sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* (m.*El-m.*m.*Em-m.*n.*En)) sum2nan((n.*El-m.*n.*Em-n.*n.*En) .* (n.*El-m.*n.*Em-n.*n.*En))]... ]; Derivatives = ... [sum2nan((m.*Em+n.*En-El) .* m.*Em); ... sum2nan((m.*Em+n.*En-El) .* n.*Em); ... sum2nan((m.*Em+n.*En-El) .* Em); ... sum2nan((m.*Em+n.*En-El) .* m.*En); ... sum2nan((m.*Em+n.*En-El) .* n.*En); ... sum2nan((m.*Em+n.*En-El) .* En); ... sum2nan((m.*Em+n.*En-El) .* (m.*El-m.*m.*Em-m.*n.*En)); ... sum2nan((m.*Em+n.*En-El) .* (n.*El-m.*n.*Em-n.*n.*En)) ... ]; % vector of derivatives parameters = DERIVATIVES\Derivatives; if (nargout == 8) | (nargout == 0) % p1 = parameters(1); % if called with no semicolon, do not want to see any ans=[], etc, so make no reference to p1 p2 = parameters(2); p3 = parameters(3); p4 = parameters(4); p5 = parameters(5); p6 = parameters(6); p7 = parameters(7); p8 = parameters(8); end%if if nargout == 8 p1 = parameters(1); end%if if nargout == 1 p1 = parameters([1 2 3 4 5 6 7 8]); % no longer permuted end%if if nargout == 0 disp('est_pseudo: 0 output args given; displaying result to screen:') disp(sprintf('%g %g %g %g %g %g %g %g',parameters(1),p2,p3,p4,p5,p6,p7,p8)) end%if if (nargout ~=0) & (nargout ~= 1) & (nargout ~= 8) error('est_pseudo: number of output arguments must be 0, 1, or 8') end%if