This is the MGM code written by Gabriele Facciolo, Carlo de Franchis, and Enric Meinhardt.
If you want to use this software or results obtained with it, the following paper should be cited within your publication:
Site : http://dev.ipol.im/~facciolo/mgm/ Email: gabriele.facciolo@cmla.ens-cachan.fr
This C++ code can be used for approximately optimizing MRF energies, defined on the 4- or 8-connected image grids, of the form:
E(D) = \sum_p C_p(Dp) + \sum{pq} w_{pq} V (D_p, D_q)
where C_p() denotes the unary term for the p-th node, the variables D_p take values in the range [0,L-1], C_p is represented as a costvolume of size W x H x L. V() denotes the distance function used for specifying the pairwise potentials, it can take one of these two forms (with params P1,P2): 1) SMG's potential (Hirschmuller'08)
| 0 if |a - b|==0
Vh(a,b) = | P1 if |a - b|==1
| P2 otherwise
or 2) any potential described in (Felzenszwalb-Huttenlocher'06), this code implements truncated linear and linear (P2=inf)
Vl(a,b) = min(P1*|a - b|, P2).
The edge weights are given by w_{pq}, w can actually be used to adapt the parameters P1 and P2 on the pixel basis as: V (D_p, D_q, P1(w(p)), P2(w(p)) ), but the current implementation just multiplies the potential. The weights are represented as a stack of 8 images. For a pixel p each image of the stack contain the weight to the corresponding neighboring pixel: West, Est, S, N, (NW, NE, SE, SW). That is the first image just contains the weights for pixels to the left. For 4-connectivity, only the first 4 images are read, while for 8-connectivity the whole stack of 8 images is used.
The code in this directory uses MGM for stereo. The option of the mgm program are shown when called without parameters.
The matlab subdirectory contains a simplified version of MGM, and a matlab wrapper for solving optimization problems as described above.
Run make to compile the C++ code (uses OpenMP) Tested in Linux, OSX and OpenBSD using gcc and clang
The following line runs MGM with 8 traversals (-O 8) with 3-neighbor recursion (TSGM=3, mgm is usually 2, but this is NEW!).
* The cost is measured in absolute differences of the horizontal
sobel derivatives (sobel_x),
* for the regularity it uses the FELZENSZWALB potential V
(USE_TRUNCATED_LINEAR_POTENTIALS=1),
* then refines disparities with V_fitting and postprocesses with
MEDIAN filter.
MEDIAN=1 USE_TRUNCATED_LINEAR_POTENTIALS=1 TSGM=3 ./mgm -P2 20000 -P1 4 -r -120 -R 30 -p sobel_x \
-truncDist 63 -s vfit -O 8 data/fountain23-im?.png /tmp/{disp,cost}.tif
The following line runs MGM with 8 traversals (-O 8) with 3-neighbor recursion (TSGM=3, mgm is usually 2, but this is NEW!)
* the cost is CENSUS on 3x3 neighors,
* for the regularity uses the FELZENSZWALB potential V
(USE_TRUNCATED_LINEAR_POTENTIALS=1),
* then refines disparities with V_fitting and postprocesses
with MEDIAN filter.
MEDIAN=1 CENSUS_NCC_WIN=3 USE_TRUNCATED_LINEAR_POTENTIALS=1 TSGM=3 ./mgm -P2 20000 -P1 2 -r -120 -R 30 \
-t census -s vfit -O 8 data/fountain23-im?.png /tmp/{disp,cost}.tif
The following line runs a similar experiment with a satellite image
OMP_NUM_THREADS=4 MEDIAN=1 CENSUS_NCC_WIN=5 TSGM=3 ./mgm -r -22 -R 19 -s vfit \
-t census -O 8 data/rectified_{ref,sec}.tif /tmp/{disp,cost}.tif
This section describes the options accepted by the mgm
program.
mgm
-r (default=-30): Minimum horizontal disparity value. (The images are assumed to be rectified, which eliminates the vertical disparity.)
-R (default=30): Maximum horizontal disparity value.
-O (default=4): Number of search directions. Options: 2, 4, 8, 16.
-P1 (default=8) SGM regularization parameter P1.
-P2 (default=32): SGM regularization parameter P2.
-p (default=none):
Prefilter algorithm. Options: none, census, sobelx, gblur. The
census
mode uses the window of dimensions CENSUS_NCC_WIN
.
-t (default=ad):
Distance function. Options: census, ad, sd, ncc, btad, btsd. For
ncc
the window of dimensions CENSUS_NCC_WIN
is used. The
bt
option is the Birchfield-Tomasi distance.
-truncDist (default=inf): Truncate distances at nch * truncDist.
-s (default=none): Subpixel refinement algorithm. Options: none, vfit, parabola, cubic.
-aP1 (default=1): Multiplier factor of P1 when sum |I1 - I2|^2 < nch * aThresh^2.
-aP2 (default=1): Multiplier factor of P2 as above.
-aThresh (default=5): Threshold for the multiplier factors.
-m FILE (default=none): A file with minimum input disparity.
-M FILE (default=none): A file with maximum input disparity.
-l FILE (default=none): Write here the disparity without the left-to-right test.
These should be set on the command line before mgm
is invoked.
CENSUS_NCC_WIN=3: Size of the window for the census prefilter algorithm and NCC (normalized cross-correlation).
TESTLRRL=1: If 1, do left-to-right and right-to-left consistency checks.
MEDIAN=0: Radius of the median filter postprocessing.
TSGM=4: Regularity level.
TSGM_ITER=1: Number of iterations.
TSGM_FIX_OVERCOUNT=1: If 1, fix overcounting of the data term in the energy.
TSGM_DEBUG=0: If 1, print debug information.
TSGM_2LMIN=0: Use the improved TSGM cost only for TSGM=2. Overrides the TSGM value.
USE_TRUNCATED_LINEAR_POTENTIALS=0: If 1, use the Felzenszwalb-Huttenlocher truncated linear potential. Then P1 and P2 change meaning. The potential they describe becomes V(p,q) = min(P2, P1*|p-q|).
Special thanks to Oleg Alexandrov for many bugfixes and for updating the documentation.