[Benjamin Piwowarski] Renamed "foreach" macro into "bforeach" to avoid conflicts...
[libdai.git] / examples / example_imagesegmentation.cpp
index aa85ab8..fb5c57e 100644 (file)
@@ -1,17 +1,14 @@
 /*  This file is part of libDAI - http://www.libdai.org/
  *
- *  libDAI is licensed under the terms of the GNU General Public License version
- *  2, or (at your option) any later version. libDAI is distributed without any
- *  warranty. See the file COPYING for more details.
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
  *
- *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
- *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  */
 
 
 #include <iostream>
 #include <dai/alldai.h>  // Include main libDAI header file
-#include <CImg.h>        // This example needs a recent version of CImg to be installed
+#include <CImg.h>        // This example needs CImg to be installed
 
 
 using namespace dai;
@@ -37,8 +34,13 @@ FactorGraph img2fg( const CImg<T> &img, double J, double th_min, double th_max,
     vector<Var> vars;
     vector<Factor> factors;
 
+#ifndef NEW_CIMG
+    size_t dimx = img.width;   // Width of the image in pixels
+    size_t dimy = img.height;  // Height of the image in pixels
+#else
     size_t dimx = img.width();   // Width of the image in pixels
     size_t dimy = img.height();  // Height of the image in pixels
+#endif
     size_t N = dimx * dimy;      // One variable for each pixel
 
     // Create variables
@@ -168,10 +170,14 @@ double doInference( FactorGraph& fg, string algOpts, size_t maxIter, double tol,
             }
 
         // Display the image with the current beliefs
+#ifndef NEW_CIMG
+        disp << image;
+#else
         disp = image;
+#endif
 
-        // Perform the requested inference algorithm
-        // (which could be limited to perform only 1 iteration)
+        // Perform the requested inference algorithm for only one step
+        ia->setMaxIter( iter + 1 );
         maxDiff = ia->run();
 
         // Output progress
@@ -209,6 +215,9 @@ int main(int argc,char **argv) {
     const double th_max = cimg_option( "-thmax", 3.2, "Local evidence strength of foreground" );
     const double scale = cimg_option( "-scale", 40.0, "Typical difference in pixel values between fore- and background" );
     const double pbg = cimg_option( "-pbg", 90.0, "Percentage of background in image" );
+    const char *infname = cimg_option( "-method", "BP[updates=SEQMAX,maxiter=1,tol=1e-9,logdomain=0]", "Inference method in format name[key1=val1,...,keyn=valn]" );
+    const size_t maxiter = cimg_option( "-maxiter", 100, "Maximum number of iterations for inference method" );
+    const double tol = cimg_option( "-tol", 1e-9, "Desired tolerance level for inference method" );
     const char *file_fg = cimg_option( "-fg", "", "Output factor graph" );
 
     // Read input images
@@ -219,10 +228,17 @@ int main(int argc,char **argv) {
     CImg<unsigned char> image2 = CImg<>( file_i2 );
 
     // Check image sizes
+#ifndef NEW_CIMG
+    if( (image1.width != image2.width) || (image1.height != image2.height) )
+        cerr << "Error: input images should have same size." << endl;
+    size_t dimx = image1.width;
+    size_t dimy = image1.height;
+#else
     if( (image1.width() != image2.width()) || (image1.height() != image2.height()) )
         cerr << "Error: input images should have same size." << endl;
     size_t dimx = image1.width();
     size_t dimy = image1.height();
+#endif
 
     // Display input images
     cout << "Displaying input image 1..." << endl;
@@ -242,9 +258,15 @@ int main(int argc,char **argv) {
     for( size_t i = 0; i < dimx; i++ ) {
         for( size_t j = 0; j < dimy; j++ ) {
             int avg = 0;
+#ifndef NEW_CIMG
+            for( int c = 0; c < image1.dimv(); c++ )
+                avg += image1( i, j, c );
+            avg /= image1.dimv();
+#else
             for( int c = 0; c < image1.spectrum(); c++ )
                 avg += image1( i, j, c );
             avg /= image1.spectrum();
+#endif
             image3( i, j, 0 ) /= (1.0 + avg / 255.0);
         }
     }
@@ -274,16 +296,7 @@ int main(int argc,char **argv) {
     CImgDisplay disp5( dimx, dimy, "Beliefs during inference", 0 );
     vector<double> m; // Stores the final magnetizations
     cout << "Solving the inference problem...please be patient!" << endl;
-    // doInference( fg, "BP[updates=SEQFIX,maxiter=1,tol=1e-9,verbose=0,logdomain=0]", 100, 1e-9, m, dimx, dimy, disp5 );
-    doInference( fg, "BP[updates=SEQMAX,maxiter=1,tol=1e-9,verbose=0,logdomain=0]", 100, 1e-9, m, dimx, dimy, disp5 );
-    // doInference( fg, "BP[updates=SEQRND,maxiter=1,tol=1e-9,verbose=0,logdomain=0]", 100, 1e-9, m, dimx, dimy, disp5 );
-    // doInference( fg, "HAK[doubleloop=0,clusters=LOOP,init=UNIFORM,loopdepth=4,tol=1e-9,maxiter=1,verbose=3]", 1000, 1e-5, m, dimx, dimy, disp5 );
-    // doInference( fg, "HAK[doubleloop=0,clusters=BETHE,init=UNIFORM,maxiter=1,tol=1e-9,verbose=3]", 1000, 1e-5, m, dimx, dimy, disp5 );
-    // doInference( fg, "MF[tol=1e-9,maxiter=1,damping=0.0,init=RANDOM,updates=HARDSPIN]", 1000, 1e-5, m, dimx, dimy, disp5 );
-    // doInference( fg, "TREEEP[type=ORG,tol=1e-9,maxiter=10000,verbose=3]", 1000, 1e-5, m, dimx, dimy, disp5 );
-    // doInference( fg, "GIBBS[iters=1,burnin=0]", 100, 1e-9, m, dimx, dimy, disp5 );
-    // doInference( fg, "GIBBS[iters=1,burnin=0]", 100, 1e-9, m, dimx, dimy, disp5 );
-    // doInference( fg, "GIBBS[iters=1,burnin=0]", 100, 1e-9, m, dimx, dimy, disp5 );
+    doInference( fg, infname, maxiter, tol, m, dimx, dimy, disp5 );
 
     // Visualize the final magnetizations
     for( size_t i = 0; i < dimx; i++ )
@@ -294,8 +307,13 @@ int main(int argc,char **argv) {
                 image4(i,j,1) = image2(i,j,1);
                 image4(i,j,2) = image2(i,j,2);
             } else
+#ifndef NEW_CIMG
+                for( size_t c = 0; c < (size_t)image4.dimv(); c++ )
+                    image4(i,j,c) = 255;
+#else
                 for( size_t c = 0; c < (size_t)image4.spectrum(); c++ )
                     image4(i,j,c) = 255;
+#endif
         }
     cout << "Displaying the final result of the segmentation problem..." << endl;
     CImgDisplay main_disp( image4, "Foreground/background segmentation result", 0 );
@@ -304,8 +322,13 @@ int main(int argc,char **argv) {
     image4.save_jpeg( file_o2, 100 );
 
     cout << "Close the last image display in order to finish." << endl;
+#ifndef NEW_CIMG
+    while( !main_disp.is_closed )
+        cimg::wait( 40 );
+#else
     while( !main_disp.is_closed() )
         cimg::wait( 40 );
+#endif
 
     return 0;
 }