INVGRADIENT Basically the opposite of gradient(), aka Inverse Gradient.
F_bar = INVGRADIENT(dFx,dFy) reverses GRADIENT(F), where unit spacing is assumed.
F_bar = INVGRADIENT(dFx,dFy,H), where H is scalar, uses H as the spacing between points.
F_bar = INVGRADIENT(dFx,dFy,Hx,Hy) is basically the same, except that both x- and y-spacings are specified. Obviously, the DC offset of the integrated function is arbitrary. Also,
INVGRADIENT is limited to 2-dimensions at the moment, ie no 3-dimensional matrices, or vectors. If dFx and dFy aren't self-consistent then no exact solution can be integrated. In this case% the optimal solution, in the least squares sense, will be found. So if you do F_bar = INVGRADIENT(dFx,dFy), F_bar will be found such that doing [dFx_ dFy_] = GRADIENT(F_bar) will give you dFx_ and dFy_ that are as close as possible to the original dFx and dFy.
April 5, 2005
If this doesn't work right, email firstname.lastname@example.org, w/o the nospam.
Good concept, but you are not a MATLAB-thinking guy. Some improvement suggestion
1. try to use sparse() and diag() to form your Gx and Gy, much faster than loop(C/C++ way).
2. Similarly, use sparse() and diag() for G2, or you can form G2 directly without Gx Gy. For God sake, please do that. G2 is a 2NM-by-NM double FULL matrix, if the F is N-by-M matrix. That's (NM)^2*2*8 Bytes, for a normal size image N=M=512, that's 2^40 Bytes = 1024 GB, no one has such RAM.
3. why do you use pinv()? that's very expensive, and I don't see it's neccessary. Try '\'.
Very good stuff! Very accurate, the penalty is in the speed of the algorithm,though...
Looking forward into 3D version!