Olena-patches
  Threads by month 
                
            - ----- 2025 -----
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2024 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2023 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2022 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2021 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2020 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2019 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2018 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2017 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2016 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2015 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2014 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2013 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2012 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2011 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2010 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2009 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2008 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2007 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2006 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2005 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2004 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 
June 2013
- 5 participants
 - 104 discussions
 
11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/Makefile   |    2 +-
 scribo/sandbox/icdar_13_table/src/new.cc |   51 +++++++-----------------------
 scribo/sandbox/icdar_13_table/src/xml.cc |   31 ++++++++++++++++++
 scribo/sandbox/icdar_13_table/src/xml.hh |   24 ++++++++++++++
 4 files changed, 68 insertions(+), 40 deletions(-)
 create mode 100644 scribo/sandbox/icdar_13_table/src/xml.cc
 create mode 100644 scribo/sandbox/icdar_13_table/src/xml.hh
diff --git a/scribo/sandbox/icdar_13_table/Makefile b/scribo/sandbox/icdar_13_table/Makefile
index 8155a34..8d0cd1a 100644
--- a/scribo/sandbox/icdar_13_table/Makefile
+++ b/scribo/sandbox/icdar_13_table/Makefile
@@ -4,7 +4,7 @@ CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG
 CLIBS=-I../../../milena/ -I../../ -I/usr/include/poppler
 CLEAN=*.o output/* log final.xml
 
-SRC=src/new.cc
+SRC=src/xml.cc src/new.cc
 SRC_OLD=src/main.cc
 OUTPUT=table
 OUTPUT_OLD=old
diff --git a/scribo/sandbox/icdar_13_table/src/new.cc b/scribo/sandbox/icdar_13_table/src/new.cc
index 54b9f3b..95bf575 100644
--- a/scribo/sandbox/icdar_13_table/src/new.cc
+++ b/scribo/sandbox/icdar_13_table/src/new.cc
@@ -1,3 +1,5 @@
+#include "xml.hh"
+
 // INCLUDES OLENA
 #include <mln/binarization/all.hh>
 
@@ -83,38 +85,6 @@ void  write_image(const image2d<value::rgb8>& ima,
   ++number;
 }
 
-// Open and initialize XML
-void  start_xml(std::ofstream& xml, const char* name, const char* pdf)
-{
-  xml.open(name);
-  xml << "<?xml version\"1.0\" encoding=\"UTF-8\"?>" << std::endl
-      << "<document filename='" << pdf << "'>" << std::endl;
-}
-
-// Finalize an close XML
-void  end_xml(std::ofstream& xml)
-{
-  xml << "</document>" << std::endl;
-  xml.close();
-}
-
-// Write a new (simple) table in XML file
-void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
-{
-  static unsigned table = 0;
-  static unsigned region = 0;
-  static unsigned page = 1;
-
-  xml << "\t<table id='" << table << "'>" << std::endl
-      << "\t\t<region id='" << region << "' page='" << page << "'>" << std::endl
-      << "\t\t<bounding-box x1='" << start[1] << "' y1='" << start[0] << "' "
-      << "x2='" << end[1] << "' y2='" << end[0] << "'/>" << std::endl
-      << "\t\t</region>" << std::endl
-      << "\t</table>" << std::endl;
-
-  ++table;
-}
-
 // Draw vertical links from top to bottom (red)
 void  draw_links_tb(const scribo::object_groups< image2d<unsigned> >& groups,
                     image2d<value::rgb8>&                             ima_groups,
@@ -142,8 +112,8 @@ void  draw_links_tb(const scribo::object_groups< image2d<unsigned> >& groups,
             && (b1.pmin()[1] == b2.pmin()[1]
               || (b1.pmin()[1] < b2.pmin()[1] && b1.pmax()[1] > b2.pmin()[1])
               || (b1.pmin()[1] > b2.pmin()[1] && b2.pmax()[1] > b1.pmin()[1])) // Boxes are aligned
-            && abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
-            && abs(p1[1] - p2[1]) < 20) // Vertical proximity
+            && (unsigned) abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
+            && (unsigned) abs(p1[1] - p2[1]) < 20) // Vertical proximity
         {
           draw::line(ima_groups, p1, p2, literal::red);
           balance[i] += 1;
@@ -181,8 +151,8 @@ void  draw_links_bt(const scribo::object_groups< image2d<unsigned> >& groups,
             && (b1.pmin()[1] == b2.pmin()[1]
               || (b1.pmin()[1] < b2.pmin()[1] && b1.pmax()[1] > b2.pmin()[1])
               || (b1.pmin()[1] > b2.pmin()[1] && b2.pmax()[1] > b1.pmin()[1])) // Boxes are aligned
-            && abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
-            && abs(p1[1] - p2[1]) < 20) // Vertical proximity
+            && (unsigned) abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
+            && (unsigned) abs(p1[1] - p2[1]) < 20) // Vertical proximity
         {
           draw::line(ima_groups, p1, p2, literal::red);
           balance[i] += 1;
@@ -261,7 +231,7 @@ int main(int argc, char** argv)
   typedef value::label_16 V;
   typedef image2d<V> L;
 
-  std::ofstream xml;
+  //std::ofstream xml;
   std::ostringstream path;
   image2d<value::rgb8> original, ima_links, ima_groups, ima_valid;
   image2d<value::int_u8> filtered;
@@ -271,7 +241,8 @@ int main(int argc, char** argv)
   unsigned dpi = 72;
 
   // Loading and binarization
-  start_xml(xml, "final.xml", argv[1]);
+  //start_xml(xml, "final.xml", argv[1]);
+  XML* xml = new XML("final.xml", argv[1]);
 
   util::array< image2d<value::rgb8> > pdf;
   io::pdf::load(pdf, argv[1], dpi);
@@ -424,7 +395,9 @@ int main(int argc, char** argv)
     write_image(ima_valid, "valid", page, number, path);
   }
 
-  end_xml(xml);
+
+  //end_xml(xml);
+  delete xml;
 
   return 0;
 }
diff --git a/scribo/sandbox/icdar_13_table/src/xml.cc b/scribo/sandbox/icdar_13_table/src/xml.cc
new file mode 100644
index 0000000..76fed84
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/src/xml.cc
@@ -0,0 +1,31 @@
+#include "xml.hh"
+
+XML::XML(const char* name, const char* pdf)
+  : _name(name), _pdf(pdf)
+{
+  _xml.open(_name);
+  _xml << "<?xml version\"1.0\" encoding=\"UTF-8\"?>" << std::endl
+    << "<document filename='" << _pdf << "'>" << std::endl;
+}
+
+XML::~XML()
+{
+  _xml << "</document>" << std::endl;
+  _xml.close();
+}
+
+void  XML::write_table(const point2d& start, const point2d& end)
+{
+  static unsigned table = 0;
+  static unsigned region = 0;
+  static unsigned page = 1;
+
+  _xml << "\t<table id='" << table << "'>" << std::endl
+    << "\t\t<region id='" << region << "' page='" << page << "'>" << std::endl
+    << "\t\t<bounding-box x1='" << start[1] << "' y1='" << start[0] << "' "
+    << "x2='" << end[1] << "' y2='" << end[0] << "'/>" << std::endl
+    << "\t\t</region>" << std::endl
+    << "\t</table>" << std::endl;
+
+  ++table;
+}
diff --git a/scribo/sandbox/icdar_13_table/src/xml.hh b/scribo/sandbox/icdar_13_table/src/xml.hh
new file mode 100644
index 0000000..397d585
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/src/xml.hh
@@ -0,0 +1,24 @@
+#ifndef XML_HH
+# define XML_HH
+# define MLN_WO_GLOBAL_VARS
+
+# include <iostream>
+# include <fstream>
+# include <mln/core/alias/point2d.hh>
+
+using namespace mln;
+
+class XML
+{
+  public:
+    XML(const char* name, const char* pdf);
+    ~XML();
+    void  write_table(const point2d& start, const point2d& end);
+
+  private:
+    std::ofstream _xml;
+    const char*   _name;
+    const char*   _pdf;
+};
+
+#endif /* !XML_HH */
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/TODO       |    3 +-
 scribo/sandbox/icdar_13_table/src/new.cc |  281 ++++++++++++++++++++----------
 2 files changed, 190 insertions(+), 94 deletions(-)
diff --git a/scribo/sandbox/icdar_13_table/TODO b/scribo/sandbox/icdar_13_table/TODO
index e3c6f52..86486c9 100644
--- a/scribo/sandbox/icdar_13_table/TODO
+++ b/scribo/sandbox/icdar_13_table/TODO
@@ -4,9 +4,10 @@
 
 Table location sub-competition : 
  * Find links betwwen pages for mutlipages tables
- * Get text from reversed-video zones
  * *** glibc detected *** ./table: corrupted double-linked list
    with the file us-005.pdf from the test set
+ * 'Floating point exeption' using sauvola_ms(a, b, c) with a floating point
+   c instead of an unsigned (Z is working on it)
 
 Table structure recognition sub-competition :
  * All
diff --git a/scribo/sandbox/icdar_13_table/src/new.cc b/scribo/sandbox/icdar_13_table/src/new.cc
index aca31bb..54b9f3b 100644
--- a/scribo/sandbox/icdar_13_table/src/new.cc
+++ b/scribo/sandbox/icdar_13_table/src/new.cc
@@ -53,6 +53,36 @@
 
 using namespace mln;
 
+// Write image2d<bool> images
+void  write_image(const image2d<bool>& ima,
+                  const char*          name,
+                  const unsigned       page,
+                  unsigned&            number,
+                  std::ostringstream&  path)
+{
+  path.str("");
+  path << "output/p" << page
+       << "_" << number
+       << "_" << name << ".pbm";
+  io::pbm::save(ima, path.str());
+  ++number;
+}
+
+// Write image2d<value::rbg8> images
+void  write_image(const image2d<value::rgb8>& ima,
+                  const char*                 name,
+                  const unsigned              page,
+                  unsigned&                   number,
+                  std::ostringstream&         path)
+{
+  path.str("");
+  path << "output/p" << page
+       << "_" << number
+       << "_" << name << ".ppm";
+  io::ppm::save(ima, path.str());
+  ++number;
+}
+
 // Open and initialize XML
 void  start_xml(std::ofstream& xml, const char* name, const char* pdf)
 {
@@ -85,10 +115,147 @@ void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
   ++table;
 }
 
-                                /********/
-                                /* MAIN */
-                                /********/
+// Draw vertical links from top to bottom (red)
+void  draw_links_tb(const scribo::object_groups< image2d<unsigned> >& groups,
+                    image2d<value::rgb8>&                             ima_groups,
+                    std::vector<short>&                               balance,
+                    unsigned                                          average_width)
+{
+  for (unsigned i = 1; i <= groups.nelements(); ++i)
+  {
+    for (unsigned j = 1; j <= groups.nelements(); ++j)
+    {
+      if (i != j)
+      {
+        const box2d& b1 = groups(i).bbox();
+        const box2d& b2 = groups(j).bbox();
+        const point2d& p1 = b1.pcenter();
+        const point2d& p2 = b2.pcenter();
+
+        unsigned max_height = std::max(b1.height(), b2.height());
+        unsigned min_height = std::min(b1.height(), b2.height());
+
+        if (p1[0] < p2[0] // Avoid redundancy
+            && max_height * 2 < ima_groups.ncols()
+            && min_height + 3 >= max_height // Same heights
+            && b1.width() < 2 * average_width && b2.width() < 2 * average_width // Regular width
+            && (b1.pmin()[1] == b2.pmin()[1]
+              || (b1.pmin()[1] < b2.pmin()[1] && b1.pmax()[1] > b2.pmin()[1])
+              || (b1.pmin()[1] > b2.pmin()[1] && b2.pmax()[1] > b1.pmin()[1])) // Boxes are aligned
+            && abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
+            && abs(p1[1] - p2[1]) < 20) // Vertical proximity
+        {
+          draw::line(ima_groups, p1, p2, literal::red);
+          balance[i] += 1;
+          break;
+        }
+      }
+    }
+  }
+}
+
+// Draw vertical links from bottom to top (red)
+void  draw_links_bt(const scribo::object_groups< image2d<unsigned> >& groups,
+                    image2d<value::rgb8>&                             ima_groups,
+                    std::vector<short>&                               balance,
+                    unsigned                                          average_width)
+{
+  for (unsigned i = groups.nelements(); i > 0; --i)
+  {
+    for (unsigned j = groups.nelements(); j > 0; --j)
+    {
+      if (i != j)
+      {
+        const box2d& b1 = groups(i).bbox();
+        const box2d& b2 = groups(j).bbox();
+        const point2d& p1 = b1.pcenter();
+        const point2d& p2 = b2.pcenter();
+
+        unsigned max_height = std::max(b1.height(), b2.height());
+        unsigned min_height = std::min(b1.height(), b2.height());
+
+        if (p1[0] > p2[0] // Avoid redundancy
+            && max_height * 2 < ima_groups.ncols()
+            && min_height + 3 >= max_height // Same heights
+            && b1.width() < 2 * average_width && b2.width() < 2 * average_width // Regular width
+            && (b1.pmin()[1] == b2.pmin()[1]
+              || (b1.pmin()[1] < b2.pmin()[1] && b1.pmax()[1] > b2.pmin()[1])
+              || (b1.pmin()[1] > b2.pmin()[1] && b2.pmax()[1] > b1.pmin()[1])) // Boxes are aligned
+            && abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
+            && abs(p1[1] - p2[1]) < 20) // Vertical proximity
+        {
+          draw::line(ima_groups, p1, p2, literal::red);
+          balance[i] += 1;
+          break;
+        }
+      }
+    }
+  }
+}
+
+// Draw horizontal links from left to right (green)
+void  draw_links_lr(const scribo::object_groups< image2d<unsigned> >& groups,
+                    image2d<value::rgb8>&                             ima_groups,
+                    std::vector<short>&                               balance)
+{
+  for (unsigned i = 1; i <= groups.nelements(); ++i)
+  {
+    for (unsigned j = 1; j <= groups.nelements(); ++j)
+    {
+      if (i != j)
+      {
+        const box2d& b1 = groups(i).bbox();
+        const box2d& b2 = groups(j).bbox();
+        const point2d& p1 = b1.pcenter();
+        const point2d& p2 = b2.pcenter();
+
+        if (p1[1] < p2[1] // Avoid redundancy
+            && (b1.pmin()[0] == b2.pmin()[0]
+              || (b1.pmin()[0] < b2.pmin()[0] && b1.pmax()[0] > b2.pmin()[0]) 
+              || (b1.pmin()[0] > b2.pmin()[0] && b2.pmax()[0] > b1.pmin()[0])) // Boxes are aligned
+            && abs(p1[0] - p2[0]) < 10) // Reduced gap
+        {
+          draw::line(ima_groups, p1, p2, literal::green);
+          balance[i] += 1;
+          break;
+        }
+      }
+    }
+  }
+}
+
+// Draw horizontal links from right to left (green)
+void  draw_links_rl(const scribo::object_groups< image2d<unsigned> >& groups,
+                    image2d<value::rgb8>&                             ima_groups,
+                    std::vector<short>&                               balance)
+{
+  for (unsigned i = groups.nelements(); i > 0; --i)
+  {
+    for (unsigned j = groups.nelements(); j > 0; --j)
+    {
+      if (i != j)
+      {
+        const box2d& b1 = groups(i).bbox();
+        const box2d& b2 = groups(j).bbox();
+        const point2d& p1 = b1.pcenter();
+        const point2d& p2 = b2.pcenter();
+
+        if (p1[1] > p2[1] // Avoid redundancy
+            && (b1.pmin()[0] == b2.pmin()[0]
+              || (b1.pmin()[0] < b2.pmin()[0] && b1.pmax()[0] > b2.pmin()[0]) 
+              || (b1.pmin()[0] > b2.pmin()[0] && b2.pmax()[0] > b1.pmin()[0])) // Boxes are aligned
+            && abs(p1[0] - p2[0]) < 10) // Reduced gap
+        {
+          draw::line(ima_groups, p1, p2, literal::green);
+          balance[i] += 1;
+          break;
+        }
+      }
+    }
+  }
+}
 
+/******************************** MAIN ****************************************/
 int main(int argc, char** argv)
 {
   typedef value::label_16 V;
@@ -108,6 +275,7 @@ int main(int argc, char** argv)
 
   util::array< image2d<value::rgb8> > pdf;
   io::pdf::load(pdf, argv[1], dpi);
+
   for (unsigned page = 0; page < pdf.nelements(); ++page)
   {
     original = pdf[page];
@@ -219,66 +387,11 @@ int main(int argc, char** argv)
 
     std::vector<short> balance(groups.nelements(), 0);
 
-    // Draw vertical links (red)
-    for (unsigned i = 1; i < groups.nelements(); ++i)
-    {
-      for (unsigned j = 1; j < groups.nelements(); ++j)
-      {
-        if (i != j)
-        {
-          const box2d& b1 = groups(i).bbox();
-          const box2d& b2 = groups(j).bbox();
-          const point2d& p1 = b1.pcenter();
-          const point2d& p2 = b2.pcenter();
-
-          unsigned max_height = std::max(b1.height(), b2.height());
-          unsigned min_height = std::min(b1.height(), b2.height());
-
-          if (p1[0] < p2[0] // Avoid redundancy
-              && max_height * 2 < bin_merged.ncols()
-              && min_height + 3 >= max_height // Same heights
-              && b1.width() < 2 * average_width && b2.width() < 2 * average_width // Regular width
-              && (b1.pmin()[1] == b2.pmin()[1]
-                || (b1.pmin()[1] < b2.pmin()[1] && b1.pmax()[1] > b2.pmin()[1])
-                || (b1.pmin()[1] > b2.pmin()[1] && b2.pmax()[1] > b1.pmin()[1])) // Boxes are aligned
-             && abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
-             && abs(p1[1] - p2[1]) < 20) // Vertical proximity
-          {
-            draw::line(ima_groups, p1, p2, literal::red);
-            balance[i] += 1;
-            balance[j] += 1;
-            break;
-          }
-        }
-      }
-    }
-
-    // Draw horizontal links (green)
-    for (unsigned i = 1; i < groups.nelements(); ++i)
-    {
-      for (unsigned j = 1; j < groups.nelements(); ++j)
-      {
-        if (i != j)
-        {
-          const box2d& b1 = groups(i).bbox();
-          const box2d& b2 = groups(j).bbox();
-          const point2d& p1 = b1.pcenter();
-          const point2d& p2 = b2.pcenter();
-
-          if (p1[1] < p2[1] // Avoid redundancy
-              && (b1.pmin()[0] == b2.pmin()[0]
-                || (b1.pmin()[0] < b2.pmin()[0] && b1.pmax()[0] > b2.pmin()[0]) 
-                || (b1.pmin()[0] > b2.pmin()[0] && b2.pmax()[0] > b1.pmin()[0])) // Boxes are aligned
-              && abs(p1[0] - p2[0]) < 10) // Reduced gap
-          {
-            draw::line(ima_groups, p1, p2, literal::green);
-            balance[i] += 1;
-            balance[j] += 1;
-            break;
-          }
-        }
-      }
-    }
+    // Draw and count links
+    draw_links_tb(groups, ima_groups, balance, average_width);
+    draw_links_bt(groups, ima_groups, balance, average_width);
+    draw_links_lr(groups, ima_groups, balance);
+    draw_links_rl(groups, ima_groups, balance);
 
     // Draw weighted boxes (red < orange < cyan < green) (useless ?)
     for (unsigned i = 0; i < balance.size(); ++i)
@@ -297,36 +410,18 @@ int main(int argc, char** argv)
     }
 
     // Write images and close XML
-    // FIXME To externalize
-    path.str(""); path << "output/p" << page << "_0_bin.pbm";
-    io::pbm::save(bin, path.str());
-
-    path.str(""); path << "output/p" << page << "_1_bin_without_separators.pbm";
-    io::pbm::save(bin_without_separators, path.str());
-
-    path.str(""); path << "output/p" << page << "_2_denoised.pbm";
-    io::pbm::save(denoised, path.str());
-
-    path.str(""); path << "output/p" << page << "_3_reverse.pbm";
-    io::pbm::save(reverse, path.str());
-
-    path.str(""); path << "output/p" << page << "_4_reverse_selection.pbm";
-    io::pbm::save(reverse_selection, path.str());
-
-    path.str(""); path << "output/p" << page << "_5_bin_merged.pbm";
-    io::pbm::save(bin_merged, path.str());
-
-    path.str(""); path << "output/p" << page << "_6_components.pbm";
-    io::pbm::save(comp, path.str());
-
-    path.str(""); path << "output/p" << page << "_7_links.ppm";
-    io::ppm::save(ima_links, path.str());
-
-    path.str(""); path << "output/p" << page << "_8_groups.ppm";
-    io::ppm::save(ima_groups, path.str());
-
-    path.str(""); path << "output/p" << page << "_9_valid.ppm";
-    io::ppm::save(ima_valid, path.str());
+    unsigned number = 0;
+
+    write_image(bin, "bin", page, number, path);
+    write_image(bin_without_separators, "bin_without_separators", page, number, path);
+    write_image(denoised, "denoised", page, number, path);
+    write_image(reverse, "reverse", page, number, path);
+    write_image(reverse_selection, "", page, number, path);
+    write_image(bin_merged, "reverse_selection", page, number, path);
+    write_image(comp, "bin_merged", page, number, path);
+    write_image(ima_links, "components", page, number, path);
+    write_image(ima_groups, "groups", page, number, path);
+    write_image(ima_valid, "valid", page, number, path);
   }
 
   end_xml(xml);
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        ---
 scribo/sandbox/icdar_13_table/Makefile   |    4 +-
 scribo/sandbox/icdar_13_table/TODO       |    2 +
 scribo/sandbox/icdar_13_table/src/new.cc |   61 ++++++++++++++++++++++--------
 3 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/scribo/sandbox/icdar_13_table/Makefile b/scribo/sandbox/icdar_13_table/Makefile
index 19743e1..8155a34 100644
--- a/scribo/sandbox/icdar_13_table/Makefile
+++ b/scribo/sandbox/icdar_13_table/Makefile
@@ -1,6 +1,6 @@
-CCACHE=
+CCACHE=ccache
 CC=g++
-CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG -g
+CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG
 CLIBS=-I../../../milena/ -I../../ -I/usr/include/poppler
 CLEAN=*.o output/* log final.xml
 
diff --git a/scribo/sandbox/icdar_13_table/TODO b/scribo/sandbox/icdar_13_table/TODO
index a4aa631..e3c6f52 100644
--- a/scribo/sandbox/icdar_13_table/TODO
+++ b/scribo/sandbox/icdar_13_table/TODO
@@ -5,6 +5,8 @@
 Table location sub-competition : 
  * Find links betwwen pages for mutlipages tables
  * Get text from reversed-video zones
+ * *** glibc detected *** ./table: corrupted double-linked list
+   with the file us-005.pdf from the test set
 
 Table structure recognition sub-competition :
  * All
diff --git a/scribo/sandbox/icdar_13_table/src/new.cc b/scribo/sandbox/icdar_13_table/src/new.cc
index 714d0c2..aca31bb 100644
--- a/scribo/sandbox/icdar_13_table/src/new.cc
+++ b/scribo/sandbox/icdar_13_table/src/new.cc
@@ -98,8 +98,8 @@ int main(int argc, char** argv)
   std::ostringstream path;
   image2d<value::rgb8> original, ima_links, ima_groups, ima_valid;
   image2d<value::int_u8> filtered;
-  image2d<bool> bin, separators, bin_without_separators, whitespaces, comp, denoised;
-  scribo::component_set< image2d<unsigned> > components;
+  image2d<bool> bin, reverse, reverse_selection, bin_merged, separators, bin_without_separators, whitespaces, comp, denoised;
+  scribo::component_set< image2d<unsigned> > components, rcomponents;
 
   unsigned dpi = 72;
 
@@ -114,6 +114,25 @@ int main(int argc, char** argv)
     filtered = data::transform(original, fun::v2v::rgb_to_luma<value::int_u8>());
     bin = scribo::binarization::sauvola(filtered, 81, 0.44);
 
+    // Reverse selection
+    reverse = logical::not_(bin);
+    initialize(reverse_selection, reverse);
+    data::fill(reverse_selection, false);
+
+    unsigned nrcomponents;
+    rcomponents = scribo::primitive::extract::components(reverse, c8(), nrcomponents);
+
+    for (unsigned i = 1; i < rcomponents.nelements(); ++i)
+    {
+      const box2d& b = rcomponents(i).bbox();
+
+      if (b.height() < 20 && b.width() < 20)
+        data::fill((reverse_selection | b).rw(), true);
+    }
+
+    reverse_selection = logical::and_(reverse, reverse_selection);
+    reverse_selection = scribo::preprocessing::denoise_fg(reverse_selection, c8(), 4);
+
     // Find separators
     bin_without_separators = duplicate(bin);
     separators = separators;
@@ -131,11 +150,14 @@ int main(int argc, char** argv)
     // Denoise
     denoised = scribo::preprocessing::denoise_fg(bin_without_separators, c8(), 4);
 
+    // Bin merged
+    bin_merged = logical::or_(denoised, reverse_selection);
+
     // Extract components
     unsigned ncomponents;
-    components = scribo::primitive::extract::components(denoised, c8(), ncomponents);
+    components = scribo::primitive::extract::components(bin_merged, c8(), ncomponents);
 
-    initialize(comp, denoised);
+    initialize(comp, bin_merged);
     data::fill(comp, false);
     for (unsigned i = 1; i <= components.nelements(); ++i)
     {
@@ -158,9 +180,9 @@ int main(int argc, char** argv)
     // Filter links
     scribo::object_links< image2d<unsigned> > hratio_filtered_links = scribo::filter::object_links_bbox_h_ratio(merged_links, 2.5f);
 
-    ima_links = data::convert(value::rgb8(), denoised);
-    ima_groups = data::convert(value::rgb8(), denoised);
-    ima_valid = data::convert(value::rgb8(), denoised);
+    ima_links = data::convert(value::rgb8(), bin_merged);
+    ima_groups = data::convert(value::rgb8(), bin_merged);
+    ima_valid = data::convert(value::rgb8(), bin_merged);
 
     // Write links
     for (unsigned l = 1; l < merged_links.nelements(); ++l)
@@ -213,7 +235,7 @@ int main(int argc, char** argv)
           unsigned min_height = std::min(b1.height(), b2.height());
 
           if (p1[0] < p2[0] // Avoid redundancy
-              && max_height * 2 < denoised.ncols()
+              && max_height * 2 < bin_merged.ncols()
               && min_height + 3 >= max_height // Same heights
               && b1.width() < 2 * average_width && b2.width() < 2 * average_width // Regular width
               && (b1.pmin()[1] == b2.pmin()[1]
@@ -258,10 +280,9 @@ int main(int argc, char** argv)
       }
     }
 
-    // Draw weighted boxes (red < orange < cyan < green)
+    // Draw weighted boxes (red < orange < cyan < green) (useless ?)
     for (unsigned i = 0; i < balance.size(); ++i)
     {
-      std::cout << balance[i] << " ";
       if (balance[i] == 1)
         draw::box(ima_valid, groups(i).bbox(), literal::red);
 
@@ -274,10 +295,9 @@ int main(int argc, char** argv)
       if (balance[i] > 3)
         draw::box(ima_valid, groups(i).bbox(), literal::green);
     }
-    std::cout << std::endl << std::endl;
-
 
     // Write images and close XML
+    // FIXME To externalize
     path.str(""); path << "output/p" << page << "_0_bin.pbm";
     io::pbm::save(bin, path.str());
 
@@ -287,16 +307,25 @@ int main(int argc, char** argv)
     path.str(""); path << "output/p" << page << "_2_denoised.pbm";
     io::pbm::save(denoised, path.str());
 
-    path.str(""); path << "output/p" << page << "_3_components.pbm";
+    path.str(""); path << "output/p" << page << "_3_reverse.pbm";
+    io::pbm::save(reverse, path.str());
+
+    path.str(""); path << "output/p" << page << "_4_reverse_selection.pbm";
+    io::pbm::save(reverse_selection, path.str());
+
+    path.str(""); path << "output/p" << page << "_5_bin_merged.pbm";
+    io::pbm::save(bin_merged, path.str());
+
+    path.str(""); path << "output/p" << page << "_6_components.pbm";
     io::pbm::save(comp, path.str());
 
-    path.str(""); path << "output/p" << page << "_4_links.ppm";
+    path.str(""); path << "output/p" << page << "_7_links.ppm";
     io::ppm::save(ima_links, path.str());
 
-    path.str(""); path << "output/p" << page << "_5_groups.ppm";
+    path.str(""); path << "output/p" << page << "_8_groups.ppm";
     io::ppm::save(ima_groups, path.str());
 
-    path.str(""); path << "output/p" << page << "_6_valid.ppm";
+    path.str(""); path << "output/p" << page << "_9_valid.ppm";
     io::ppm::save(ima_valid, path.str());
   }
 
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            olena: olena-2.0-558-gbc90889 [ICDAR_13] New	processing (scribo toolchain-like) started
                        
                        
by Anthony Seure 11 Jun '13
                    by Anthony Seure 11 Jun '13
11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/Makefile      |    9 +-
 scribo/sandbox/icdar_13_table/README_ROLAND |   18 +++
 scribo/sandbox/icdar_13_table/TODO          |    2 -
 scribo/sandbox/icdar_13_table/src/new.cc    |  208 +++++++++++++++++++++++---
 4 files changed, 209 insertions(+), 28 deletions(-)
 create mode 100644 scribo/sandbox/icdar_13_table/README_ROLAND
diff --git a/scribo/sandbox/icdar_13_table/Makefile b/scribo/sandbox/icdar_13_table/Makefile
index b9600a4..19743e1 100644
--- a/scribo/sandbox/icdar_13_table/Makefile
+++ b/scribo/sandbox/icdar_13_table/Makefile
@@ -1,21 +1,26 @@
 CCACHE=
 CC=g++
-CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG
+CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG -g
 CLIBS=-I../../../milena/ -I../../ -I/usr/include/poppler
 CLEAN=*.o output/* log final.xml
 
 SRC=src/new.cc
+SRC_OLD=src/main.cc
 OUTPUT=table
+OUTPUT_OLD=old
 
 all: table
 
 table:
 	$(CCACHE) $(CC) $(CFLAGS) $(CLIBS) $(SRC) -ltesseract -lpoppler-cpp -o $(OUTPUT)
 
+old:
+	$(CCACHE) $(CC) $(CFLAGS) $(CLIBS) $(SRC_OLD) -ltesseract -lpoppler-cpp -o $(OUTPUT_OLD)
+
 clean:
 	rm -rf $(CLEAN)
 
 mrproper: clean
-	rm -f $(OUTPUT)
+	rm -f $(OUTPUT) $(OUTPUT_OLD)
 
 .PHONY: table clean mrproper
diff --git a/scribo/sandbox/icdar_13_table/README_ROLAND b/scribo/sandbox/icdar_13_table/README_ROLAND
new file mode 100644
index 0000000..89b70dc
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/README_ROLAND
@@ -0,0 +1,18 @@
+#------------------------------------------------------------------------------#
+                  README - ICDAR 2013 - Table competition
+#------------------------------------------------------------------------------#
+
+FIRST OF ALL :
+ * mkdir output
+
+Compilation and cleaning :
+ * make (generates the main program)
+ * make old (generates the old program (without scribo toolchain))
+ * make clean (remove all files expect the binary)
+ * make mrproper (remove all files)
+
+Usage :
+ * ./table [your-pdf-file]
+   Generate debug images in the output/ directory and the final.xml
+ * ./old [your-pdf-file]
+   Same thing but old processing (without scribo toolchain)
diff --git a/scribo/sandbox/icdar_13_table/TODO b/scribo/sandbox/icdar_13_table/TODO
index b34e7a2..a4aa631 100644
--- a/scribo/sandbox/icdar_13_table/TODO
+++ b/scribo/sandbox/icdar_13_table/TODO
@@ -3,10 +3,8 @@
 #------------------------------------------------------------------------------#
 
 Table location sub-competition : 
- * Load PDF files (instead of PNM)
  * Find links betwwen pages for mutlipages tables
  * Get text from reversed-video zones
- * Expand the process to borderless tables
 
 Table structure recognition sub-competition :
  * All
diff --git a/scribo/sandbox/icdar_13_table/src/new.cc b/scribo/sandbox/icdar_13_table/src/new.cc
index 963aa7d..714d0c2 100644
--- a/scribo/sandbox/icdar_13_table/src/new.cc
+++ b/scribo/sandbox/icdar_13_table/src/new.cc
@@ -1,9 +1,10 @@
+// INCLUDES OLENA
 #include <mln/binarization/all.hh>
 
 #include <mln/core/image/image2d.hh>
 
 #include <mln/data/all.hh>
-#include <mln/draw/line.hh>
+#include <mln/draw/all.hh>
 
 #include <mln/fun/v2v/rgb_to_luma.hh>
 
@@ -14,25 +15,45 @@
 #include <mln/labeling/all.hh>
 #include <mln/literal/all.hh>
 #include <mln/logical/and.hh>
+#include <mln/logical/not.hh>
 
 #include <mln/value/all.hh>
 
+// INCLUDE TESSERACT
 #include <tesseract/baseapi.h>
 
+// INCLUDES SCRIBO
 #include <scribo/binarization/sauvola.hh>
+
 #include <scribo/core/component_set.hh>
+#include <scribo/core/line_set.hh>
+#include <scribo/core/paragraph_set.hh>
+
+#include <scribo/debug/links_image.hh>
+#include <scribo/draw/groups_bboxes.hh>
+#include <scribo/draw/line_components.hh>
+
+#include <scribo/filter/object_links_bbox_h_ratio.hh>
+
 #include <scribo/preprocessing/denoise_fg.hh>
-#include <scribo/primitive/extract/vertical_separators.hh>
-#include <scribo/primitive/remove/separators.hh>
+#include <scribo/primitive/extract/lines_h_discontinued.hh>
+#include <scribo/primitive/extract/lines_v_discontinued.hh>
 #include <scribo/primitive/extract/separators_nonvisible.hh>
-
+#include <scribo/primitive/extract/vertical_separators.hh>
+#include <scribo/primitive/group/from_single_link.hh>
+#include <scribo/primitive/link/internal/compute_anchor.hh>
 #include <scribo/primitive/link/internal/dmax_width_and_height.hh>
-#include <scribo/primitive/link/with_single_right_link_dmax_ratio.hh>
-#include <scribo/primitive/link/with_single_left_link_dmax_ratio.hh>
 #include <scribo/primitive/link/merge_double_link.hh>
+#include <scribo/primitive/link/with_single_left_link_dmax_ratio.hh>
+#include <scribo/primitive/link/with_single_right_link_dmax_ratio.hh>
+#include <scribo/primitive/remove/separators.hh>
+
+#include <scribo/text/extract_paragraphs.hh>
+#include <scribo/text/merging.hh>
 
 using namespace mln;
 
+// Open and initialize XML
 void  start_xml(std::ofstream& xml, const char* name, const char* pdf)
 {
   xml.open(name);
@@ -40,12 +61,14 @@ void  start_xml(std::ofstream& xml, const char* name, const char* pdf)
       << "<document filename='" << pdf << "'>" << std::endl;
 }
 
+// Finalize an close XML
 void  end_xml(std::ofstream& xml)
 {
   xml << "</document>" << std::endl;
   xml.close();
 }
 
+// Write a new (simple) table in XML file
 void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
 {
   static unsigned table = 0;
@@ -62,6 +85,10 @@ void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
   ++table;
 }
 
+                                /********/
+                                /* MAIN */
+                                /********/
+
 int main(int argc, char** argv)
 {
   typedef value::label_16 V;
@@ -69,10 +96,9 @@ int main(int argc, char** argv)
 
   std::ofstream xml;
   std::ostringstream path;
-  image2d<value::rgb8> original;
+  image2d<value::rgb8> original, ima_links, ima_groups, ima_valid;
   image2d<value::int_u8> filtered;
-  image2d<bool> bin, separators, bin_without_separators, whitespaces,
-                denoised, comp, links;
+  image2d<bool> bin, separators, bin_without_separators, whitespaces, comp, denoised;
   scribo::component_set< image2d<unsigned> > components;
 
   unsigned dpi = 72;
@@ -89,9 +115,18 @@ int main(int argc, char** argv)
     bin = scribo::binarization::sauvola(filtered, 81, 0.44);
 
     // Find separators
-    separators = scribo::primitive::extract::vertical_separators(bin, 81);
-    bin_without_separators = scribo::primitive::remove::separators(bin, separators);
-    whitespaces = scribo::primitive::extract::separators_nonvisible(bin);
+    bin_without_separators = duplicate(bin);
+    separators = separators;
+    V nhlines, nvlines;
+    unsigned min_width = 31;
+    unsigned min_height = 71;
+    scribo::component_set<L> hlines =  scribo::primitive::extract::lines_h_discontinued(bin_without_separators, c4(), nhlines, min_width, 2);
+    scribo::component_set<L> vlines =  scribo::primitive::extract::lines_v_discontinued(bin_without_separators, c4(), nvlines, min_height, 2);
+    for (unsigned i = 1; i <= hlines.nelements(); ++i)
+      data::fill((bin_without_separators | hlines(i).bbox()).rw(), false);
+
+    for (unsigned i = 1; i <= vlines.nelements(); ++i)
+      data::fill((bin_without_separators | vlines(i).bbox()).rw(), false);
 
     // Denoise
     denoised = scribo::preprocessing::denoise_fg(bin_without_separators, c8(), 4);
@@ -103,8 +138,13 @@ int main(int argc, char** argv)
     initialize(comp, denoised);
     data::fill(comp, false);
     for (unsigned i = 1; i <= components.nelements(); ++i)
-      data::fill((comp | components(i).bbox()).rw(), true);
+    {
+      const box2d& b = components(i).bbox();
+      if (b.width() > 2 && b.height() > 2)
+        data::fill((comp | b).rw(), true);
+    }
 
+    // Find links
     scribo::object_links< image2d<unsigned> > right_link = scribo::primitive::link::with_single_right_link_dmax_ratio(components,
         scribo::primitive::link::internal::dmax_width_and_height(1),
         scribo::anchor::MassCenter);
@@ -115,10 +155,127 @@ int main(int argc, char** argv)
 
     scribo::object_links< image2d<unsigned> > merged_links = scribo::primitive::link::merge_double_link(left_link, right_link);
 
-    initialize(links, denoised);
-    data::fill(links, false);
-    for (unsigned i = 1; i <= merged_links.components().nelements(); ++i)
-      data::fill((links | merged_links.components()(i).bbox()).rw(), true);
+    // Filter links
+    scribo::object_links< image2d<unsigned> > hratio_filtered_links = scribo::filter::object_links_bbox_h_ratio(merged_links, 2.5f);
+
+    ima_links = data::convert(value::rgb8(), denoised);
+    ima_groups = data::convert(value::rgb8(), denoised);
+    ima_valid = data::convert(value::rgb8(), denoised);
+
+    // Write links
+    for (unsigned l = 1; l < merged_links.nelements(); ++l)
+    {
+      point2d p1 = scribo::primitive::link::internal::compute_anchor(merged_links.components(), l, scribo::anchor::MassCenter);
+      point2d p2 = scribo::primitive::link::internal::compute_anchor(merged_links.components(), merged_links(l), scribo::anchor::MassCenter);
+
+      draw::line(ima_links, p1, p2, literal::red);
+    }
+
+    for (unsigned l = 1; l < hratio_filtered_links.nelements(); ++l)
+    {
+      point2d p1 = scribo::primitive::link::internal::compute_anchor(hratio_filtered_links.components(), l, scribo::anchor::MassCenter);
+      point2d p2 = scribo::primitive::link::internal::compute_anchor(hratio_filtered_links.components(), hratio_filtered_links(l), scribo::anchor::MassCenter);
+
+      draw::line(ima_links, p1, p2, literal::blue);
+    }
+
+    // Group components
+    scribo::object_groups< image2d<unsigned> > groups = scribo::primitive::group::from_single_link(hratio_filtered_links);
+    scribo::draw::groups_bboxes(ima_groups, groups, literal::blue);
+
+    // Compute averages
+    unsigned average_height = 0;
+    unsigned average_width = 0;
+
+    for (unsigned i = 1; i < groups.nelements(); ++i)
+    {
+      average_height += groups(i).bbox().height();
+      average_width += groups(i).bbox().width();
+    }
+    average_height /= groups.nelements();
+    average_width /= groups.nelements();
+
+    std::vector<short> balance(groups.nelements(), 0);
+
+    // Draw vertical links (red)
+    for (unsigned i = 1; i < groups.nelements(); ++i)
+    {
+      for (unsigned j = 1; j < groups.nelements(); ++j)
+      {
+        if (i != j)
+        {
+          const box2d& b1 = groups(i).bbox();
+          const box2d& b2 = groups(j).bbox();
+          const point2d& p1 = b1.pcenter();
+          const point2d& p2 = b2.pcenter();
+
+          unsigned max_height = std::max(b1.height(), b2.height());
+          unsigned min_height = std::min(b1.height(), b2.height());
+
+          if (p1[0] < p2[0] // Avoid redundancy
+              && max_height * 2 < denoised.ncols()
+              && min_height + 3 >= max_height // Same heights
+              && b1.width() < 2 * average_width && b2.width() < 2 * average_width // Regular width
+              && (b1.pmin()[1] == b2.pmin()[1]
+                || (b1.pmin()[1] < b2.pmin()[1] && b1.pmax()[1] > b2.pmin()[1])
+                || (b1.pmin()[1] > b2.pmin()[1] && b2.pmax()[1] > b1.pmin()[1])) // Boxes are aligned
+             && abs(p1[0] - p2[0]) < 3 * max_height // Reduced gap
+             && abs(p1[1] - p2[1]) < 20) // Vertical proximity
+          {
+            draw::line(ima_groups, p1, p2, literal::red);
+            balance[i] += 1;
+            balance[j] += 1;
+            break;
+          }
+        }
+      }
+    }
+
+    // Draw horizontal links (green)
+    for (unsigned i = 1; i < groups.nelements(); ++i)
+    {
+      for (unsigned j = 1; j < groups.nelements(); ++j)
+      {
+        if (i != j)
+        {
+          const box2d& b1 = groups(i).bbox();
+          const box2d& b2 = groups(j).bbox();
+          const point2d& p1 = b1.pcenter();
+          const point2d& p2 = b2.pcenter();
+
+          if (p1[1] < p2[1] // Avoid redundancy
+              && (b1.pmin()[0] == b2.pmin()[0]
+                || (b1.pmin()[0] < b2.pmin()[0] && b1.pmax()[0] > b2.pmin()[0]) 
+                || (b1.pmin()[0] > b2.pmin()[0] && b2.pmax()[0] > b1.pmin()[0])) // Boxes are aligned
+              && abs(p1[0] - p2[0]) < 10) // Reduced gap
+          {
+            draw::line(ima_groups, p1, p2, literal::green);
+            balance[i] += 1;
+            balance[j] += 1;
+            break;
+          }
+        }
+      }
+    }
+
+    // Draw weighted boxes (red < orange < cyan < green)
+    for (unsigned i = 0; i < balance.size(); ++i)
+    {
+      std::cout << balance[i] << " ";
+      if (balance[i] == 1)
+        draw::box(ima_valid, groups(i).bbox(), literal::red);
+
+      if (balance[i] == 2)
+        draw::box(ima_valid, groups(i).bbox(), literal::orange);
+
+      if (balance[i] == 3)
+        draw::box(ima_valid, groups(i).bbox(), literal::cyan);
+
+      if (balance[i] > 3)
+        draw::box(ima_valid, groups(i).bbox(), literal::green);
+    }
+    std::cout << std::endl << std::endl;
+
 
     // Write images and close XML
     path.str(""); path << "output/p" << page << "_0_bin.pbm";
@@ -127,17 +284,20 @@ int main(int argc, char** argv)
     path.str(""); path << "output/p" << page << "_1_bin_without_separators.pbm";
     io::pbm::save(bin_without_separators, path.str());
 
-    path.str(""); path << "output/p" << page << "_2_whitespaces.pbm";
-    io::pbm::save(whitespaces, path.str());
-
-    path.str(""); path << "output/p" << page << "_3_denoised.pbm";
+    path.str(""); path << "output/p" << page << "_2_denoised.pbm";
     io::pbm::save(denoised, path.str());
 
-    path.str(""); path << "output/p" << page << "_4_components.pbm";
+    path.str(""); path << "output/p" << page << "_3_components.pbm";
     io::pbm::save(comp, path.str());
 
-    path.str(""); path << "output/p" << page << "_5_links.pbm";
-    io::pbm::save(links, path.str());
+    path.str(""); path << "output/p" << page << "_4_links.ppm";
+    io::ppm::save(ima_links, path.str());
+
+    path.str(""); path << "output/p" << page << "_5_groups.ppm";
+    io::ppm::save(ima_groups, path.str());
+
+    path.str(""); path << "output/p" << page << "_6_valid.ppm";
+    io::ppm::save(ima_valid, path.str());
   }
 
   end_xml(xml);
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            olena: olena-2.0-557-gfc13ccd Start new toolchain	(scribo toolchain inspired)
                        
                        
by Anthony Seure 11 Jun '13
                    by Anthony Seure 11 Jun '13
11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/Makefile   |    2 +-
 scribo/sandbox/icdar_13_table/src/new.cc |  146 ++++++++++++++++++++++++++++++
 2 files changed, 147 insertions(+), 1 deletions(-)
 create mode 100644 scribo/sandbox/icdar_13_table/src/new.cc
diff --git a/scribo/sandbox/icdar_13_table/Makefile b/scribo/sandbox/icdar_13_table/Makefile
index 4e552dd..b9600a4 100644
--- a/scribo/sandbox/icdar_13_table/Makefile
+++ b/scribo/sandbox/icdar_13_table/Makefile
@@ -4,7 +4,7 @@ CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG
 CLIBS=-I../../../milena/ -I../../ -I/usr/include/poppler
 CLEAN=*.o output/* log final.xml
 
-SRC=src/main.cc
+SRC=src/new.cc
 OUTPUT=table
 
 all: table
diff --git a/scribo/sandbox/icdar_13_table/src/new.cc b/scribo/sandbox/icdar_13_table/src/new.cc
new file mode 100644
index 0000000..963aa7d
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/src/new.cc
@@ -0,0 +1,146 @@
+#include <mln/binarization/all.hh>
+
+#include <mln/core/image/image2d.hh>
+
+#include <mln/data/all.hh>
+#include <mln/draw/line.hh>
+
+#include <mln/fun/v2v/rgb_to_luma.hh>
+
+#include <mln/io/pbm/all.hh>
+#include <mln/io/pdf/load.hh>
+#include <mln/io/ppm/all.hh>
+
+#include <mln/labeling/all.hh>
+#include <mln/literal/all.hh>
+#include <mln/logical/and.hh>
+
+#include <mln/value/all.hh>
+
+#include <tesseract/baseapi.h>
+
+#include <scribo/binarization/sauvola.hh>
+#include <scribo/core/component_set.hh>
+#include <scribo/preprocessing/denoise_fg.hh>
+#include <scribo/primitive/extract/vertical_separators.hh>
+#include <scribo/primitive/remove/separators.hh>
+#include <scribo/primitive/extract/separators_nonvisible.hh>
+
+#include <scribo/primitive/link/internal/dmax_width_and_height.hh>
+#include <scribo/primitive/link/with_single_right_link_dmax_ratio.hh>
+#include <scribo/primitive/link/with_single_left_link_dmax_ratio.hh>
+#include <scribo/primitive/link/merge_double_link.hh>
+
+using namespace mln;
+
+void  start_xml(std::ofstream& xml, const char* name, const char* pdf)
+{
+  xml.open(name);
+  xml << "<?xml version\"1.0\" encoding=\"UTF-8\"?>" << std::endl
+      << "<document filename='" << pdf << "'>" << std::endl;
+}
+
+void  end_xml(std::ofstream& xml)
+{
+  xml << "</document>" << std::endl;
+  xml.close();
+}
+
+void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
+{
+  static unsigned table = 0;
+  static unsigned region = 0;
+  static unsigned page = 1;
+
+  xml << "\t<table id='" << table << "'>" << std::endl
+      << "\t\t<region id='" << region << "' page='" << page << "'>" << std::endl
+      << "\t\t<bounding-box x1='" << start[1] << "' y1='" << start[0] << "' "
+      << "x2='" << end[1] << "' y2='" << end[0] << "'/>" << std::endl
+      << "\t\t</region>" << std::endl
+      << "\t</table>" << std::endl;
+
+  ++table;
+}
+
+int main(int argc, char** argv)
+{
+  typedef value::label_16 V;
+  typedef image2d<V> L;
+
+  std::ofstream xml;
+  std::ostringstream path;
+  image2d<value::rgb8> original;
+  image2d<value::int_u8> filtered;
+  image2d<bool> bin, separators, bin_without_separators, whitespaces,
+                denoised, comp, links;
+  scribo::component_set< image2d<unsigned> > components;
+
+  unsigned dpi = 72;
+
+  // Loading and binarization
+  start_xml(xml, "final.xml", argv[1]);
+
+  util::array< image2d<value::rgb8> > pdf;
+  io::pdf::load(pdf, argv[1], dpi);
+  for (unsigned page = 0; page < pdf.nelements(); ++page)
+  {
+    original = pdf[page];
+    filtered = data::transform(original, fun::v2v::rgb_to_luma<value::int_u8>());
+    bin = scribo::binarization::sauvola(filtered, 81, 0.44);
+
+    // Find separators
+    separators = scribo::primitive::extract::vertical_separators(bin, 81);
+    bin_without_separators = scribo::primitive::remove::separators(bin, separators);
+    whitespaces = scribo::primitive::extract::separators_nonvisible(bin);
+
+    // Denoise
+    denoised = scribo::preprocessing::denoise_fg(bin_without_separators, c8(), 4);
+
+    // Extract components
+    unsigned ncomponents;
+    components = scribo::primitive::extract::components(denoised, c8(), ncomponents);
+
+    initialize(comp, denoised);
+    data::fill(comp, false);
+    for (unsigned i = 1; i <= components.nelements(); ++i)
+      data::fill((comp | components(i).bbox()).rw(), true);
+
+    scribo::object_links< image2d<unsigned> > right_link = scribo::primitive::link::with_single_right_link_dmax_ratio(components,
+        scribo::primitive::link::internal::dmax_width_and_height(1),
+        scribo::anchor::MassCenter);
+
+    scribo::object_links< image2d<unsigned> > left_link = scribo::primitive::link::with_single_left_link_dmax_ratio(components,
+        scribo::primitive::link::internal::dmax_width_and_height(1),
+        scribo::anchor::MassCenter);
+
+    scribo::object_links< image2d<unsigned> > merged_links = scribo::primitive::link::merge_double_link(left_link, right_link);
+
+    initialize(links, denoised);
+    data::fill(links, false);
+    for (unsigned i = 1; i <= merged_links.components().nelements(); ++i)
+      data::fill((links | merged_links.components()(i).bbox()).rw(), true);
+
+    // Write images and close XML
+    path.str(""); path << "output/p" << page << "_0_bin.pbm";
+    io::pbm::save(bin, path.str());
+
+    path.str(""); path << "output/p" << page << "_1_bin_without_separators.pbm";
+    io::pbm::save(bin_without_separators, path.str());
+
+    path.str(""); path << "output/p" << page << "_2_whitespaces.pbm";
+    io::pbm::save(whitespaces, path.str());
+
+    path.str(""); path << "output/p" << page << "_3_denoised.pbm";
+    io::pbm::save(denoised, path.str());
+
+    path.str(""); path << "output/p" << page << "_4_components.pbm";
+    io::pbm::save(comp, path.str());
+
+    path.str(""); path << "output/p" << page << "_5_links.pbm";
+    io::pbm::save(links, path.str());
+  }
+
+  end_xml(xml);
+
+  return 0;
+}
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        ---
 scribo/sandbox/icdar_13_table/Makefile    |   13 ++-
 scribo/sandbox/icdar_13_table/src/main.cc |  184 +++++++++++++++++------------
 2 files changed, 114 insertions(+), 83 deletions(-)
diff --git a/scribo/sandbox/icdar_13_table/Makefile b/scribo/sandbox/icdar_13_table/Makefile
index 2420eec..4e552dd 100644
--- a/scribo/sandbox/icdar_13_table/Makefile
+++ b/scribo/sandbox/icdar_13_table/Makefile
@@ -1,8 +1,8 @@
 CCACHE=
 CC=g++
-CFLAGS=-Wall -Werror -O3
-CLIBS=-I../../../milena/ -I../../
-CLEAN=*.o $(OUTPUT) output/* log final.xml
+CFLAGS=-Wall -Werror -O3 -DHAVE_TESSERACT_3 -DNDEBUG
+CLIBS=-I../../../milena/ -I../../ -I/usr/include/poppler
+CLEAN=*.o output/* log final.xml
 
 SRC=src/main.cc
 OUTPUT=table
@@ -10,9 +10,12 @@ OUTPUT=table
 all: table
 
 table:
-	$(CCACHE) $(CC) $(CFLAGS) -DHAVE_TESSERACT_3 $(CLIBS) $(SRC) -ltesseract -o $(OUTPUT)
+	$(CCACHE) $(CC) $(CFLAGS) $(CLIBS) $(SRC) -ltesseract -lpoppler-cpp -o $(OUTPUT)
 
 clean:
 	rm -rf $(CLEAN)
 
-.PHONY: table
+mrproper: clean
+	rm -f $(OUTPUT)
+
+.PHONY: table clean mrproper
diff --git a/scribo/sandbox/icdar_13_table/src/main.cc b/scribo/sandbox/icdar_13_table/src/main.cc
index 7151b16..be394ba 100644
--- a/scribo/sandbox/icdar_13_table/src/main.cc
+++ b/scribo/sandbox/icdar_13_table/src/main.cc
@@ -8,6 +8,7 @@
 #include <mln/fun/v2v/rgb_to_luma.hh>
 
 #include <mln/io/pbm/all.hh>
+#include <mln/io/pdf/load.hh>
 #include <mln/io/ppm/all.hh>
 
 #include <mln/labeling/all.hh>
@@ -180,6 +181,10 @@ void  find_borders(image2d<bool>& ima,
   bottom = find_bottom(ima);
 }
 
+                                /********/
+                                /* MAIN */
+                                /********/
+
 int main(int argc, char** argv)
 {
   typedef value::label_16 V;
@@ -195,116 +200,139 @@ int main(int argc, char** argv)
   V nhlines, nvlines;
   L hlines_ima, vlines_ima;
   scribo::component_set<L> hlines, vlines;
+  std::ostringstream path;
 
-  // PARAMETERS
+  // Parameters
   unsigned av_height = 4;
   unsigned av_width = 4;
   int delta_prox_h = 5;
   unsigned min_height = 71;
   unsigned min_width = 31;
+  unsigned dpi = 72;
 
-  // Loadin and binarization
+  // Loading and binarization
   std::ofstream xml;
   start_xml(xml, "final.xml", argv[1]);
 
-  io::ppm::load(original, argv[1]);
-  filtered = data::transform(original, mln::fun::v2v::rgb_to_luma<value::int_u8>());
+  //io::ppm::load(original, argv[1]);
+  util::array< image2d<value::rgb8> > pdf;
+  io::pdf::load(pdf, argv[1], dpi);
+  for (unsigned page = 0; page < pdf.nelements(); ++page)
+  {
+    original = pdf[page];
+    filtered = data::transform(original, mln::fun::v2v::rgb_to_luma<value::int_u8>());
 
-  bin = scribo::binarization::sauvola(filtered, 81, 0.44);
-  final = data::convert(value::rgb8(), bin);
+    bin = scribo::binarization::sauvola(filtered, 81, 0.44);
+    final = data::convert(value::rgb8(), bin);
 
-  initialize(mask, bin);
-  initialize(ima_texts, bin);
-  initialize(ima_tables, bin);
-  data::fill(ima_tables, false);
+    initialize(mask, bin);
+    initialize(ima_texts, bin);
+    initialize(ima_tables, bin);
+    data::fill(ima_tables, false);
 
-  bin_without_lines = duplicate(bin);
+    bin_without_lines = duplicate(bin);
 
-  // Lines extraction
-  hlines = scribo::primitive::extract::lines_h_discontinued(bin, c4(), nhlines, min_width, 2);
-  vlines = scribo::primitive::extract::lines_v_discontinued(bin, c4(), nvlines, min_height, 2);
+    // Lines extraction
+    hlines = scribo::primitive::extract::lines_h_discontinued(bin, c4(), nhlines, min_width, 2);
+    vlines = scribo::primitive::extract::lines_v_discontinued(bin, c4(), nvlines, min_height, 2);
 
-  get_horizontal_lines(hlines, ima_tables, bin_without_lines, av_height);
-  get_vertical_lines(vlines, ima_tables, bin_without_lines, av_width, delta_prox_h);
+    get_horizontal_lines(hlines, ima_tables, bin_without_lines, av_height);
+    get_vertical_lines(vlines, ima_tables, bin_without_lines, av_width, delta_prox_h);
 
-  // Denoising
-  bin_without_lines_denoised = scribo::preprocessing::denoise_fg(bin_without_lines, c8(), 3);
+    // Denoising
+    bin_without_lines_denoised = scribo::preprocessing::denoise_fg(bin_without_lines, c8(), 4);
 
-  // Set the tables mask
-  unsigned n;
-  labeled = labeling::blobs(ima_tables, c8(), n);
-  masks = scribo::component_set< image2d<unsigned> >(labeled, n);
-  data::fill(mask, false);
+    // Set the tables mask
+    unsigned n;
+    labeled = labeling::blobs(ima_tables, c8(), n);
+    masks = scribo::component_set< image2d<unsigned> >(labeled, n);
+    data::fill(mask, false);
 
-  for (unsigned i = 1; i <= masks.nelements(); ++i)
-    data::fill((mask | masks(i).bbox()).rw(), true);
+    for (unsigned i = 1; i <= masks.nelements(); ++i)
+      data::fill((mask | masks(i).bbox()).rw(), true);
 
-  // Compose table zones with bin_without_lines_lines
-  ima_texts = logical::and_(bin_without_lines_denoised, mask);
+    // Compose table zones with bin_without_lines_lines
+    ima_texts = logical::and_(bin_without_lines_denoised, mask);
 
-  // Isolate texts between tables
-  for (unsigned i = 1; i <= masks.nelements(); ++i)
-  {
-    image2d<bool> table_mask, isolated_text;
-    std::ostringstream path;
-    bool empty = true;
+    // Isolate texts between tables
+    for (unsigned i = 1; i <= masks.nelements(); ++i)
+    {
+      image2d<bool> table_mask, isolated_text;
+      bool empty = true;
 
-    initialize(table_mask, bin);
-    data::fill(table_mask, false);
-    data::fill((table_mask | masks(i).bbox()).rw(), true);
+      initialize(table_mask, bin);
+      data::fill(table_mask, false);
+      data::fill((table_mask | masks(i).bbox()).rw(), true);
 
-    isolated_text = logical::and_(bin_without_lines_denoised, table_mask);
+      isolated_text = logical::and_(bin_without_lines_denoised, table_mask);
 
-    mln_piter_(image2d<bool>) p(isolated_text.domain());
+      mln_piter_(image2d<bool>) p(isolated_text.domain());
 
-    for_all(p)
-      empty = empty && !(isolated_text(p));
+      for_all(p)
+        empty = empty && !(isolated_text(p));
 
-    if (!empty)
-    {
-      path << "output/8_" << i << "_isolated.pbm";
-      io::pbm::save(isolated_text, path.str());
+      if (!empty)
+      {
+        path.str("");
+        path << "output/p" << page << "_8_" << i << "_isolated.pbm";
+        io::pbm::save(isolated_text, path.str());
 
-      // Find coordinated
-      unsigned left, right, top, bottom;
-      find_borders(isolated_text, left, right, top, bottom);
+        // Find coordinates
+        unsigned left, right, top, bottom;
+        find_borders(isolated_text, left, right, top, bottom);
 
-      std::cout << "(" << left << "," << top << ") ->"
-                << "(" << right << "," << bottom << ")" << std::endl;
+        point2d p1, p2, p3, p4;
 
-      point2d p1, p2, p3, p4;
+        p1 = point2d(top, left);
+        p2 = point2d(top, right);
+        p3 = point2d(bottom, right);
+        p4 = point2d(bottom, left);
 
-      p1 = point2d(top, left);
-      p2 = point2d(top, right);
-      p3 = point2d(bottom, right);
-      p4 = point2d(bottom, left);
+        draw::line(final, p1, p2, literal::green);
+        draw::line(final, p2, p3, literal::green);
+        draw::line(final, p3, p4, literal::green);
+        draw::line(final, p4, p1, literal::green);
 
-      draw::line(final, p1, p2, literal::red);
-      draw::line(final, p2, p3, literal::red);
-      draw::line(final, p3, p4, literal::red);
-      draw::line(final, p4, p1, literal::red);
-
-      write_table(xml, p1, p3);
+        write_table(xml, p1, p3);
+      }
     }
-  }
 
-  // Get lines images
-  hlines_ima = hlines.labeled_image();
-  vlines_ima = vlines.labeled_image();
-  ima_hlines = data::convert(bool(), hlines_ima);
-  ima_vlines = data::convert(bool(), vlines_ima);
-
-  // Write images and close XML
-  io::pbm::save(bin, "output/0_bin.pbm");
-  io::pbm::save(bin_without_lines, "output/1_bin_without_lines.pbm");
-  io::pbm::save(bin_without_lines_denoised, "output/2_bin_without_lines_denoised.pbm");
-  io::pbm::save(ima_hlines, "output/3_hlines.pbm");
-  io::pbm::save(ima_vlines, "output/4_vlines.pbm");
-  io::pbm::save(ima_tables, "output/5_tables.pbm");
-  io::pbm::save(mask, "output/6_mask.pbm");
-  io::pbm::save(ima_texts, "output/7_texts.pbm");
-  /* Save 8_i_isolated */
-  io::ppm::save(final, "output/9_final.ppm");
+    // Get lines images
+    hlines_ima = hlines.labeled_image();
+    vlines_ima = vlines.labeled_image();
+    ima_hlines = data::convert(bool(), hlines_ima);
+    ima_vlines = data::convert(bool(), vlines_ima);
+
+    // Write images and close XML
+    path.str(""); path << "output/p" << page << "_0_bin.pbm";
+    io::pbm::save(bin, path.str());
+
+    path.str(""); path << "output/p" << page << "_1_bin_without_lines.pbm";
+    io::pbm::save(bin_without_lines, path.str());
+
+    path.str(""); path << "output/p" << page << "_2_bin_without_lines_denoised.pbm";
+    io::pbm::save(bin_without_lines_denoised, path.str());
+
+    path.str(""); path << "output/p" << page << "_3_hlines.pbm";
+    io::pbm::save(ima_hlines, path.str());
+
+    path.str(""); path << "output/p" << page << "_4_vlines.pbm";
+    io::pbm::save(ima_vlines, path.str());
+
+    path.str(""); path << "output/p" << page << "_5_tables.pbm";
+    io::pbm::save(ima_tables, path.str());
+
+    path.str(""); path << "output/p" << page << "_6_mask.pbm";
+    io::pbm::save(mask, path.str());
+
+    path.str(""); path << "output/p" << page << "_7_texts.pbm";
+    io::pbm::save(ima_texts, path.str());
+
+    /* Save 8_i_isolated */
+
+    path.str(""); path << "output/p" << page << "_9_final.pbm";
+    io::ppm::save(final, path.str());
+  }
 
   end_xml(xml);
 
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            olena: olena-2.0-555-gaef8c43 Output a simple and	valid XML and image of bounding boxes + Add TODO file
                        
                        
by Anthony Seure 11 Jun '13
                    by Anthony Seure 11 Jun '13
11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/TODO        |   12 ++++++++++++
 scribo/sandbox/icdar_13_table/src/main.cc |   25 ++++++++++++++++++++++---
 2 files changed, 34 insertions(+), 3 deletions(-)
 create mode 100644 scribo/sandbox/icdar_13_table/TODO
diff --git a/scribo/sandbox/icdar_13_table/TODO b/scribo/sandbox/icdar_13_table/TODO
new file mode 100644
index 0000000..b34e7a2
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/TODO
@@ -0,0 +1,12 @@
+#------------------------------------------------------------------------------#
+                  TODO LIST - ICDAR 2013 - Table competition
+#------------------------------------------------------------------------------#
+
+Table location sub-competition : 
+ * Load PDF files (instead of PNM)
+ * Find links betwwen pages for mutlipages tables
+ * Get text from reversed-video zones
+ * Expand the process to borderless tables
+
+Table structure recognition sub-competition :
+ * All
diff --git a/scribo/sandbox/icdar_13_table/src/main.cc b/scribo/sandbox/icdar_13_table/src/main.cc
index e4dbb11..7151b16 100644
--- a/scribo/sandbox/icdar_13_table/src/main.cc
+++ b/scribo/sandbox/icdar_13_table/src/main.cc
@@ -1,7 +1,9 @@
 #include <mln/binarization/all.hh>
 
 #include <mln/core/image/image2d.hh>
+
 #include <mln/data/all.hh>
+#include <mln/draw/line.hh>
 
 #include <mln/fun/v2v/rgb_to_luma.hh>
 
@@ -9,6 +11,7 @@
 #include <mln/io/ppm/all.hh>
 
 #include <mln/labeling/all.hh>
+#include <mln/literal/all.hh>
 #include <mln/logical/and.hh>
 
 #include <mln/value/all.hh>
@@ -45,7 +48,8 @@ void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
       << "\t\t<region id='" << region << "' page='" << page << "'>" << std::endl
       << "\t\t<bounding-box x1='" << start[1] << "' y1='" << start[0] << "' "
       << "x2='" << end[1] << "' y2='" << end[0] << "'/>" << std::endl
-      << "\t\t</region>" << std::endl;
+      << "\t\t</region>" << std::endl
+      << "\t</table>" << std::endl;
 
   ++table;
 }
@@ -181,7 +185,7 @@ int main(int argc, char** argv)
   typedef value::label_16 V;
   typedef image2d<V> L;
 
-  image2d<value::rgb8> original;
+  image2d<value::rgb8> original, final;
   image2d<value::int_u8> filtered;
   image2d<bool> bin, ima_hlines, ima_vlines, ima_tables, ima_texts,
                 bin_without_lines, bin_without_lines_denoised,
@@ -207,6 +211,7 @@ int main(int argc, char** argv)
   filtered = data::transform(original, mln::fun::v2v::rgb_to_luma<value::int_u8>());
 
   bin = scribo::binarization::sauvola(filtered, 81, 0.44);
+  final = data::convert(value::rgb8(), bin);
 
   initialize(mask, bin);
   initialize(ima_texts, bin);
@@ -266,9 +271,22 @@ int main(int argc, char** argv)
 
       std::cout << "(" << left << "," << top << ") ->"
                 << "(" << right << "," << bottom << ")" << std::endl;
+
+      point2d p1, p2, p3, p4;
+
+      p1 = point2d(top, left);
+      p2 = point2d(top, right);
+      p3 = point2d(bottom, right);
+      p4 = point2d(bottom, left);
+
+      draw::line(final, p1, p2, literal::red);
+      draw::line(final, p2, p3, literal::red);
+      draw::line(final, p3, p4, literal::red);
+      draw::line(final, p4, p1, literal::red);
+
+      write_table(xml, p1, p3);
     }
   }
-  
 
   // Get lines images
   hlines_ima = hlines.labeled_image();
@@ -286,6 +304,7 @@ int main(int argc, char** argv)
   io::pbm::save(mask, "output/6_mask.pbm");
   io::pbm::save(ima_texts, "output/7_texts.pbm");
   /* Save 8_i_isolated */
+  io::ppm::save(final, "output/9_final.ppm");
 
   end_xml(xml);
 
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/src/main.cc |  122 +++++++++++++++++++++++++++++
 1 files changed, 122 insertions(+), 0 deletions(-)
diff --git a/scribo/sandbox/icdar_13_table/src/main.cc b/scribo/sandbox/icdar_13_table/src/main.cc
index 2ed125d..e4dbb11 100644
--- a/scribo/sandbox/icdar_13_table/src/main.cc
+++ b/scribo/sandbox/icdar_13_table/src/main.cc
@@ -88,6 +88,94 @@ void  get_vertical_lines(scribo::component_set<L>&  vlines,
   }
 }
 
+unsigned find_left(image2d<bool>& ima)
+{
+  bool found = false;
+
+  def::coord col = geom::min_col(ima);
+  while (col < geom::max_col(ima) && !found)
+  {
+    def::coord row = geom::min_row(ima);
+    while (row < geom::max_row(ima) && !found)
+    {
+      found = opt::at(ima, row, col);
+      ++row;
+    }
+    ++col;
+  }
+
+  return (col - 1);
+}
+
+unsigned  find_right(image2d<bool>& ima)
+{
+  bool found = false;
+
+  def::coord col = geom::max_col(ima) - 1;
+  while (col >= geom::min_col(ima) && !found)
+  {
+    def::coord row = geom::min_row(ima);
+    while (row < geom::max_row(ima) && !found)
+    {
+      found = opt::at(ima, row, col);
+      ++row;
+    }
+    --col;
+  }
+
+  return (col + 1);
+
+}
+
+unsigned  find_top(image2d<bool>& ima)
+{
+  bool found = false;
+
+  def::coord row = geom::min_row(ima);
+  while (row < geom::max_row(ima) && !found)
+  {
+    def::coord col = geom::min_col(ima);
+    while (col < geom::max_col(ima) && !found)
+    {
+      found = opt::at(ima, row, col);
+      ++col;
+    }
+    ++row;
+  }
+
+  return (row - 1);
+
+}
+
+unsigned  find_bottom(image2d<bool>& ima)
+{
+  bool found = false;
+
+  def::coord row = geom::max_row(ima) - 1;
+  while (row >= geom::min_row(ima) && !found)
+  {
+    def::coord col = geom::min_col(ima);
+    while (col < geom::max_col(ima) && !found)
+    {
+      found = opt::at(ima, row, col);
+      ++col;
+    }
+    --row;
+  }
+
+  return (row + 1);
+}
+
+void  find_borders(image2d<bool>& ima,
+                   unsigned& left, unsigned& right,
+                   unsigned& top, unsigned& bottom)
+{
+  left = find_left(ima);
+  right = find_right(ima);
+  top = find_top(ima);
+  bottom = find_bottom(ima);
+}
+
 int main(int argc, char** argv)
 {
   typedef value::label_16 V;
@@ -149,6 +237,39 @@ int main(int argc, char** argv)
   // Compose table zones with bin_without_lines_lines
   ima_texts = logical::and_(bin_without_lines_denoised, mask);
 
+  // Isolate texts between tables
+  for (unsigned i = 1; i <= masks.nelements(); ++i)
+  {
+    image2d<bool> table_mask, isolated_text;
+    std::ostringstream path;
+    bool empty = true;
+
+    initialize(table_mask, bin);
+    data::fill(table_mask, false);
+    data::fill((table_mask | masks(i).bbox()).rw(), true);
+
+    isolated_text = logical::and_(bin_without_lines_denoised, table_mask);
+
+    mln_piter_(image2d<bool>) p(isolated_text.domain());
+
+    for_all(p)
+      empty = empty && !(isolated_text(p));
+
+    if (!empty)
+    {
+      path << "output/8_" << i << "_isolated.pbm";
+      io::pbm::save(isolated_text, path.str());
+
+      // Find coordinated
+      unsigned left, right, top, bottom;
+      find_borders(isolated_text, left, right, top, bottom);
+
+      std::cout << "(" << left << "," << top << ") ->"
+                << "(" << right << "," << bottom << ")" << std::endl;
+    }
+  }
+  
+
   // Get lines images
   hlines_ima = hlines.labeled_image();
   vlines_ima = vlines.labeled_image();
@@ -164,6 +285,7 @@ int main(int argc, char** argv)
   io::pbm::save(ima_tables, "output/5_tables.pbm");
   io::pbm::save(mask, "output/6_mask.pbm");
   io::pbm::save(ima_texts, "output/7_texts.pbm");
+  /* Save 8_i_isolated */
 
   end_xml(xml);
 
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            olena: olena-2.0-553-gec04a4f [ICDAR_13] Find texts	inside cells on cropped tables
                        
                        
by Anthony Seure 11 Jun '13
                    by Anthony Seure 11 Jun '13
11 Jun '13
                    
                        ---
 scribo/sandbox/icdar_13_table/Makefile    |   18 +++
 scribo/sandbox/icdar_13_table/src/main.cc |  171 +++++++++++++++++++++++++++++
 2 files changed, 189 insertions(+), 0 deletions(-)
 create mode 100644 scribo/sandbox/icdar_13_table/Makefile
 create mode 100644 scribo/sandbox/icdar_13_table/src/main.cc
diff --git a/scribo/sandbox/icdar_13_table/Makefile b/scribo/sandbox/icdar_13_table/Makefile
new file mode 100644
index 0000000..2420eec
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/Makefile
@@ -0,0 +1,18 @@
+CCACHE=
+CC=g++
+CFLAGS=-Wall -Werror -O3
+CLIBS=-I../../../milena/ -I../../
+CLEAN=*.o $(OUTPUT) output/* log final.xml
+
+SRC=src/main.cc
+OUTPUT=table
+
+all: table
+
+table:
+	$(CCACHE) $(CC) $(CFLAGS) -DHAVE_TESSERACT_3 $(CLIBS) $(SRC) -ltesseract -o $(OUTPUT)
+
+clean:
+	rm -rf $(CLEAN)
+
+.PHONY: table
diff --git a/scribo/sandbox/icdar_13_table/src/main.cc b/scribo/sandbox/icdar_13_table/src/main.cc
new file mode 100644
index 0000000..2ed125d
--- /dev/null
+++ b/scribo/sandbox/icdar_13_table/src/main.cc
@@ -0,0 +1,171 @@
+#include <mln/binarization/all.hh>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/data/all.hh>
+
+#include <mln/fun/v2v/rgb_to_luma.hh>
+
+#include <mln/io/pbm/all.hh>
+#include <mln/io/ppm/all.hh>
+
+#include <mln/labeling/all.hh>
+#include <mln/logical/and.hh>
+
+#include <mln/value/all.hh>
+
+#include <tesseract/baseapi.h>
+
+#include <scribo/binarization/sauvola.hh>
+#include <scribo/core/component_set.hh>
+#include <scribo/preprocessing/denoise_fg.hh>
+#include <scribo/primitive/extract/all.hh>
+
+using namespace mln;
+
+void  start_xml(std::ofstream& xml, const char* name, const char* pdf)
+{
+  xml.open(name);
+  xml << "<?xml version\"1.0\" encoding=\"UTF-8\"?>" << std::endl
+      << "<document filename='" << pdf << "'>" << std::endl;
+}
+
+void  end_xml(std::ofstream& xml)
+{
+  xml << "</document>" << std::endl;
+  xml.close();
+}
+
+void  write_table(std::ofstream& xml, const point2d& start, const point2d& end)
+{
+  static unsigned table = 0;
+  static unsigned region = 0;
+  static unsigned page = 1;
+
+  xml << "\t<table id='" << table << "'>" << std::endl
+      << "\t\t<region id='" << region << "' page='" << page << "'>" << std::endl
+      << "\t\t<bounding-box x1='" << start[1] << "' y1='" << start[0] << "' "
+      << "x2='" << end[1] << "' y2='" << end[0] << "'/>" << std::endl
+      << "\t\t</region>" << std::endl;
+
+  ++table;
+}
+
+template<typename L>
+void  get_horizontal_lines(scribo::component_set<L>&  hlines,
+                           image2d<bool>&             ima,
+                           image2d<bool>&             bin_without,
+                           const unsigned             av_height)
+{
+  for (unsigned i = 1; i <= hlines.nelements(); ++i)
+  {
+    const box2d& b = hlines(i).bbox();
+
+    data::fill((bin_without | b).rw(), false);
+
+    if (b.height() != 0 && b.width() != 0 && b.height() < av_height)
+      data::fill((ima | b).rw(), true);
+  }
+}
+
+template<typename L>
+void  get_vertical_lines(scribo::component_set<L>&  vlines,
+                         image2d<bool>&             ima,
+                         image2d<bool>&             bin_without,
+                         const unsigned             av_width,
+                         const int                  delta_prox_h)
+{
+  for (unsigned i = 1; i <= vlines.nelements(); ++i)
+  {
+    const box2d& b = vlines(i).bbox();
+
+    data::fill((bin_without | b).rw(), false);
+
+    if (b.height() != 0 && b.width() != 0
+        && b.width() < av_width)
+      if (vlines(i).mass_center()[1] - vlines(i - 1).mass_center()[1] > delta_prox_h
+          || vlines(i).mass_center()[1] < vlines(i - 1).mass_center()[1])
+        data::fill((ima | b).rw(), true);
+  }
+}
+
+int main(int argc, char** argv)
+{
+  typedef value::label_16 V;
+  typedef image2d<V> L;
+
+  image2d<value::rgb8> original;
+  image2d<value::int_u8> filtered;
+  image2d<bool> bin, ima_hlines, ima_vlines, ima_tables, ima_texts,
+                bin_without_lines, bin_without_lines_denoised,
+                mask;
+  image2d<unsigned> labeled;
+  scribo::component_set< image2d<unsigned> > masks;
+  V nhlines, nvlines;
+  L hlines_ima, vlines_ima;
+  scribo::component_set<L> hlines, vlines;
+
+  // PARAMETERS
+  unsigned av_height = 4;
+  unsigned av_width = 4;
+  int delta_prox_h = 5;
+  unsigned min_height = 71;
+  unsigned min_width = 31;
+
+  // Loadin and binarization
+  std::ofstream xml;
+  start_xml(xml, "final.xml", argv[1]);
+
+  io::ppm::load(original, argv[1]);
+  filtered = data::transform(original, mln::fun::v2v::rgb_to_luma<value::int_u8>());
+
+  bin = scribo::binarization::sauvola(filtered, 81, 0.44);
+
+  initialize(mask, bin);
+  initialize(ima_texts, bin);
+  initialize(ima_tables, bin);
+  data::fill(ima_tables, false);
+
+  bin_without_lines = duplicate(bin);
+
+  // Lines extraction
+  hlines = scribo::primitive::extract::lines_h_discontinued(bin, c4(), nhlines, min_width, 2);
+  vlines = scribo::primitive::extract::lines_v_discontinued(bin, c4(), nvlines, min_height, 2);
+
+  get_horizontal_lines(hlines, ima_tables, bin_without_lines, av_height);
+  get_vertical_lines(vlines, ima_tables, bin_without_lines, av_width, delta_prox_h);
+
+  // Denoising
+  bin_without_lines_denoised = scribo::preprocessing::denoise_fg(bin_without_lines, c8(), 3);
+
+  // Set the tables mask
+  unsigned n;
+  labeled = labeling::blobs(ima_tables, c8(), n);
+  masks = scribo::component_set< image2d<unsigned> >(labeled, n);
+  data::fill(mask, false);
+
+  for (unsigned i = 1; i <= masks.nelements(); ++i)
+    data::fill((mask | masks(i).bbox()).rw(), true);
+
+  // Compose table zones with bin_without_lines_lines
+  ima_texts = logical::and_(bin_without_lines_denoised, mask);
+
+  // Get lines images
+  hlines_ima = hlines.labeled_image();
+  vlines_ima = vlines.labeled_image();
+  ima_hlines = data::convert(bool(), hlines_ima);
+  ima_vlines = data::convert(bool(), vlines_ima);
+
+  // Write images and close XML
+  io::pbm::save(bin, "output/0_bin.pbm");
+  io::pbm::save(bin_without_lines, "output/1_bin_without_lines.pbm");
+  io::pbm::save(bin_without_lines_denoised, "output/2_bin_without_lines_denoised.pbm");
+  io::pbm::save(ima_hlines, "output/3_hlines.pbm");
+  io::pbm::save(ima_vlines, "output/4_vlines.pbm");
+  io::pbm::save(ima_tables, "output/5_tables.pbm");
+  io::pbm::save(mask, "output/6_mask.pbm");
+  io::pbm::save(ima_texts, "output/7_texts.pbm");
+
+  end_xml(xml);
+
+  return 0;
+}
-- 
1.7.2.5
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    11 Jun '13
                    
                        This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch sandbox/anthony has been updated
       via  82555836eee6be994349379073645c7ffb95efd2 (commit)
       via  cd3eaf5c379d0a7cc79a9582804c8cd0bd495af5 (commit)
       via  929c08c1bfd38d89db429c9044fb4f853539ccd9 (commit)
       via  6836fdca44e5041bfc69cf2bee05208be07fbe89 (commit)
       via  4ecdb6a0dc6b70c2da6ed3d1b6cf7514d2a634bc (commit)
       via  c9c37e96e86294cabf65cb67b9c5a7633bbd31c8 (commit)
       via  5ead1bea3cc30ffe45470edd2b3fdf779a746217 (commit)
       via  6117c4841976a638e11a440da4baafb4d42747bb (commit)
       via  103edf9e42d61e2bb3e3531848e61dc97fdc12ca (commit)
       via  3e47e4a307b4d281a86bcfbca50f84a8d5fe0a9f (commit)
       via  2661c4daf22e87c6a4dbc078a1299a78aca237ab (commit)
       via  8241f489f5b240fe17fb003e27c944c94b0e20b7 (commit)
       via  1e8d6c3744d281085d64f9d585d9d5550c28d619 (commit)
       via  c703af583f422e4c2ea55ac693eeb46497589f1f (commit)
       via  2ef0c81e523a90cfd5ef612f28a3473495377b5a (commit)
       via  bc90889ccb3e6616e20571e6ee3a8772b34009f2 (commit)
       via  fc13ccd539da9a9a16f8d3e46cf954f63ccc29cd (commit)
       via  e04845e855581171a9e9f58b5c0509f3b58fbee7 (commit)
       via  aef8c436c371382c2065486319b53816ecb01613 (commit)
       via  e73b8b3dc0201912f35bf394f6811a6ddaa888a1 (commit)
       via  ec04a4fa740c22d176e396c08111e907f2868e76 (commit)
       via  1935bc36690804e3ee07a7c2344538c9d80287c8 (commit)
       via  51571df5ecf647d4f8d258bba3714ac78d9cf19d (commit)
       via  806244e44b676343c967c44ca3563492e0d817ad (commit)
       via  1cd17e32b4fc61239195c688394cd92c3fc44167 (commit)
       via  efabb3bcb01ae366f463abf4fa14303efce4cda7 (commit)
       via  276ad3db3217651981534e7a5908c0b8954d2502 (commit)
       via  bd478ecf1a53fd1c42b3c267f220aab3f146c4ca (commit)
       via  81824c6b2a74d526744302b38a5479989c961f76 (commit)
       via  92344248afe3b83428d1db46b156e745451e5ce5 (commit)
       via  ce97be8f1743324174f965410d1249994eba3e8d (commit)
       via  289bcac105fb22c53d37d73a32c1f1402bc5c358 (commit)
       via  83d9bff14f8b49b346c6342855d612a37c58cfd0 (commit)
       via  aa8db8d1be7bdf624312762a1630355d3fec543a (commit)
       via  e2f4e925bc23a4698abe15108d0ec754bbf67c29 (commit)
       via  07333d2c000f65cfabcc4702b704b5abf4126278 (commit)
       via  1a302adfd37c3aebe33a477d64cb0304150e37c9 (commit)
       via  b0051dcaccff406bf3176e17f4abfb95a71822dd (commit)
       via  13b61491d6933f69e26cb421e1448f094351cae9 (commit)
       via  77d7b3a938fe16dc7216117a80158007706e1236 (commit)
       via  9cf87e52f51dbc3344e7aca36a884b8ae0892bed (commit)
       via  ce8691742261a97e214f5e99024e319cc9e761e2 (commit)
       via  9df9980fe8d9d1b2e7cd68ef41aa6bad00f261c0 (commit)
       via  002e0e957be01c8a22605d884b9b1dd591e1ee5b (commit)
       via  592a16814171acc776241e80db25673125619bda (commit)
       via  979d54b458e41fc3bac8f347742d6a42a03df2a1 (commit)
       via  22f1827a91aba6dd05a98e784d53d4e76a1498cd (commit)
       via  733ef50fa2606d41c09badbe0f2204d16a806d61 (commit)
       via  02fa89bb503205bdda6c35b477db63d637e36d31 (commit)
       via  1b8c3754d59e04b11e38b19232b138e8cc42f8eb (commit)
       via  11438e15a022b02513161e8191679c4409d6b4be (commit)
       via  07973346bd57c8bef7e0346c28b6469da5db91e2 (commit)
       via  b3c468886a96090e094f3c7d79e48e489954997f (commit)
       via  81e04f2a8a3166a165634524c0a73d7e9dc4f952 (commit)
       via  0987e7f285f366e8129e1c1d439367e269932279 (commit)
       via  17105bad97c497797a9f5ac257aca1b25c9a3678 (commit)
       via  1c93a61f5b62f6ca9d96b8349d5140874adc0bce (commit)
       via  3a7edf0e93669104e45a36ee5face28103dd3cd8 (commit)
       via  cfaf93d08cc8b366906aeffc7fca9a4a3ee7ec72 (commit)
       via  7b919388ab17f9e0f6ce5b6c19755a05760737da (commit)
       via  61a8584dff43f330bab0a81207b4326d2c73ab1e (commit)
       via  57c088c4a0139017d368dfe6f82c85108645daba (commit)
       via  26507619401189aa3f0009a4e90f288028806930 (commit)
       via  ab7704c3b8725fe5526f0c04ddd89f5058aeec90 (commit)
       via  720b4ac09e8e1ce997da5f3a3055dd5e9506a310 (commit)
       via  d76275d6454849a89f1a8e443856b39ddb889efd (commit)
       via  fec02485ded083e6fa7220192b53aaf82c587da9 (commit)
       via  87a4a347258b9acf3cb1c662e5327a15250c642c (commit)
       via  ac8d6ba7597e20b07f1b7401cdcf5e926c22dca1 (commit)
       via  dde0e23d75e77e157992b656322044fad5c1f9e1 (commit)
       via  6750f67b683f4d2a3d77f2413f8282466806807b (commit)
       via  26b7669e890316c16cdf04ef1ccd8bdcd68b00f1 (commit)
       via  af9984876b7de257a610bfddec7b20235b026850 (commit)
       via  a35bff38b91abc202b9a18ba45922423c3c85662 (commit)
       via  5a67b47545170fd6ad5ce94bd1cb5b7edca55e9b (commit)
       via  731ab1a14efd7c99632127b3f7515bfb2d53c98b (commit)
       via  375b4e61b2c1bf292088f7ff3b5f020180a72770 (commit)
       via  6487a9dba1b813f2d50df08d397ec3080e0be7bb (commit)
       via  90aac13355f5f5518d291a41a81550471d75c97a (commit)
       via  5afba3842bb7cf3e22d63a13326e3907a4a9c972 (commit)
       via  4a0ee16f50566efb2180ae81764141bed236563b (commit)
       via  a1c740d02538ff9dd3f68b07cd561c67af3cabdc (commit)
       via  d6ac69cac5c35e0a47ace3f3b749c661e4c235b0 (commit)
       via  bc91dfb5dd05ce8b4f6b68f7f4eec1926b3aef0f (commit)
       via  73774f40bae141b0b7cf507d6df8893279a46ea7 (commit)
       via  c173d75dba1a8d8a03c8fee43947145d2570ab64 (commit)
       via  52ab07c654f83ee4968524f7e372599b762df21d (commit)
       via  6a7f9e5a35954f24d74bd276193ddd257b230cac (commit)
       via  8b40c86f5258ba437638b5e5d5d538ff3dcbe1c1 (commit)
       via  3e5f8ace4ca6039eb22a587f463ec41014c66eec (commit)
       via  e048c0b0d60d75ca4458f7235179dfa283580fb2 (commit)
       via  7c236c79dc621193afcf23c2ad0689a280b9e868 (commit)
       via  42ff098b62214a8e3ff9984c6c554b051a93ad2e (commit)
       via  04402f0a54a522e695cb3e492edc9cc9d280daf4 (commit)
       via  0b442682e8f59c4e411ff0590b203bb1dcf04668 (commit)
       via  5528729cfe130744aa8aa7d317af9d3a58146a2b (commit)
       via  cf3ad8f314f476fcac9768d2663d9afcd7661ef4 (commit)
       via  c57275b2a386c1fc291b4e1e800023eed552942d (commit)
       via  409c1433fbb3845715a9f5b817f65d70ad161d90 (commit)
       via  09c6148c1a2c9eda201e638b1ab6f5ebc7082745 (commit)
       via  c72cffc104bdffa902ebbdedc993ad5ddae8af5d (commit)
       via  cdcfe668b182ed328bae6dbd0d14528f72c50d4d (commit)
       via  c0f8681d2958afb11d3b4f5585de4804bc6524d4 (commit)
       via  2f40e47c6660deb2d8f12c2ad403fffff6b44eb1 (commit)
       via  e3089252d712c2b0839f9798a98a99f690f959e2 (commit)
       via  b5d61ebe4059d8e89e1a40d7fd26545219172813 (commit)
       via  5e4d3053fa3f8c92e02cbef811673b7c2a79040a (commit)
       via  272ccdacb752b2352c26decdd648cbcf85b42b53 (commit)
       via  73c3a74aea4d833e899baf0d69cd88e2c597908f (commit)
       via  dc7c3b9944d4b691b2099f10fba965714f82014f (commit)
       via  5cd01f612dd0d318156ed7f7d369153f52a084d9 (commit)
       via  5f3a088f08e99c16191c8e9461ae7052e9db8562 (commit)
       via  ea9c608068f019514e068fa629b18e53085ae5a3 (commit)
       via  d7ed1add8edcb87c4f347ad8ba4857057b3e05dc (commit)
       via  2d4989772890ec1e0cb12f9036e8965066eaa866 (commit)
       via  13dc18679d5dc70e9e678d0ea653e67254ecadb2 (commit)
       via  dac3105f148502b55ddf0130389af6c099e07a16 (commit)
       via  6323abc221199973f4ba5e85e8ca4f8def31a374 (commit)
       via  973a00494322c776a9dff16acce72f0f52480039 (commit)
       via  1a77aaae579961af4febf45e7210595753a1d155 (commit)
       via  66f08d0c354d1d55afd75438f6a0b1a4552b5ad2 (commit)
       via  22dd51887a8e6df6a74c5e3249a815265e974572 (commit)
       via  d86fc9a3c534f3b71711d1daea4c46a081863f41 (commit)
       via  055f40a10996f1d64c9c2577f395a46409b49e2c (commit)
       via  a74409363a9941dec0c4a86205cb5f22bdc2dab2 (commit)
       via  e0089be56aed528efb113d4f804adc7b0eeca65d (commit)
       via  c6262b2dd178ba0b4cb6e6b9135d3006b287b98b (commit)
       via  d8058ce8214e68759c706366cb5d331d9eb38f91 (commit)
       via  fd193702df57265383453bbf942b1fa651ed3caf (commit)
       via  5d57444eef6406777b20a7ea545a2491d58ea0d0 (commit)
       via  00f9215f95b48cba5b7518eb0ec8c2ccc50368dd (commit)
       via  c1877f8b356b8a6ba234852313828f06b61bf771 (commit)
       via  62fccd14b6863c79ec96ef7102ff0f2bd38b4812 (commit)
       via  2fe026c16ad4d9df4266c16993684576ba8b495d (commit)
       via  f92264244ca22751936f2f909ab911a2e6d9753f (commit)
       via  81bdc8aae8645f38551682ac4ac8e2657cc7b3d9 (commit)
       via  b375ab3e82b52e4a07a4590c02272c718f8ffa6c (commit)
       via  4938c8d839f9d4994cf577d8dd57906636d9d25d (commit)
       via  1a432a30f9344628f2082772d29ac4b8f03a0cd3 (commit)
       via  27abe98ff8779d1e01e11c55f740b079f69b3c35 (commit)
       via  e5b58eb213b3a88a2be6934e9e8f1e3e55d8bd64 (commit)
       via  7e08fb78a5055a9adf5fba277a9a0c429b20ce5f (commit)
       via  2d8786ecfd45afcdf0bac86ddbcb0e3029f17f2f (commit)
       via  9a0159551ff9e29e5c8c52e1f791db137f44c670 (commit)
       via  66cb484adc91ca65c034f198baae67fe20e83262 (commit)
       via  eef02666ee55a78e5c4fe8510149b26718f43f65 (commit)
       via  1750bc523cdc01e1717bc168644a16524b77fa1e (commit)
       via  961ef463d342b373a63c1c570568e44e564012b9 (commit)
       via  ae155c6e37215fcd722f44a82573729e89647108 (commit)
       via  92262d2499f2eb25a2aa6919ac58c240d66a10d4 (commit)
       via  5dd49fd54cb0aefc62307d2c44bb2aa2bad9bc13 (commit)
       via  16506fd482cea6aae09c272d70c0cd12c9d11703 (commit)
       via  ca6ca83dc3fae9efe685fe774df68ddf6793acbe (commit)
       via  48849ed3b8a9749bb310f12cccf70bdc8429c61a (commit)
       via  1ec09726a5670c541c9ea5f57b832a6374ca09c0 (commit)
       via  9a540a39c053b5a730edb6ccff5d9871bdfa1274 (commit)
       via  c621ab07ea277fd211c6905aa581918891ba2174 (commit)
       via  7c5e9ccb89f6f8b2d9ca6a2531386aef2201bd1a (commit)
       via  b6f55689cb59716f61c6331c3e3483185c42a410 (commit)
       via  28448a695a1c10a090f7d03c395fdf203fe6cb7e (commit)
       via  ce984130f0fcb7959a6b62dd0f1e819e5d66728e (commit)
       via  357035117860ee79ae50a628f4e91e496905e6fc (commit)
       via  4b986216fbc85d5f86db7b55a85a28a9d25608f2 (commit)
       via  1995b37c1c05412c38ae84ba0528e5510d379409 (commit)
       via  e45787c19b8816a54b4a57f514eae3a7c0a5a219 (commit)
       via  3164abc5750dc9dbf92c86a4b6d006a26126c8ec (commit)
       via  e435b9ba61dddbb786e339dbef3d593316c0d3e8 (commit)
       via  d48b8a4ae1e70487c3d8cd3370090e8ab132eb98 (commit)
       via  24d3d373e86a8db51b64e2b2ff640cbec1486455 (commit)
       via  153144dc8928d799662d0398a48e06eec842a8ed (commit)
       via  4da0078b5a812846e1d6be5a78b22dcb15b2c448 (commit)
       via  e4ad8e3807e7e42cdeeb9e24cd0419b87852dd3c (commit)
       via  64b6e9d0c557c719707c6ee057fc96160a1fd38e (commit)
       via  40eaf23f6c4f0798ff624b6efd24214f63ccc947 (commit)
       via  65886835663c0a8f85aa56071b1ca0b61dfee5dc (commit)
       via  2a9b240ff2100b6f9d02969deb754f58d701e251 (commit)
       via  62dbacde6331505524aa418e00c4ec111f679799 (commit)
       via  1d131cfacc87cbe0485582a92da949908d46f41f (commit)
       via  af1e2e373ae8d18c3ccef3297aa00547af4ba28e (commit)
       via  cb4de64dddfb5e43bc9a5ba57ffede6cb54a8256 (commit)
       via  85cf60236cf2f22ca0a263056bb0952321275174 (commit)
       via  59845993406e6a7db4a4dee30fc2798011d63931 (commit)
       via  57bfad3c334cbb4e891bf3330531f68b739b5c4a (commit)
       via  3f878aba04012c1069a3ecc4f240a7c87f76729c (commit)
       via  22a49ac2882aba28798e8eaf02e8f161f4f0edc3 (commit)
       via  9352b4dd5c97cc913eabcc31277270c7aa2b9729 (commit)
       via  993220a95e21a684ee0a378873f8702b45d8a852 (commit)
       via  766aeea463fc2ec7c091dae0e300f9baa9716675 (commit)
       via  1ee4cecf9d02cb75521fb65fc734c27a0c7d9592 (commit)
      from  f16ceed7137269e1b484609389d59713a8a1cc2b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
8255583 Fix merge conflicts with ICDAR13 recognition table work from Roland
cd3eaf5 Create a full scale space
929c08c Create blured copies of original image
6836fdc Init scale space working directory
4ecdb6a Remove many false positives (intersecting boxes)
c9c37e9 Build the set of detected columns during table recognition.
5ead1be Build spatial relations between text boxes as directed graphs.
6117c48 Fix various issues in the table detection experiment.
103edf9 [ICDAR_13] Refactore and use of sauvola_ms instead of sauvola
3e47e4a [ICDAR_13] Validate links of boxes based on separators
2661c4d [ICDAR_13] Check old version XML output with GUI Annotator
8241f48 [ICDAR_13] Update XML output + Add XML reference
1e8d6c3 [ICDAR_13] Externalize XML handler
c703af5 [ICDAR] Externalize some functions
2ef0c81 [ICDAR] Handle reverse video
bc90889 [ICDAR_13] New processing (scribo toolchain-like) started
fc13ccd Start new toolchain (scribo toolchain inspired)
e04845e Work with mutlipages PDF
aef8c43 Output a simple and valid XML and image of bounding boxes + Add TODO file
e73b8b3 Find bounding coordinates for each tables
ec04a4f [ICDAR_13] Find texts inside cells on cropped tables
-----------------------------------------------------------------------
Summary of changes:
 ChangeLog                                          |  194 ++++-
 GScribo/BUGS                                       |    1 -
 GScribo/GScribo.pro                                |   83 --
 GScribo/GScribo.pro.user                           |  405 -------
 GScribo/GScribo.pro.user.1.3                       |  283 -----
 GScribo/PagesWidget/pagesdelegate.cpp              |   20 -
 GScribo/PagesWidget/pagesdelegate.h                |   18 -
 GScribo/PagesWidget/pagesmodel.cpp                 |   55 -
 GScribo/PagesWidget/pagesmodel.h                   |   43 -
 GScribo/PagesWidget/pageswidget.cpp                |   49 -
 GScribo/PagesWidget/pageswidget.h                  |   55 -
 GScribo/Preferences/generaloptions.cpp             |   44 -
 GScribo/Preferences/generaloptions.h               |   34 -
 GScribo/Preferences/generaloptions.ui              |  100 --
 GScribo/Preferences/ocroptions.cpp                 |   53 -
 GScribo/Preferences/ocroptions.h                   |   33 -
 GScribo/Preferences/ocroptions.ui                  |   62 --
 GScribo/Preferences/optionwidget.h                 |   15 -
 GScribo/Preferences/preferencesdialog.cpp          |   98 --
 GScribo/Preferences/preferencesdialog.h            |   42 -
 GScribo/Preferences/preferencesdialog.ui           |  121 ---
 GScribo/Preferences/preprocessingoptions.cpp       |   45 -
 GScribo/Preferences/preprocessingoptions.h         |   32 -
 GScribo/Preferences/preprocessingoptions.ui        |   76 --
 GScribo/Preferences/segmentationoptions.cpp        |   33 -
 GScribo/Preferences/segmentationoptions.h          |   31 -
 GScribo/Preferences/segmentationoptions.ui         |   52 -
 GScribo/Processing/preprocess.cpp                  |   11 -
 GScribo/Processing/preprocess.h                    |   26 -
 GScribo/Processing/process.cpp                     |   21 -
 GScribo/Processing/process.h                       |   29 -
 GScribo/Processing/progressdialog.cpp              |   16 -
 GScribo/Processing/progressdialog.h                |   22 -
 GScribo/Processing/runner.cpp                      |  183 ----
 GScribo/Processing/runner.h                        |   58 -
 GScribo/Rendering/abstractregionitem.h             |   13 -
 GScribo/Rendering/backgroundtexture.h              |   12 -
 GScribo/Rendering/graphicsview.cpp                 |  150 ---
 GScribo/Rendering/graphicsview.h                   |   43 -
 GScribo/Rendering/regionitem.cpp                   |   59 -
 GScribo/Rendering/regionitem.h                     |   80 --
 GScribo/Rendering/rootgraphicsitem.h               |   30 -
 GScribo/Rendering/scene.cpp                        |  273 -----
 GScribo/Rendering/scene.h                          |  118 --
 GScribo/Rendering/selection.cpp                    |   36 -
 GScribo/Rendering/selection.h                      |   20 -
 GScribo/TODO                                       |  100 --
 GScribo/XmlWidget/attributesmodel.cpp              |   69 --
 GScribo/XmlWidget/attributesmodel.h                |   48 -
 GScribo/XmlWidget/selectionproxy.h                 |   47 -
 GScribo/XmlWidget/xmlattributes.cpp                |   23 -
 GScribo/XmlWidget/xmlattributes.h                  |   33 -
 GScribo/XmlWidget/xmldelegate.h                    |   30 -
 GScribo/XmlWidget/xmlitem.cpp                      |   43 -
 GScribo/XmlWidget/xmlitem.h                        |   90 --
 GScribo/XmlWidget/xmlmodel.cpp                     |   87 --
 GScribo/XmlWidget/xmlmodel.h                       |   44 -
 GScribo/XmlWidget/xmlview.cpp                      |   88 --
 GScribo/XmlWidget/xmlview.h                        |   79 --
 GScribo/XmlWidget/xmlwidget.cpp                    |   34 -
 GScribo/XmlWidget/xmlwidget.h                      |   54 -
 GScribo/aboutdialog.h                              |   25 -
 GScribo/aboutdialog.ui                             |  136 ---
 GScribo/configs.h                                  |  134 ---
 GScribo/dir.h                                      |    7 -
 GScribo/dockwidget.h                               |   22 -
 GScribo/main.cpp                                   |   23 -
 GScribo/mainwindow.cpp                             |  415 -------
 GScribo/mainwindow.h                               |  120 --
 GScribo/mainwindow.ui                              |   35 -
 GScribo/region.h                                   |   56 -
 GScribo/regionwidget.cpp                           |   70 --
 GScribo/regionwidget.h                             |   40 -
 GScribo/variantpointer.h                           |   19 -
 GScribo/xml.cpp                                    |  206 ----
 GScribo/xml.h                                      |   93 --
 Makefile.am                                        |   30 +-
 NEWS                                               |   18 +-
 configure.ac                                       |   19 +-
 distrib/macports/Portfile.in                       |    4 +-
 doc/Doxyfile.in                                    |    8 +-
 doc/Makefile.am                                    |   25 +-
 doc/doc.bib                                        |   40 +-
 doc/header.html                                    |    2 +-
 doc/mainpage.dox                                   |    4 +-
 milena/ChangeLog                                   | 1138 ++++++++++++++++++++
 milena/apps/mesh-segm-skel/Makefile.am             |    2 +-
 .../mesh-segm-skel/mesh-complex-max-curv-segm.cc   |    7 +-
 milena/apps/mesh-segm-skel/mesh-complex-segm.cc    |    7 +-
 milena/apps/morphers/Makefile.am                   |    2 +
 milena/apps/morphers/image2d-skel.hh               |    8 +-
 .../apps/papers/levillain.09.ismm/classif-graph.cc |    4 +-
 milena/apps/papers/levillain.09.ismm/io.hh         |    4 -
 milena/doc/Doxyfile.in                             |   60 +-
 milena/doc/DoxygenLayout.xml                       |    4 +-
 milena/doc/Makefile.am                             |   80 +-
 milena/doc/benchmark/canvas.cc                     |    6 +-
 milena/doc/examples.dox                            |   14 +
 milena/doc/examples/multi_files_f1.cc.raw          |    6 +
 milena/doc/examples/multi_files_f2.cc.raw          |    6 +
 milena/doc/examples/multi_files_main.cc.raw        |   16 +
 milena/doc/examples/multiple_def.cc.raw            |    9 +
 .../examples/split/tuto3_first_routine-1.cc.raw    |    3 +-
 .../examples/split/tuto3_first_routine-3.cc.raw    |    2 +-
 .../examples/split/tuto3_first_routine-8.cc.raw    |    1 -
 milena/doc/examples/split/tuto3_trace-1.cc.raw     |    2 +-
 milena/doc/examples/split/tuto3_trace-2.cc.raw     |    2 +-
 milena/doc/examples/trash/tuto_bis.cc              |   11 +-
 milena/doc/examples/trash/tuto_one.cc              |    4 +-
 milena/doc/examples/tuto3/first_routine.cc         |    6 +-
 milena/doc/examples/tuto3/trace.cc                 |    6 +-
 milena/doc/examples/typenametemplate.cc.raw        |    1 +
 milena/doc/examples/undef_global_vars.cc.raw       |    1 +
 milena/doc/examples/wrongvaluetype.cc.raw          |    2 +
 milena/doc/img/2dgrid.png                          |  Bin 0 -> 6092 bytes
 milena/doc/mainpage.dox                            |    1 -
 milena/doc/mln/convert.dox                         |   13 +
 milena/doc/mln/core/alias/box1d.dox                |   25 +
 milena/doc/mln/core/alias/box2d.dox                |   25 +
 milena/doc/mln/core/alias/box2d_h.dox              |   25 +
 milena/doc/mln/core/alias/box3d.dox                |   26 +
 milena/doc/mln/core/alias/complex_geometry.dox     |   31 +
 milena/doc/mln/core/alias/complex_image.dox        |   88 ++
 milena/doc/mln/core/alias/dpoint1d.dox             |   30 +
 milena/doc/mln/core/alias/dpoint2d.dox             |   27 +
 milena/doc/mln/core/alias/dpoint3d.dox             |   27 +
 milena/doc/mln/core/alias/neighb1d.dox             |   16 +
 milena/doc/mln/core/alias/neighb2d.dox             |   16 +
 milena/doc/mln/core/alias/neighb3d.dox             |   16 +
 milena/doc/mln/core/alias/p_run2d.dox              |   18 +
 milena/doc/mln/core/alias/p_runs2d.dox             |   12 +
 milena/doc/mln/core/alias/point1d.dox              |   61 ++
 milena/doc/mln/core/alias/point2d.dox              |   61 ++
 milena/doc/mln/core/alias/point2d_h.dox            |   63 ++
 milena/doc/mln/core/alias/point3d.dox              |   62 ++
 milena/doc/mln/core/alias/vec2d.dox                |   48 +
 milena/doc/mln/core/alias/vec3d.dox                |   48 +
 milena/doc/mln/core/alias/w_window1d_float.dox     |   12 +
 milena/doc/mln/core/alias/w_window1d_int.dox       |   12 +
 milena/doc/mln/core/alias/w_window2d_float.dox     |   12 +
 milena/doc/mln/core/alias/w_window2d_int.dox       |   12 +
 milena/doc/mln/core/alias/w_window3d_float.dox     |   12 +
 milena/doc/mln/core/alias/w_window3d_int.dox       |   12 +
 milena/doc/mln/core/alias/window1d.dox             |   12 +
 milena/doc/mln/core/alias/window2d.dox             |   12 +
 milena/doc/mln/core/alias/window3d.dox             |   12 +
 milena/doc/mln/core/concept/concept.dox            |    6 +
 milena/doc/mln/io/io.dox                           |    7 +
 milena/doc/mln/labeling/labeling.dox               |    6 +
 milena/doc/mln/value/hsl.dox                       |   37 +
 milena/doc/mln/value/int_s16.dox                   |   24 +
 milena/doc/mln/value/int_s24.dox                   |   24 +
 milena/doc/mln/value/int_s32.dox                   |   24 +
 milena/doc/mln/value/int_s8.dox                    |   24 +
 milena/doc/mln/value/int_u12.dox                   |   24 +
 milena/doc/mln/value/int_u16.dox                   |   24 +
 milena/doc/mln/value/int_u24.dox                   |   24 +
 milena/doc/mln/value/int_u32.dox                   |   24 +
 milena/doc/mln/value/int_u8.dox                    |   24 +
 milena/doc/mln/value/label_16.dox                  |   21 +
 milena/doc/mln/value/label_32.dox                  |   21 +
 milena/doc/mln/value/label_8.dox                   |   21 +
 milena/doc/mln/value/rgb16.dox                     |   69 ++
 milena/doc/mln/value/rgb8.dox                      |   69 ++
 milena/doc/mln/value/value.dox                     |   43 +
 milena/doc/mln/win/disk2d.dox                      |   17 +
 milena/doc/mln/win/hline2d.dox                     |   17 +
 milena/doc/mln/win/segment1d.dox                   |   17 +
 milena/doc/mln/win/sline3d.dox                     |   17 +
 milena/doc/mln/win/sphere3d.dox                    |   17 +
 milena/doc/mln/win/vline2d.dox                     |   17 +
 milena/doc/ref-guide.tex                           |   69 +-
 milena/headers.mk                                  |   22 +-
 milena/mln/accu/compute.hh                         |    9 +-
 milena/mln/accu/image/init.hh                      |    9 +-
 milena/mln/accu/image/set_value.hh                 |   18 +-
 milena/mln/accu/image/take.hh                      |   18 +-
 milena/mln/accu/image/take_as_init.hh              |   18 +-
 milena/mln/accu/image/take_n_times.hh              |   18 +-
 milena/mln/accu/image/to_result.hh                 |    9 +-
 milena/mln/accu/image/untake.hh                    |   18 +-
 milena/mln/accu/stat/histo3d_rgb.hh                |   13 +-
 milena/mln/accu/transform.hh                       |   12 +-
 milena/mln/accu/transform_diagonal.hh              |    6 +-
 milena/mln/accu/transform_directional.hh           |    6 +-
 milena/mln/accu/transform_line.hh                  |   15 +-
 milena/mln/accu/transform_snake.hh                 |    6 +-
 milena/mln/accu/transform_stop.hh                  |   12 +-
 milena/mln/all.hh                                  |    2 +-
 milena/mln/arith/diff_abs.hh                       |    3 +-
 milena/mln/arith/div.hh                            |   18 +-
 milena/mln/arith/div.spe.hh                        |    6 +-
 milena/mln/arith/min.hh                            |   16 +-
 milena/mln/arith/min.spe.hh                        |    6 +-
 milena/mln/arith/minus.hh                          |   33 +-
 milena/mln/arith/plus.hh                           |   36 +-
 milena/mln/arith/revert.hh                         |    9 +-
 milena/mln/arith/revert.spe.hh                     |    8 +-
 milena/mln/arith/times.hh                          |   18 +-
 milena/mln/arith/times.spe.hh                      |    6 +-
 milena/mln/binarization/binarization.hh            |    6 +-
 milena/mln/binarization/threshold.hh               |    3 +-
 milena/mln/border/adjust.hh                        |    3 +-
 milena/mln/border/duplicate.hh                     |   12 +-
 milena/mln/border/equalize.hh                      |    6 +-
 milena/mln/border/fill.hh                          |    9 +-
 milena/mln/border/find.hh                          |    3 +-
 milena/mln/border/get.hh                           |    9 +-
 milena/mln/border/mirror.hh                        |   15 +-
 milena/mln/border/resize.hh                        |    3 +-
 milena/mln/border/resize_equal.hh                  |    3 +-
 milena/mln/canvas/browsing/backdiagonal2d.hh       |   10 +-
 milena/mln/canvas/browsing/diagonal2d.hh           |    3 +-
 .../canvas/browsing/dir_struct_elt_incr_update.hh  |    3 +-
 milena/mln/canvas/browsing/directional.hh          |    3 +-
 milena/mln/canvas/browsing/fwd.hh                  |    3 +-
 milena/mln/canvas/browsing/hyper_directional.hh    |    3 +-
 .../canvas/browsing/internal/graph_first_search.hh |    3 +-
 milena/mln/canvas/browsing/snake_fwd.hh            |    3 +-
 milena/mln/canvas/browsing/snake_generic.hh        |    3 +-
 milena/mln/canvas/browsing/snake_vert.hh           |    3 +-
 milena/mln/canvas/distance_front.hh                |    9 +-
 milena/mln/canvas/distance_geodesic.hh             |    9 +-
 milena/mln/canvas/labeling/blobs.hh                |    7 +-
 milena/mln/canvas/labeling/generic.hh              |   12 +-
 milena/mln/canvas/labeling/sorted.hh               |    8 +-
 milena/mln/canvas/labeling/video.hh                |   10 +-
 milena/mln/canvas/morpho/attribute_filter.hh       |    6 +-
 milena/mln/clustering/kmean_rgb.hh                 |   61 +-
 milena/mln/convert/to.hh                           |    7 +-
 milena/mln/convert/to_image.hh                     |   10 +-
 milena/mln/convert/to_qimage.hh                    |    3 +-
 milena/mln/convert/to_qimage_nocopy.hh             |    3 +-
 milena/mln/core/alias/box1d.hh                     |   43 +-
 milena/mln/core/alias/box2d.hh                     |   50 +-
 milena/mln/core/alias/box3d.hh                     |   53 +-
 milena/mln/core/alias/complex_geometry.hh          |   35 +-
 milena/mln/core/alias/complex_image.hh             |  121 ++-
 milena/mln/core/alias/dpoint1d.hh                  |   39 +-
 milena/mln/core/alias/dpoint2d.hh                  |   42 +-
 milena/mln/core/alias/dpoint3d.hh                  |   42 +-
 milena/mln/core/alias/neighb1d.hh                  |   71 ++-
 milena/mln/core/alias/neighb2d.hh                  |   97 ++-
 milena/mln/core/alias/neighb3d.hh                  |   98 ++-
 milena/mln/core/alias/p_run2d.hh                   |   14 +-
 milena/mln/core/alias/p_runs2d.hh                  |   14 +-
 milena/mln/core/alias/point1d.hh                   |   28 +-
 milena/mln/core/alias/point2d.hh                   |   30 +-
 milena/mln/core/alias/point3d.hh                   |   30 +-
 milena/mln/core/alias/vec2d.hh                     |   26 +-
 milena/mln/core/alias/vec3d.hh                     |   25 +-
 milena/mln/core/alias/w_window1d_float.hh          |   19 +-
 milena/mln/core/alias/w_window1d_int.hh            |   19 +-
 milena/mln/core/alias/w_window2d_float.hh          |   19 +-
 milena/mln/core/alias/w_window2d_int.hh            |   19 +-
 milena/mln/core/alias/w_window3d_float.hh          |   19 +-
 milena/mln/core/alias/w_window3d_int.hh            |   19 +-
 milena/mln/core/alias/window1d.hh                  |   55 +-
 milena/mln/core/alias/window2d.hh                  |   55 +-
 milena/mln/core/alias/window3d.hh                  |   59 +-
 milena/mln/core/box_runend_piter.hh                |   11 +-
 milena/mln/core/box_runstart_piter.hh              |    8 +
 milena/mln/core/concept/accumulator.hh             |   55 +-
 milena/mln/core/concept/box.hh                     |   15 +-
 milena/mln/core/concept/browsing.hh                |   14 +-
 milena/mln/core/concept/delta_point_site.hh        |   15 +-
 milena/mln/core/concept/dpoint.hh                  |   10 +-
 milena/mln/core/concept/function.hh                |   33 +-
 milena/mln/core/concept/gdpoint.hh                 |   23 +-
 milena/mln/core/concept/generalized_pixel.hh       |   25 +-
 milena/mln/core/concept/gpoint.hh                  |   26 +-
 milena/mln/core/concept/graph.hh                   |   17 +-
 milena/mln/core/concept/image.hh                   |   24 +-
 milena/mln/core/concept/iterator.hh                |   13 +-
 milena/mln/core/concept/literal.hh                 |   14 +-
 milena/mln/core/concept/mesh.hh                    |   11 +-
 milena/mln/core/concept/meta_accumulator.hh        |   16 +-
 milena/mln/core/concept/meta_function.hh           |   20 +-
 milena/mln/core/concept/neighborhood.hh            |   27 +-
 milena/mln/core/concept/object.hh                  |   19 +-
 milena/mln/core/concept/pixel_iterator.hh          |   19 +-
 milena/mln/core/concept/point.hh                   |   22 +-
 milena/mln/core/concept/point_site.hh              |   53 +-
 milena/mln/core/concept/proxy.hh                   |   19 +-
 milena/mln/core/concept/pseudo_site.hh             |   21 +-
 milena/mln/core/concept/regular_grid.hh            |    8 +-
 milena/mln/core/concept/site.hh                    |   13 +-
 milena/mln/core/concept/site_iterator.hh           |   22 +-
 milena/mln/core/concept/site_proxy.hh              |   23 +-
 milena/mln/core/concept/site_set.hh                |   21 +-
 milena/mln/core/concept/value.hh                   |   17 +-
 milena/mln/core/concept/value_iterator.hh          |   20 +-
 milena/mln/core/concept/value_set.hh               |   19 +-
 milena/mln/core/concept/weighted_window.hh         |   21 +-
 milena/mln/core/concept/window.hh                  |   28 +-
 milena/mln/core/dpoints_pixter.hh                  |   16 +-
 milena/mln/core/dpsites_piter.hh                   |   14 +-
 milena/mln/core/faces_psite.hh                     |    7 +-
 milena/mln/core/image/ch_piter.hh                  |    6 +-
 milena/mln/core/image/complex_image.hh             |    8 +-
 .../mln/core/image/complex_neighborhood_piter.hh   |    6 +-
 milena/mln/core/image/complex_window_piter.hh      |    6 +-
 milena/mln/core/image/dmorph/extended.hh           |   10 +-
 milena/mln/core/image/dmorph/extension_fun.hh      |   11 +-
 milena/mln/core/image/dmorph/extension_ima.hh      |   10 +-
 milena/mln/core/image/dmorph/extension_val.hh      |    9 +-
 milena/mln/core/image/dmorph/hexa.hh               |    9 +-
 milena/mln/core/image/dmorph/hexa_piter.hh         |    7 +-
 milena/mln/core/image/dmorph/image_if.hh           |    7 +-
 milena/mln/core/image/dmorph/p2p_image.hh          |    5 +-
 milena/mln/core/image/dmorph/slice_image.hh        |    7 +-
 milena/mln/core/image/dmorph/sub_image.hh          |   11 +-
 milena/mln/core/image/dmorph/sub_image_if.hh       |    8 +-
 milena/mln/core/image/dmorph/transformed_image.hh  |    5 +-
 milena/mln/core/image/dmorph/unproject_image.hh    |    7 +-
 milena/mln/core/image/edge_image.hh                |    9 +-
 milena/mln/core/image/flat_image.hh                |   12 +-
 milena/mln/core/image/graph_window_if_piter.hh     |   13 +-
 milena/mln/core/image/graph_window_piter.hh        |   10 +-
 milena/mln/core/image/image1d.hh                   |   10 +-
 milena/mln/core/image/image2d.hh                   |   26 +-
 milena/mln/core/image/image3d.hh                   |   14 +-
 milena/mln/core/image/imorph/decorated_image.hh    |    9 +-
 milena/mln/core/image/imorph/interpolated.hh       |    7 +-
 milena/mln/core/image/imorph/labeled_image.hh      |   11 +-
 milena/mln/core/image/imorph/lazy_image.hh         |    5 +-
 milena/mln/core/image/imorph/plain.hh              |    5 +-
 milena/mln/core/image/imorph/safe.hh               |    5 +-
 milena/mln/core/image/imorph/tr_image.hh           |    5 +-
 milena/mln/core/image/vertex_image.hh              |    7 +-
 milena/mln/core/image/vmorph/cast_image.hh         |    7 +-
 milena/mln/core/image/vmorph/fun_image.hh          |    5 +-
 milena/mln/core/image/vmorph/thru_image.hh         |    7 +-
 milena/mln/core/image/vmorph/violent_cast_image.hh |    5 +-
 milena/mln/core/internal/check/image_fastest.hh    |   26 +-
 milena/mln/core/internal/classical_window_base.hh  |    5 +-
 milena/mln/core/internal/coord_impl.hh             |   40 +-
 milena/mln/core/internal/graph_psite_base.hh       |    5 +-
 milena/mln/core/internal/image_base.hh             |   15 +-
 milena/mln/core/internal/image_identity.hh         |    5 +-
 milena/mln/core/internal/image_morpher.hh          |   13 +-
 milena/mln/core/internal/labeled_image_base.hh     |    4 +-
 milena/mln/core/internal/neighb_base.hh            |    8 +-
 milena/mln/core/internal/neighb_niter_base.hh      |    8 +-
 milena/mln/core/internal/p_complex_piter_base.hh   |    5 +-
 milena/mln/core/internal/piter_adaptor.hh          |   13 +-
 milena/mln/core/internal/pseudo_site_base.hh       |    3 +-
 milena/mln/core/internal/run_image.hh              |    5 +-
 milena/mln/core/internal/set_of.hh                 |    7 +-
 milena/mln/core/internal/site_iterator_base.hh     |    7 +-
 .../core/internal/site_relative_iterator_base.hh   |    9 +-
 milena/mln/core/internal/site_set_base.hh          |    5 +-
 milena/mln/core/internal/site_set_impl.hh          |    3 +-
 milena/mln/core/internal/site_set_iterator_base.hh |   12 +-
 milena/mln/core/internal/window_base.hh            |   12 +-
 milena/mln/core/mixed_neighb.hh                    |   11 +-
 milena/mln/core/neighb.hh                          |   10 +-
 milena/mln/core/pixter1d.hh                        |    8 +-
 milena/mln/core/pixter2d.hh                        |   12 +-
 milena/mln/core/pixter3d.hh                        |   10 +-
 milena/mln/core/point.hh                           |   12 +-
 milena/mln/core/routine/duplicate.hh               |    3 +-
 milena/mln/core/routine/init.hh                    |    3 +-
 milena/mln/core/routine/initialize.hh              |    7 +-
 milena/mln/core/site_set/box.hh                    |    3 +-
 milena/mln/core/site_set/box_piter.hh              |   10 +-
 milena/mln/core/site_set/complex_psite.hh          |   14 +-
 milena/mln/core/site_set/p_array.hh                |   25 +-
 milena/mln/core/site_set/p_centered.hh             |    6 +-
 milena/mln/core/site_set/p_complex_piter.hh        |    6 +-
 milena/mln/core/site_set/p_double.hh               |   15 +-
 milena/mln/core/site_set/p_edges_psite.hh          |    6 +-
 milena/mln/core/site_set/p_faces.hh                |    4 +-
 milena/mln/core/site_set/p_graph_piter.hh          |    9 +-
 milena/mln/core/site_set/p_if.hh                   |    5 +-
 milena/mln/core/site_set/p_if_piter.hh             |    7 +-
 milena/mln/core/site_set/p_image.hh                |   11 +-
 milena/mln/core/site_set/p_key.hh                  |   10 +-
 milena/mln/core/site_set/p_line2d.hh               |    3 +-
 milena/mln/core/site_set/p_mutable_array_of.hh     |   10 +-
 milena/mln/core/site_set/p_priority.hh             |    8 +-
 milena/mln/core/site_set/p_run.hh                  |    7 +-
 milena/mln/core/site_set/p_run_piter.hh            |   10 +-
 milena/mln/core/site_set/p_set_of.hh               |    7 +-
 milena/mln/core/site_set/p_transformed.hh          |    6 +-
 milena/mln/core/site_set/p_transformed_piter.hh    |    7 +-
 milena/mln/core/site_set/p_vaccess.hh              |    6 +-
 milena/mln/core/site_set/p_vertices_psite.hh       |    6 +-
 milena/mln/core/w_window.hh                        |   11 +-
 milena/mln/core/window.hh                          |    8 +-
 milena/mln/data/abs.hh                             |    6 +-
 milena/mln/data/apply.hh                           |    6 +-
 milena/mln/data/apply.spe.hh                       |    3 +-
 milena/mln/data/approx/median.hh                   |    6 +-
 milena/mln/data/compare.hh                         |    9 +-
 milena/mln/data/compute.hh                         |    3 +-
 milena/mln/data/compute_in_window.hh               |   23 +-
 milena/mln/data/convert.hh                         |    9 +-
 milena/mln/data/fill.hh                            |    3 +-
 milena/mln/data/fill_with_image.hh                 |    6 +-
 milena/mln/data/fill_with_image.spe.hh             |   12 +-
 milena/mln/data/fill_with_value.hh                 |    6 +-
 milena/mln/data/fill_with_value.spe.hh             |    9 +-
 milena/mln/data/median.hh                          |    9 +-
 milena/mln/data/memcpy_.hh                         |    6 +-
 milena/mln/data/memset_.hh                         |    9 +-
 milena/mln/data/paste.hh                           |    6 +-
 milena/mln/data/paste.spe.hh                       |   12 +-
 milena/mln/data/paste_without_localization.hh      |   15 +-
 milena/mln/data/replace.hh                         |    6 +-
 milena/mln/data/saturate.hh                        |    9 +-
 milena/mln/data/sort_offsets.hh                    |   18 +-
 milena/mln/data/split.hh                           |    3 +-
 milena/mln/data/stretch.hh                         |   12 +-
 milena/mln/data/to_enc.hh                          |    3 +-
 milena/mln/data/transform.hh                       |   12 +-
 milena/mln/data/transform.spe.hh                   |   24 +-
 milena/mln/data/transform_inplace.hh               |   30 +-
 milena/mln/data/update.hh                          |    9 +-
 milena/mln/data/wrap.hh                            |    3 +-
 milena/mln/debug/draw_graph.hh                     |   26 +-
 milena/mln/debug/iota.hh                           |    3 +-
 milena/mln/debug/mosaic.hh                         |    3 +-
 milena/mln/debug/println.hh                        |    3 +-
 milena/mln/debug/put_word.hh                       |    4 +-
 milena/mln/debug/slices_2d.hh                      |    6 +-
 milena/mln/debug/superpose.hh                      |    3 +-
 milena/mln/debug/trace.hh                          |  218 ++++
 milena/mln/debug/z_order.hh                        |    3 +-
 milena/mln/draw/dashed_line.hh                     |    8 +-
 milena/mln/draw/line.hh                            |    8 +-
 milena/mln/essential/routine.hh                    |    5 +-
 milena/mln/extension/adjust.hh                     |   12 +-
 milena/mln/extension/adjust_duplicate.hh           |   12 +-
 milena/mln/extension/adjust_fill.hh                |   12 +-
 milena/mln/extension/duplicate.hh                  |    3 +-
 milena/mln/extension/fill.hh                       |    3 +-
 milena/mln/fun/v2b/always_false.hh                 |   74 ++
 milena/mln/fun/v2b/always_true.hh                  |   74 ++
 milena/mln/fun/v2v/round_sat.hh                    |    4 +-
 milena/mln/fun/x2x/composed.hh                     |    3 +-
 milena/mln/geom/chamfer.hh                         |    3 +-
 milena/mln/geom/crop.hh                            |    3 +-
 milena/mln/geom/crop_without_localization.hh       |    3 +-
 milena/mln/geom/horizontal_symmetry.hh             |    3 +-
 milena/mln/geom/max_ind.hh                         |    3 +-
 milena/mln/geom/min_ind.hh                         |    3 +-
 milena/mln/geom/ninds.hh                           |    3 +-
 milena/mln/geom/nsites.hh                          |    3 +-
 milena/mln/geom/rotate.hh                          |    6 +-
 milena/mln/geom/seeds2tiling.hh                    |    6 +-
 milena/mln/geom/seeds2tiling_roundness.hh          |    6 +-
 milena/mln/geom/translate.hh                       |    3 +-
 milena/mln/geom/vertical_symmetry.hh               |    3 +-
 milena/mln/graph/compute.hh                        |    3 +-
 milena/mln/graph/labeling.hh                       |    3 +-
 milena/mln/graph/to_neighb.hh                      |    3 +-
 milena/mln/graph/to_win.hh                         |    3 +-
 milena/mln/histo/compute.hh                        |    3 +-
 milena/mln/histo/equalize.hh                       |    3 +-
 milena/mln/io/cloud/load.hh                        |    3 +-
 milena/mln/io/cloud/save.hh                        |    3 +-
 milena/mln/io/dicom/get_header.hh                  |    3 +-
 milena/mln/io/dicom/load.hh                        |    9 +-
 milena/mln/io/dump/get_header.hh                   |    3 +-
 milena/mln/io/dump/load.hh                         |    3 +-
 milena/mln/io/dump/save.hh                         |    3 +-
 milena/mln/io/fits/load.hh                         |    3 +-
 milena/mln/io/fld/load.hh                          |    3 +-
 milena/mln/io/fld/save.hh                          |    3 +-
 milena/mln/io/magick/internal/init_magick.hh       |   71 ++
 milena/mln/io/magick/load.hh                       |   35 +-
 milena/mln/io/magick/save.hh                       |   40 +-
 milena/mln/io/off/load.hh                          |    9 +-
 milena/mln/io/off/save.hh                          |   12 +-
 milena/mln/io/pbm/load.hh                          |    3 +-
 milena/mln/io/pbm/save.hh                          |    3 +-
 milena/mln/io/pbms/load.hh                         |    3 +-
 milena/mln/io/pdf/get_header.hh                    |   15 +-
 milena/mln/io/pdf/load.hh                          |  106 ++-
 milena/mln/io/pfm/load.hh                          |    3 +-
 milena/mln/io/pfm/save.hh                          |    3 +-
 milena/mln/io/pgm/load.hh                          |    6 +-
 milena/mln/io/pgm/save.hh                          |    3 +-
 milena/mln/io/pgms/load.hh                         |    3 +-
 milena/mln/io/plot/load.hh                         |    3 +-
 milena/mln/io/plot/save.hh                         |    9 +-
 milena/mln/io/pnm/load.hh                          |    6 +-
 milena/mln/io/pnm/save.hh                          |    3 +-
 milena/mln/io/pnms/load.hh                         |    6 +-
 milena/mln/io/ppm/load.hh                          |    6 +-
 milena/mln/io/ppms/load.hh                         |    3 +-
 milena/mln/io/raw/get_header.hh                    |    3 +-
 milena/mln/io/raw/load.hh                          |    3 +-
 milena/mln/io/raw/save.hh                          |    3 +-
 milena/mln/io/tiff/load.hh                         |    3 +-
 milena/mln/io/txt/save.hh                          |    3 +-
 milena/mln/labeling/background.hh                  |    7 +-
 milena/mln/labeling/blobs.hh                       |    3 +-
 milena/mln/labeling/blobs_and_compute.hh           |    3 +-
 milena/mln/labeling/colorize.hh                    |   50 +-
 milena/mln/labeling/compute.hh                     |  130 ++--
 milena/mln/labeling/compute_image.hh               |   83 +-
 milena/mln/labeling/fill_holes.hh                  |    3 +-
 milena/mln/labeling/flat_zones.hh                  |   21 +-
 milena/mln/labeling/foreground.hh                  |   11 +-
 milena/mln/labeling/mean_values.hh                 |   20 +-
 milena/mln/labeling/n_max.hh                       |   78 +-
 milena/mln/labeling/pack.hh                        |   40 +-
 milena/mln/labeling/regional_maxima.hh             |   22 +-
 milena/mln/labeling/regional_minima.hh             |   22 +-
 milena/mln/labeling/relabel.hh                     |   83 +-
 milena/mln/labeling/superpose.hh                   |    8 +-
 milena/mln/labeling/value.hh                       |   27 +-
 milena/mln/labeling/value.spe.hh                   |    3 +-
 milena/mln/labeling/value_and_compute.hh           |   25 +-
 milena/mln/labeling/wrap.hh                        |   38 +-
 milena/mln/linear/.#ch_convolve.hh                 |    1 -
 milena/mln/linear/convolve.hh                      |    9 +-
 milena/mln/linear/convolve_2x1d.hh                 |    3 +-
 milena/mln/linear/convolve_directional.hh          |    3 +-
 milena/mln/linear/gaussian_1d.hh                   |    3 +-
 milena/mln/linear/gaussian_directional_2d.hh       |    3 +-
 milena/mln/linear/lap.hh                           |   12 +-
 milena/mln/linear/log.hh                           |   39 +-
 milena/mln/linear/sobel_2d.hh                      |   12 +-
 milena/mln/logical/and.hh                          |    6 +-
 milena/mln/logical/and_not.hh                      |    6 +-
 milena/mln/logical/not.hh                          |    6 +-
 milena/mln/logical/not.spe.hh                      |    6 +-
 milena/mln/logical/or.hh                           |    6 +-
 milena/mln/logical/xor.hh                          |    6 +-
 milena/mln/make/dual_neighb.hh                     |    3 +-
 milena/mln/make/dummy_p_edges.hh                   |    3 +-
 milena/mln/make/dummy_p_vertices.hh                |    3 +-
 milena/mln/make/edge_image.hh                      |   18 +-
 milena/mln/make/influence_zone_adjacency_graph.hh  |    6 +-
 milena/mln/make/p_edges_with_mass_centers.hh       |    3 +-
 milena/mln/make/p_vertices_with_mass_centers.hh    |    3 +-
 milena/mln/make/rag_and_labeled_wsl.hh             |    6 +-
 milena/mln/make/region_adjacency_graph.hh          |   10 +-
 milena/mln/make/relabelfun.hh                      |    6 +-
 milena/mln/make/vertex_image.hh                    |    6 +-
 milena/mln/make/w_window.hh                        |    3 +-
 milena/mln/morpho/algebraic_filter.hh              |    3 +-
 milena/mln/morpho/all.hh                           |    1 -
 milena/mln/morpho/approx/dilation.hh               |    9 +-
 milena/mln/morpho/approx/erosion.hh                |    9 +-
 milena/mln/morpho/closing/algebraic.hh             |    3 +-
 milena/mln/morpho/closing/approx/structural.hh     |    3 +-
 milena/mln/morpho/closing/area.hh                  |    3 +-
 milena/mln/morpho/closing/area_on_vertices.hh      |    3 +-
 milena/mln/morpho/closing/height.hh                |    3 +-
 milena/mln/morpho/closing/leveling.hh              |    3 +-
 milena/mln/morpho/closing/structural.hh            |    3 +-
 milena/mln/morpho/closing/sum.hh                   |    3 +-
 milena/mln/morpho/closing/volume.hh                |    3 +-
 milena/mln/morpho/complementation.hh               |    6 +-
 milena/mln/morpho/contrast.hh                      |    3 +-
 milena/mln/morpho/dilation.hh                      |    9 +-
 milena/mln/morpho/elementary/closing.hh            |    3 +-
 milena/mln/morpho/elementary/dilation.hh           |    3 +-
 milena/mln/morpho/elementary/erosion.hh            |    3 +-
 milena/mln/morpho/elementary/gradient.hh           |   12 +-
 milena/mln/morpho/elementary/gradient_external.hh  |    3 +-
 milena/mln/morpho/elementary/gradient_internal.hh  |    3 +-
 milena/mln/morpho/elementary/laplacian.hh          |    3 +-
 milena/mln/morpho/elementary/like_ero_fun.hh       |    6 +-
 milena/mln/morpho/elementary/like_ero_set.hh       |    6 +-
 milena/mln/morpho/elementary/opening.hh            |    3 +-
 milena/mln/morpho/elementary/top_hat.hh            |    9 +-
 milena/mln/morpho/erosion.hh                       |    9 +-
 milena/mln/morpho/essential.hh                     |    1 -
 milena/mln/morpho/general.hh                       |    9 +-
 milena/mln/morpho/general.spe.hh                   |   21 +-
 milena/mln/morpho/gradient.hh                      |    9 +-
 milena/mln/morpho/hit_or_miss.hh                   |   21 +-
 milena/mln/morpho/laplacian.hh                     |    6 +-
 milena/mln/morpho/leveling_filter.hh               |    3 +-
 milena/mln/morpho/line_gradient.hh                 |    3 +-
 milena/mln/morpho/meyer_wst.hh                     |  222 ----
 milena/mln/morpho/min.hh                           |    6 +-
 milena/mln/morpho/minus.hh                         |    3 +-
 milena/mln/morpho/opening/algebraic.hh             |    3 +-
 milena/mln/morpho/opening/approx/structural.hh     |    3 +-
 milena/mln/morpho/opening/area.hh                  |    3 +-
 milena/mln/morpho/opening/area_on_vertices.hh      |    3 +-
 milena/mln/morpho/opening/height.hh                |    3 +-
 milena/mln/morpho/opening/leveling.hh              |    3 +-
 milena/mln/morpho/opening/structural.hh            |    3 +-
 milena/mln/morpho/opening/volume.hh                |    3 +-
 milena/mln/morpho/plus.hh                          |    3 +-
 milena/mln/morpho/rank_filter.hh                   |   12 +-
 .../reconstruction/by_dilation/union_find.hh       |   11 +-
 .../morpho/reconstruction/by_erosion/union_find.hh |   10 +-
 milena/mln/morpho/skeleton_constrained.hh          |    9 +-
 milena/mln/morpho/thick_miss.hh                    |    3 +-
 milena/mln/morpho/thickening.hh                    |    3 +-
 milena/mln/morpho/thin_fit.hh                      |    3 +-
 milena/mln/morpho/thinning.hh                      |    3 +-
 milena/mln/morpho/top_hat.hh                       |    9 +-
 milena/mln/morpho/tree/component_tree.hh           |    6 +-
 milena/mln/morpho/tree/compute_attribute_image.hh  |    6 +-
 milena/mln/morpho/tree/compute_parent.hh           |    6 +-
 milena/mln/morpho/tree/dual_input_tree.hh          |    3 +-
 milena/mln/morpho/tree/filter/direct.hh            |    3 +-
 milena/mln/morpho/tree/filter/filter.hh            |    3 +-
 milena/mln/morpho/tree/filter/max.hh               |    3 +-
 milena/mln/morpho/tree/filter/min.hh               |    3 +-
 milena/mln/morpho/tree/filter/subtractive.hh       |    3 +-
 milena/mln/morpho/tree/impl/dual_hqueue.hh         |    3 +-
 milena/mln/morpho/tree/impl/dual_union_find.hh     |    3 +-
 milena/mln/morpho/tree/max.hh                      |    3 +-
 milena/mln/morpho/watershed/flooding.hh            |    9 +-
 milena/mln/morpho/watershed/superpose.hh           |    3 +-
 milena/mln/opt/at.hh                               |    5 +-
 milena/mln/registration/all.hh                     |   49 +
 milena/mln/registration/icp.hh                     |   12 +-
 milena/mln/set/card.hh                             |    9 +-
 milena/mln/set/compute.hh                          |    9 +-
 milena/mln/set/compute_with_weights.hh             |   15 +-
 milena/mln/set/diff.hh                             |    3 +-
 milena/mln/set/get.hh                              |    3 +-
 milena/mln/set/has.hh                              |    3 +-
 milena/mln/set/inter.hh                            |    3 +-
 milena/mln/set/sym_diff.hh                         |    3 +-
 milena/mln/set/uni.hh                              |    3 +-
 milena/mln/set/unique.hh                           |    3 +-
 milena/mln/subsampling/antialiased.hh              |   13 +-
 milena/mln/test/positive.hh                        |    3 +-
 milena/mln/test/predicate.hh                       |    9 +-
 milena/mln/topo/complex.hh                         |   44 +-
 milena/mln/topo/skeleton/crest.hh                  |    9 +-
 milena/mln/trace/all.hh                            |   52 -
 milena/mln/trace/entering.hh                       |   89 --
 milena/mln/trace/essential.hh                      |   36 -
 milena/mln/trace/exiting.hh                        |  118 --
 milena/mln/trace/quiet.hh                          |   84 --
 milena/mln/trace/resume.hh                         |   60 -
 milena/mln/trace/stop.hh                           |   63 --
 milena/mln/trace/warning.hh                        |   64 --
 milena/mln/trait/ch_value.hh                       |   66 ++-
 milena/mln/trait/concrete.hh                       |   65 ++-
 .../distance_and_closest_point_geodesic.hh         |    6 +-
 .../distance_and_influence_zone_geodesic.hh        |    3 +-
 milena/mln/transform/distance_front.hh             |    3 +-
 milena/mln/transform/distance_geodesic.hh          |    3 +-
 milena/mln/transform/hough.hh                      |    3 +-
 milena/mln/transform/influence_zone_front.hh       |    3 +-
 milena/mln/transform/influence_zone_geodesic.hh    |    6 +-
 .../transform/influence_zone_geodesic_saturated.hh |    3 +-
 milena/mln/upscaling/art/scale2x.hh                |    3 +-
 milena/mln/upscaling/art/scale3x.hh                |    3 +-
 milena/mln/util/array.hh                           |   20 +-
 milena/mln/util/timer.hh                           |   15 +-
 milena/mln/util/tree_fast_to_image.hh              |    6 +-
 milena/mln/util/tree_to_fast.hh                    |    8 +-
 milena/mln/util/tree_to_image.hh                   |   21 +-
 milena/mln/value/builtin/symbolics.hh              |    6 +-
 milena/mln/value/hsl.hh                            |   24 +-
 milena/mln/value/int_s.hh                          |    9 +-
 milena/mln/value/int_s16.hh                        |   15 +-
 milena/mln/value/int_s24.hh                        |   15 +-
 milena/mln/value/int_s32.hh                        |   15 +-
 milena/mln/value/int_s8.hh                         |   16 +-
 milena/mln/value/int_u.hh                          |   12 +-
 milena/mln/value/int_u12.hh                        |   15 +-
 milena/mln/value/int_u16.hh                        |   15 +-
 milena/mln/value/int_u24.hh                        |   15 +-
 milena/mln/value/int_u32.hh                        |   15 +-
 milena/mln/value/int_u8.hh                         |   15 +-
 milena/mln/value/internal/gray_f.hxx               |    8 +-
 milena/mln/value/label.hh                          |   15 +-
 milena/mln/value/label_16.hh                       |   15 +-
 milena/mln/value/label_32.hh                       |    9 +-
 milena/mln/value/label_8.hh                        |   15 +-
 milena/mln/value/qt/rgb32.hh                       |   15 +-
 milena/mln/value/rgb.hh                            |   10 +-
 milena/mln/value/rgb16.hh                          |   17 +-
 milena/mln/value/rgb8.hh                           |   17 +-
 milena/mln/win/diff.hh                             |    3 +-
 milena/mln/win/disk2d.hh                           |   19 +-
 milena/mln/win/hline2d.hh                          |   11 +-
 milena/mln/win/inter.hh                            |    3 +-
 milena/mln/win/rectangle2d.hh                      |   13 +-
 milena/mln/win/segment1d.hh                        |   11 +-
 milena/mln/win/shift.hh                            |    3 +-
 milena/mln/win/sline3d.hh                          |   11 +-
 milena/mln/win/sphere3d.hh                         |   18 +-
 milena/mln/win/sym.hh                              |    6 +-
 milena/mln/win/vline2d.hh                          |   11 +-
 milena/mln/world/binary_2d/enlarge.hh              |    3 +-
 milena/mln/world/binary_2d/subsample.hh            |   27 +-
 milena/mln/world/inter_pixel/compute.hh            |    3 +-
 .../mln/world/inter_pixel/dim2/make_edge_image.hh  |    3 +-
 milena/mln/world/inter_pixel/full2image.hh         |    3 +-
 milena/mln/world/inter_pixel/immerse.hh            |    3 +-
 milena/mln/world/rgb/invert.hh                     |    9 +-
 milena/mln/world/rgb/invert.spe.hh                 |    9 +-
 milena/sandbox/anthony/Makefile                    |   24 +
 milena/sandbox/anthony/src/scale_space.cc          |  174 +++
 milena/tests/accu/site_set/rectangularity.cc       |    4 +-
 milena/tests/algebra/mat.cc                        |   19 +-
 milena/tests/arith/diff_abs.cc                     |    2 +-
 milena/tests/arith/minus.cc                        |    2 +-
 milena/tests/arith/plus.cc                         |    4 +-
 milena/tests/arith/revert.cc                       |    2 +-
 milena/tests/arith/times.cc                        |    2 +-
 milena/tests/core/image/edge_image.cc              |  146 ++--
 milena/tests/core/image/line_graph_image.cc        |  140 ++--
 milena/tests/core/other/var.cc                     |    8 +-
 milena/tests/data.hh.in                            |    3 +
 milena/tests/data/fill_with_image.cc               |    4 +-
 milena/tests/data/paste.cc                         |    4 +-
 milena/tests/geom/nsites.cc                        |    2 +-
 milena/tests/io/fld/fld1d.cc                       |    9 +-
 milena/tests/io/fld/fld2d.cc                       |   21 +-
 milena/tests/io/fld/fld3d.cc                       |    9 +-
 milena/tests/io/magick/load.cc                     |   18 +-
 milena/tests/io/magick/save.cc                     |   19 +-
 milena/tests/labeling/Makefile.am                  |    8 +-
 milena/tests/labeling/foreground.cc                |   34 +-
 milena/tests/labeling/foreground.ref.pgm           |  Bin 0 -> 81654 bytes
 milena/tests/labeling/n_max.cc                     |    5 +-
 milena/tests/linear/gaussian.cc                    |    6 +-
 milena/tests/morpho/Makefile.am                    |    8 +-
 .../morpho/artificial_line_graph_image_wst.cc      |   19 +-
 milena/tests/morpho/closing/algebraic.cc           |    2 +-
 milena/tests/morpho/elementary/closing.cc          |    2 +-
 milena/tests/morpho/elementary/dilation.cc         |    2 +-
 milena/tests/morpho/elementary/erosion.cc          |    2 +-
 milena/tests/morpho/elementary/opening.cc          |    2 +-
 milena/tests/morpho/elementary/top_hat.cc          |    2 +-
 milena/tests/morpho/general.cc                     |    4 +-
 milena/tests/morpho/graph_image_morpho.cc          |    2 +-
 milena/tests/morpho/graph_image_wst.cc             |   15 +-
 milena/tests/morpho/lena_line_graph_image_wst1.cc  |   18 +-
 milena/tests/morpho/lena_line_graph_image_wst2.cc  |   19 +-
 milena/tests/morpho/line_graph_image_morpho.cc     |   49 +-
 milena/tests/morpho/line_graph_image_wst.cc        |   57 +-
 milena/tests/morpho/meyer_wst.cc                   |   56 -
 milena/tests/morpho/meyer_wst_long.cc              |   73 --
 milena/tests/morpho/opening/algebraic.cc           |    2 +-
 milena/tests/morpho/top_hat.cc                     |    2 +-
 milena/tests/opt/at.cc                             |    4 +-
 milena/tests/opt/element.cc                        |    4 +-
 milena/tests/opt/value.cc                          |    5 +-
 milena/tests/trait/op/plus.cc                      |    6 +-
 milena/tests/unit_test/Makefile.am                 |    1 +
 milena/tests/unit_test/cond_tests_magickxx         |    1 +
 milena/tests/unit_test/cond_tests_poppler          |    2 +
 milena/tests/unit_test/unit-tests.mk               |   33 +-
 milena/tools/area_flooding.cc                      |    7 +-
 scribo/ChangeLog                                   |  712 ++++++++++++
 scribo/common.mk                                   |    8 +-
 scribo/demo/viewer/image_region.hh                 |    6 +-
 scribo/demo/viewer/main.cc                         |    2 -
 scribo/demo/xml2doc/main.cc                        |   28 +-
 scribo/doc/Doxyfile.in                             |   36 +-
 scribo/doc/DoxygenLayout.xml                       |    2 +-
 scribo/doc/Makefile.am                             |   22 +-
 scribo/doc/scribo/binarization/binarization.dox    |    8 +-
 scribo/doc/scribo/binarization/kim.dox             |   23 +
 scribo/doc/scribo/binarization/otsu.dox            |   11 +-
 scribo/doc/scribo/binarization/wolf.dox            |    6 +
 scribo/doc/scribo/filter/component_groups.dox      |    2 +-
 scribo/doc/scribo/filter/component_links.dox       |    2 +-
 scribo/doc/scribo/filter/components.dox            |    2 +-
 scribo/doc/scribo/filter/elements.dox              |    2 +-
 scribo/doc/scribo/filter/line_links.dox            |    4 +-
 scribo/doc/scribo/filter/paragraphs.dox            |    4 +-
 scribo/doc/scribo/layout/layout.dox                |    6 +
 scribo/doc/scribo/namespaces.dox                   |    7 +
 scribo/doc/scribo/primitive/extract/components.dox |    7 +
 scribo/doc/scribo/primitive/extract/extract.dox    |    7 +
 scribo/doc/scribo/primitive/extract/separators.dox |    8 +-
 scribo/headers.mk                                  |   31 +-
 scribo/sandbox/icdar_13_table/src/disjoint_set.hh  |   54 +
 scribo/sandbox/icdar_13_table/src/new.cc           |  165 +++-
 scribo/scribo/binarization/all.hh                  |    6 +
 scribo/scribo/binarization/global_threshold.hh     |    3 +-
 .../scribo/binarization/global_threshold_auto.hh   |    5 +-
 .../internal/global_max_stddev_functor.hh          |  110 ++
 .../binarization/internal/local_threshold_core.hh  |   33 +-
 .../binarization/internal/niblack_formula.hh       |    2 +-
 .../binarization/internal/niblack_functor.hh       |   14 +-
 .../binarization/internal/niblack_functor_fast.hh  |   12 +
 .../internal/niblack_threshold_functor.hh          |   18 +-
 .../binarization/internal/sauvola_functor.hh       |   18 +
 .../binarization/internal/sauvola_ms_functor.hh    |   18 +-
 .../internal/sauvola_threshold_functor.hh          |   22 +-
 .../scribo/binarization/internal/singh_formula.hh  |   13 +-
 .../scribo/binarization/internal/singh_functor.hh  |   14 +
 .../scribo/binarization/internal/wolf_functor.hh   |   17 +-
 .../binarization/internal/wolf_functor_fast.hh     |   15 +
 scribo/scribo/binarization/kim.hh                  |   25 +-
 scribo/scribo/binarization/local_threshold.hh      |    9 +-
 scribo/scribo/binarization/niblack.hh              |    3 +-
 scribo/scribo/binarization/niblack_fast.hh         |   23 +-
 scribo/scribo/binarization/niblack_threshold.hh    |   17 +-
 scribo/scribo/binarization/otsu.hh                 |   10 +-
 scribo/scribo/binarization/otsu_threshold.hh       |   15 +-
 scribo/scribo/binarization/sauvola.hh              |    3 +-
 scribo/scribo/binarization/sauvola_ms.hh           |   75 +-
 scribo/scribo/binarization/sauvola_ms_split.hh     |   26 +-
 scribo/scribo/binarization/sauvola_threshold.hh    |    5 +-
 scribo/scribo/binarization/singh.hh                |   13 +-
 scribo/scribo/binarization/wolf.hh                 |   60 +-
 scribo/scribo/binarization/wolf_fast.hh            |   56 +-
 scribo/scribo/canvas/integral_browsing.hh          |   14 +-
 scribo/scribo/convert/from_base64.hh               |    9 +-
 scribo/scribo/convert/to_base64.hh                 |    3 +-
 scribo/scribo/core/central_sites.hh                |    3 +-
 scribo/scribo/core/component_info.hh               |   17 +-
 scribo/scribo/core/component_set.hh                |  190 +++-
 scribo/scribo/core/concept/serializable.hh         |    9 +-
 scribo/scribo/core/document.hh                     |   58 +-
 scribo/scribo/core/erase_objects.hh                |    3 +-
 scribo/scribo/core/init_integral_image.hh          |    3 +-
 scribo/scribo/core/line_info.hh                    |    4 +-
 scribo/scribo/core/line_set.hh                     |   23 +-
 scribo/scribo/core/object_links.hh                 |   61 +-
 scribo/scribo/core/paragraph_info.hh               |    4 +-
 scribo/scribo/core/paragraph_set.hh                |    7 +
 scribo/scribo/core/tag/component.hh                |   56 +-
 scribo/scribo/debug/alignment_decision_image.hh    |    3 +-
 scribo/scribo/debug/bboxes_enlarged_image.hh       |    3 +-
 scribo/scribo/debug/bboxes_image.hh                |    9 +-
 scribo/scribo/debug/char_space_image.hh            |    3 +-
 scribo/scribo/debug/decision_image.hh              |    6 +-
 scribo/scribo/debug/highlight_text_area.hh         |   12 +-
 scribo/scribo/debug/line_info_image.hh             |    3 +-
 scribo/scribo/debug/linked_bboxes_image.hh         |    9 +-
 scribo/scribo/debug/links_decision_image.hh        |    3 +-
 scribo/scribo/debug/links_image.hh                 |    8 +-
 scribo/scribo/debug/logger.hh                      |   70 +-
 .../scribo/debug/looks_like_a_text_line_image.hh   |    3 +-
 scribo/scribo/debug/mean_and_base_lines_image.hh   |    3 +-
 scribo/scribo/debug/save_comp_diff.hh              |    3 +-
 scribo/scribo/debug/save_label_image.hh            |    3 +-
 scribo/scribo/debug/save_table_image.hh            |    6 +-
 scribo/scribo/debug/text_areas_image.hh            |    3 +-
 scribo/scribo/draw/bounding_box_links.hh           |    9 +-
 scribo/scribo/draw/bounding_boxes.hh               |    6 +-
 scribo/scribo/draw/groups_bboxes.hh                |    3 +-
 scribo/scribo/draw/line_components.hh              |    3 +-
 scribo/scribo/estim/components_features.hh         |    3 +-
 scribo/scribo/estim/font_boldness.hh               |   12 +-
 scribo/scribo/estim/font_color.hh                  |    9 +-
 scribo/scribo/estim/internal/compute_skeleton.hh   |    3 +-
 scribo/scribo/estim/object_groups_mean_width.hh    |    3 +-
 scribo/scribo/filter/common/objects_photo.hh       |    3 +-
 scribo/scribo/filter/images_in_paragraph.hh        |    5 +-
 scribo/scribo/filter/internal/alignment_angle.hh   |   11 +-
 scribo/scribo/filter/internal/component_aligned.hh |    3 +-
 scribo/scribo/filter/internal/compute.hh           |    6 +-
 scribo/scribo/filter/object_groups_mean_width.hh   |    3 +-
 scribo/scribo/filter/object_groups_size_ratio.hh   |    3 +-
 scribo/scribo/filter/object_groups_small.hh        |    3 +-
 scribo/scribo/filter/object_groups_with_holes.hh   |    7 +-
 scribo/scribo/filter/object_links_aligned.hh       |    3 +-
 scribo/scribo/filter/object_links_bbox_h_ratio.hh  |    3 +-
 scribo/scribo/filter/object_links_bbox_overlap.hh  |    3 +-
 scribo/scribo/filter/object_links_bbox_ratio.hh    |    3 +-
 scribo/scribo/filter/object_links_bbox_w_ratio.hh  |    3 +-
 .../scribo/filter/object_links_bottom_aligned.hh   |    3 +-
 .../scribo/filter/object_links_center_aligned.hh   |    3 +-
 scribo/scribo/filter/object_links_left_aligned.hh  |    3 +-
 .../filter/object_links_non_aligned_simple.hh      |    3 +-
 scribo/scribo/filter/object_links_right_aligned.hh |    3 +-
 scribo/scribo/filter/object_links_top_aligned.hh   |    3 +-
 scribo/scribo/filter/objects_h_thick.hh            |    6 +-
 scribo/scribo/filter/objects_h_thin.hh             |    6 +-
 scribo/scribo/filter/objects_in_borders.hh         |  142 +++
 scribo/scribo/filter/objects_large.hh              |    6 +-
 scribo/scribo/filter/objects_on_border.hh          |    3 +-
 scribo/scribo/filter/objects_size_ratio.hh         |    3 +-
 scribo/scribo/filter/objects_small.hh              |    6 +-
 scribo/scribo/filter/objects_thick.hh              |    6 +-
 scribo/scribo/filter/objects_thin.hh               |    6 +-
 scribo/scribo/filter/objects_v_thick.hh            |    6 +-
 scribo/scribo/filter/objects_v_thin.hh             |    6 +-
 scribo/scribo/filter/objects_with_holes.hh         |    8 +-
 scribo/scribo/filter/paragraphs_bbox_overlap.hh    |    3 +-
 scribo/scribo/filter/paragraphs_in_borders.hh      |   53 +-
 scribo/scribo/filter/paragraphs_in_image.hh        |    3 +-
 scribo/scribo/filter/separators_in_borders.hh      |   66 +-
 scribo/scribo/filter/separators_in_element.hh      |    3 +-
 scribo/scribo/filter/separators_in_paragraph.hh    |    3 +-
 scribo/scribo/filter/separators_vert_in_borders.hh |   54 +-
 scribo/scribo/io/img/save.hh                       |    8 +-
 scribo/scribo/io/text_boxes/save.hh                |    3 +-
 scribo/scribo/io/xml/internal/save_image_to_xml.hh |    3 +-
 scribo/scribo/io/xml/save.hh                       |    6 +-
 scribo/scribo/layout/xy_cut.hh                     |   32 +-
 scribo/scribo/make/debug_filename.hh               |    8 +-
 scribo/scribo/make/influence_zone_graph.hh         |    3 +-
 scribo/scribo/make/text_blocks_image.hh            |    3 +-
 scribo/scribo/make/text_components_image.hh        |    3 +-
 scribo/scribo/postprocessing/fill_object_holes.hh  |   16 +-
 .../postprocessing/images_to_drop_capital.hh       |    3 +-
 scribo/scribo/preprocessing/crop.hh                |    3 +-
 .../preprocessing/crop_without_localization.hh     |    3 +-
 scribo/scribo/preprocessing/denoise.hh             |    3 +-
 scribo/scribo/preprocessing/denoise_bg.hh          |    3 +-
 scribo/scribo/preprocessing/denoise_fg.hh          |    3 +-
 scribo/scribo/preprocessing/deskew.hh              |    5 +-
 scribo/scribo/preprocessing/deskew_crop.hh         |    3 +-
 .../scribo/preprocessing/homogeneous_contrast.hh   |    3 +-
 scribo/scribo/preprocessing/rotate_90.hh           |    3 +-
 scribo/scribo/preprocessing/split_bg_fg.hh         |   12 +-
 scribo/scribo/primitive/extract/alignments.hh      |   11 +-
 scribo/scribo/primitive/extract/canvas.hh          |    3 +-
 scribo/scribo/primitive/extract/cells.hh           |    3 +-
 scribo/scribo/primitive/extract/components.hh      |   46 +-
 .../primitive/extract/horizontal_separators.hh     |    3 +-
 scribo/scribo/primitive/extract/internal/union.hh  |    2 +-
 .../scribo/primitive/extract/lines_discontinued.hh |    3 +-
 .../primitive/extract/lines_h_discontinued.hh      |    3 +-
 scribo/scribo/primitive/extract/lines_h_pattern.hh |    3 +-
 scribo/scribo/primitive/extract/lines_h_single.hh  |   12 +-
 scribo/scribo/primitive/extract/lines_h_thick.hh   |    3 +-
 .../primitive/extract/lines_h_thick_and_single.hh  |    3 +-
 .../primitive/extract/lines_h_thick_and_thin.hh    |    3 +-
 scribo/scribo/primitive/extract/lines_pattern.hh   |    9 +-
 scribo/scribo/primitive/extract/lines_thick.hh     |    3 +-
 .../primitive/extract/lines_v_discontinued.hh      |    3 +-
 scribo/scribo/primitive/extract/lines_v_pattern.hh |    3 +-
 scribo/scribo/primitive/extract/lines_v_single.hh  |    8 +-
 scribo/scribo/primitive/extract/lines_v_thick.hh   |    3 +-
 .../primitive/extract/lines_v_thick_and_single.hh  |    3 +-
 scribo/scribo/primitive/extract/non_text.hh        |    5 +-
 scribo/scribo/primitive/extract/non_text_hdoc.hh   |    5 +-
 scribo/scribo/primitive/extract/non_text_kmean.hh  |    5 +-
 scribo/scribo/primitive/extract/separators.hh      |    3 +-
 .../primitive/extract/separators_nonvisible.hh     |    3 +-
 .../primitive/extract/vertical_separators.hh       |    3 +-
 scribo/scribo/primitive/group/apply.hh             |    6 +-
 scribo/scribo/primitive/group/from_double_link.hh  |    3 +-
 .../scribo/primitive/group/from_double_link_any.hh |    3 +-
 scribo/scribo/primitive/group/from_graph.hh        |    3 +-
 scribo/scribo/primitive/group/from_single_link.hh  |    3 +-
 scribo/scribo/primitive/identify.hh                |    8 +-
 .../scribo/primitive/internal/find_graph_link.hh   |    3 +-
 scribo/scribo/primitive/internal/rd.hh             |    6 +-
 .../scribo/primitive/internal/update_graph_link.hh |    3 +-
 scribo/scribo/primitive/link/compute.hh            |    3 +-
 scribo/scribo/primitive/link/compute_several.hh    |    3 +-
 .../primitive/link/internal/compute_anchor.hh      |    4 +-
 .../primitive/link/internal/find_several_links.hh  |    4 +-
 .../primitive/link/internal/link_functor_base.hh   |    2 +-
 scribo/scribo/primitive/link/merge_double_link.hh  |    3 +-
 .../link/merge_double_link_closest_aligned.hh      |    5 +-
 scribo/scribo/primitive/link/with_graph.hh         |    3 +-
 scribo/scribo/primitive/link/with_rag.hh           |    3 +-
 .../scribo/primitive/link/with_several_graphes.hh  |    3 +-
 .../primitive/link/with_several_left_links.hh      |    3 +-
 .../link/with_several_right_closest_links.hh       |    3 +-
 .../primitive/link/with_several_right_links.hh     |    3 +-
 .../link/with_several_right_links_overlap.hh       |    3 +-
 .../scribo/primitive/link/with_single_down_link.hh |    3 +-
 .../scribo/primitive/link/with_single_left_link.hh |    3 +-
 .../link/with_single_left_link_dmax_ratio.hh       |    3 +-
 .../with_single_left_link_dmax_ratio_aligned.hh    |   14 +-
 .../primitive/link/with_single_right_link.hh       |    3 +-
 .../link/with_single_right_link_bottom.hh          |    3 +-
 .../link/with_single_right_link_dmax_ratio.hh      |    3 +-
 .../with_single_right_link_dmax_ratio_aligned.hh   |    3 +-
 .../primitive/link/with_single_right_link_top.hh   |    3 +-
 .../scribo/primitive/link/with_single_up_link.hh   |    3 +-
 scribo/scribo/primitive/merge/components.hh        |    3 +-
 .../primitive/regroup/from_single_left_link.hh     |    3 +-
 .../regroup/from_single_left_link_wrt_h_ratio.hh   |    3 +-
 scribo/scribo/primitive/remove/separators.hh       |    3 +-
 scribo/scribo/subsampling/bilinear.hh              |    7 +-
 scribo/scribo/subsampling/integral.hh              |   12 +-
 scribo/scribo/subsampling/integral_single_image.hh |   12 +-
 scribo/scribo/table/align_lines_horizontaly.hh     |    3 +-
 scribo/scribo/table/align_lines_verticaly.hh       |    3 +-
 scribo/scribo/table/connect_horizontal_lines.hh    |    3 +-
 scribo/scribo/table/connect_vertical_lines.hh      |    3 +-
 scribo/scribo/table/erase.hh                       |    3 +-
 scribo/scribo/table/extract.hh                     |    3 +-
 scribo/scribo/table/internal/align_lines.hh        |    3 +-
 scribo/scribo/table/internal/connect_lines.hh      |    3 +-
 scribo/scribo/table/internal/repair_lines.hh       |    3 +-
 scribo/scribo/table/rebuild.hh                     |    3 +-
 scribo/scribo/table/repair_horizontal_lines.hh     |    3 +-
 scribo/scribo/table/repair_vertical_lines.hh       |    3 +-
 scribo/scribo/text/clean.hh                        |    3 +-
 scribo/scribo/text/clean_inplace.hh                |    3 +-
 scribo/scribo/text/extract_lines.hh                |    6 +-
 scribo/scribo/text/extract_lines_with_features.hh  |    3 +-
 scribo/scribo/text/extract_lines_wo_merge.hh       |    3 +-
 scribo/scribo/text/extract_paragraphs_hdoc.hh      |    5 +-
 scribo/scribo/text/link_lines.hh                   |    8 +-
 scribo/scribo/text/look_like_text_lines.hh         |    6 +-
 scribo/scribo/text/merging_hdoc.hh                 |  112 +--
 scribo/scribo/text/paragraphs_closing.hh           |    3 +-
 scribo/scribo/text/recognition.hh                  |   12 +-
 .../internal/text_in_doc_preprocess_functor.hh     |    2 +-
 .../toolchain/internal/text_in_picture_functor.hh  |   22 +-
 scribo/scribo/toolchain/nepomuk/text_extraction.hh |    3 +-
 scribo/scribo/toolchain/text_in_doc_preprocess.hh  |    5 +-
 scribo/scribo/toolchain/text_in_picture.hh         |    3 +-
 scribo/scribo/upsampling/bs2x.hh                   |    3 +-
 scribo/scribo/upsampling/eagle.hh                  |    3 +-
 scribo/scribo/util/box_intersection.hh             |    3 +-
 scribo/scribo/util/box_is_included.hh              |    3 +-
 scribo/scribo/util/component_precise_outline.hh    |   13 +-
 scribo/scribo/util/compute_sub_domains.hh          |    3 +-
 scribo/scribo/util/hex_to_color.hh                 |    3 +-
 scribo/scribo/util/init_integral_image.hh          |   12 +-
 scribo/src/afp/regroup.hh                          |    5 +-
 scribo/src/binarization/global_threshold.cc        |    9 +-
 scribo/src/binarization/kim.cc                     |    7 +-
 scribo/src/binarization/niblack.cc                 |    5 +-
 scribo/src/binarization/otsu.cc                    |    5 +-
 .../src/binarization/pgm_global_threshold_auto.cc  |    3 +-
 .../binarization/pgm_niblack_threshold_image.cc    |    3 +-
 scribo/src/binarization/sauvola.cc                 |    9 +-
 scribo/src/binarization/sauvola_debug.cc           |    3 +-
 scribo/src/binarization/sauvola_ms.cc              |    8 +-
 scribo/src/binarization/sauvola_ms_debug.cc        |   12 +-
 scribo/src/binarization/sauvola_ms_fg.cc           |    8 +-
 scribo/src/binarization/sauvola_ms_split.cc        |    6 +-
 scribo/src/binarization/singh.cc                   |    8 +-
 scribo/src/binarization/wolf.cc                    |    5 +-
 scribo/src/content_in_doc.cc                       |    5 +-
 scribo/src/content_in_hdoc.cc                      |    5 +-
 scribo/src/contest/DAE-2011/content_in_doc_dae.cc  |    9 +-
 scribo/src/contest/DAE-2011/content_in_hdoc_dae.cc |    9 +-
 scribo/src/contest/Makefile.am                     |    6 +-
 scribo/src/contest/hbr-2013/Makefile.am            |   33 +
 scribo/src/contest/hbr-2013/content_in_hdoc_hbr.cc |  148 +++
 .../contest/hdlac-2011/content_in_hdoc_hdlac.cc    |    7 +-
 scribo/src/contest/hnla-2013/Makefile.am           |   33 +
 .../src/contest/hnla-2013/content_in_hdoc_hnla.cc  |  149 +++
 scribo/src/debug/highlight_text_area.cc            |    3 +-
 scribo/src/debug/show_components_boldness.cc       |    5 +-
 scribo/src/debug/show_components_color.cc          |    6 +-
 .../src/debug/show_info_median_inter_characters.cc |    3 +-
 scribo/src/debug/show_info_x_height.cc             |    3 +-
 scribo/src/debug/show_lines_boldness.cc            |    3 +-
 scribo/src/debug/show_objects_large.cc             |    2 +-
 scribo/src/debug/show_objects_large_small.cc       |    2 +-
 scribo/src/debug/show_objects_small.cc             |    2 +-
 scribo/src/debug/show_objects_thick.cc             |    2 +-
 scribo/src/debug/show_objects_thin.cc              |    2 +-
 scribo/src/debug/show_paragraph_blocks.cc          |    3 +-
 scribo/src/debug/show_separators.cc                |    3 +-
 scribo/src/debug/show_stoppers.cc                  |    3 +-
 scribo/src/debug/show_text_lines.cc                |    3 +-
 scribo/src/debug/show_text_lines_wo_seps.cc        |    3 +-
 scribo/src/filter/objects_large.cc                 |    3 +-
 scribo/src/filter/objects_small.cc                 |    3 +-
 scribo/src/filter/objects_thick.cc                 |    3 +-
 scribo/src/filter/objects_thin.cc                  |    3 +-
 scribo/src/filter/objects_with_holes.cc            |    3 +-
 scribo/src/filter/objects_with_holes_pgm.cc        |    3 +-
 scribo/src/misc/negate.cc                          |    7 +-
 scribo/src/misc/superpose.cc                       |    7 +-
 scribo/src/non_text_components.cc                  |    9 +-
 scribo/src/pbm_text_in_doc.cc                      |    3 +-
 scribo/src/postprocessing/fill_object_holes.cc     |    3 +-
 scribo/src/preprocessing/denoise_bg.cc             |    3 +-
 scribo/src/preprocessing/denoise_fg.cc             |    3 +-
 scribo/src/preprocessing/preprocess.cc             |    3 +-
 scribo/src/preprocessing/rotate.cc                 |    5 +-
 scribo/src/preprocessing/rotate_90.cc              |    5 +-
 scribo/src/preprocessing/split_bg_fg.cc            |    7 +-
 scribo/src/preprocessing/subsample.cc              |    3 +-
 scribo/src/preprocessing/unskew.cc                 |    7 +-
 scribo/src/primitive/extract/alignments.cc         |    3 +-
 .../src/primitive/extract/discontinued_hlines.cc   |    3 +-
 scribo/src/primitive/extract/discontinued_lines.cc |    3 +-
 .../src/primitive/extract/discontinued_vlines.cc   |    3 +-
 scribo/src/primitive/extract/lines_pattern.cc      |    5 +-
 .../src/primitive/extract/separators_nonvisible.cc |    3 +-
 scribo/src/primitive/extract/thick_hlines.cc       |    3 +-
 scribo/src/primitive/extract/thick_vlines.cc       |    3 +-
 .../src/primitive/find/find_discontinued_lines.cc  |    3 +-
 scribo/src/primitive/find/find_pattern_lines.cc    |    3 +-
 scribo/src/primitive/find/find_single_lines.cc     |    3 +-
 .../primitive/find/find_thick_and_single_lines.cc  |    3 +-
 scribo/src/primitive/find/find_thick_lines.cc      |    3 +-
 scribo/src/primitive/remove/separators.cc          |    3 +-
 scribo/src/table/erase.cc                          |    3 +-
 scribo/src/table/extract.cc                        |    3 +-
 scribo/src/text/cleantxt.cc                        |    3 +-
 scribo/src/text/pbm_lines_recognition.cc           |    3 +-
 scribo/src/text/pbm_recognition.cc                 |    3 +-
 scribo/src/text_in_doc_preprocess.cc               |    6 +-
 scribo/src/text_in_picture.cc                      |   29 +-
 scribo/src/text_in_picture_dual.cc                 |    8 +-
 scribo/src/text_recognition_in_picture.cc          |    7 +-
 scribo/src/util/component_precise_outline.cc       |    3 +-
 scribo/tests/Makefile.am                           |    4 +
 scribo/tests/binarization/Makefile.am              |    7 +-
 scribo/tests/binarization/niblack.cc               |   16 +-
 scribo/tests/binarization/wolf.cc                  |   16 +-
 scribo/tests/primitive/extract/Makefile.am         |    3 +-
 scribo/tests/unit_test/unit-tests.mk               |    2 +
 swilena/ChangeLog                                  |  299 +++++
 swilena/Makefile.am                                |   12 +-
 swilena/box.ixx                                    |    2 +-
 swilena/box2d.i                                    |    7 +-
 swilena/box_piter.ixx                              |    3 +-
 swilena/complex.ixx                                |  330 ++++++
 swilena/complex2.i                                 |  111 ++
 swilena/concat.ixx                                 |    4 +-
 swilena/image2d.ixx                                |   30 +-
 swilena/image2d_int.i                              |    5 +-
 swilena/image2d_int_u8.i                           |   12 +-
 swilena/image2d_point2d.i                          |   53 +
 swilena/image2d_rgb8.i                             |   63 ++
 swilena/int_u.ixx                                  |   24 +-
 swilena/int_u32.i                                  |   40 -
 swilena/morpho.ixx                                 |   43 +-
 swilena/ppm.ixx                                    |   57 +
 swilena/python-utils.ixx                           |    3 +-
 swilena/python/Makefile.am                         |  202 +++-
 swilena/python/complex2-misc.py                    |   99 ++
 swilena/python/data.py                             |   26 -
 swilena/python/data.py.in                          |   26 +
 swilena/python/installcheck.mk                     |  116 ++
 swilena/python/ltihooks.py                         |   60 -
 swilena/python/max-tree.py                         |   57 +
 swilena/python/morpho-segm.py                      |    8 +-
 swilena/python/sps-gdb-local.in                    |    6 +
 swilena/python/sps-local.in                        |    2 +-
 swilena/python/swilena.py                          |   13 +-
 swilena/rgb.ixx                                    |  159 +++
 swilena/rgb8.i                                     |   40 +
 swilena/run.in                                     |   50 +-
 1135 files changed, 12574 insertions(+), 11079 deletions(-)
 delete mode 100644 GScribo/BUGS
 delete mode 100644 GScribo/GScribo.pro
 delete mode 100644 GScribo/GScribo.pro.user
 delete mode 100644 GScribo/GScribo.pro.user.1.3
 delete mode 100644 GScribo/PagesWidget/pagesdelegate.cpp
 delete mode 100644 GScribo/PagesWidget/pagesdelegate.h
 delete mode 100644 GScribo/PagesWidget/pagesmodel.cpp
 delete mode 100644 GScribo/PagesWidget/pagesmodel.h
 delete mode 100644 GScribo/PagesWidget/pageswidget.cpp
 delete mode 100644 GScribo/PagesWidget/pageswidget.h
 delete mode 100644 GScribo/Preferences/generaloptions.cpp
 delete mode 100644 GScribo/Preferences/generaloptions.h
 delete mode 100644 GScribo/Preferences/generaloptions.ui
 delete mode 100644 GScribo/Preferences/ocroptions.cpp
 delete mode 100644 GScribo/Preferences/ocroptions.h
 delete mode 100644 GScribo/Preferences/ocroptions.ui
 delete mode 100644 GScribo/Preferences/optionwidget.h
 delete mode 100644 GScribo/Preferences/preferencesdialog.cpp
 delete mode 100644 GScribo/Preferences/preferencesdialog.h
 delete mode 100644 GScribo/Preferences/preferencesdialog.ui
 delete mode 100644 GScribo/Preferences/preprocessingoptions.cpp
 delete mode 100644 GScribo/Preferences/preprocessingoptions.h
 delete mode 100644 GScribo/Preferences/preprocessingoptions.ui
 delete mode 100644 GScribo/Preferences/segmentationoptions.cpp
 delete mode 100644 GScribo/Preferences/segmentationoptions.h
 delete mode 100644 GScribo/Preferences/segmentationoptions.ui
 delete mode 100644 GScribo/Processing/preprocess.cpp
 delete mode 100644 GScribo/Processing/preprocess.h
 delete mode 100644 GScribo/Processing/process.cpp
 delete mode 100644 GScribo/Processing/process.h
 delete mode 100644 GScribo/Processing/progressdialog.cpp
 delete mode 100644 GScribo/Processing/progressdialog.h
 delete mode 100644 GScribo/Processing/runner.cpp
 delete mode 100644 GScribo/Processing/runner.h
 delete mode 100644 GScribo/Rendering/abstractregionitem.h
 delete mode 100644 GScribo/Rendering/backgroundtexture.h
 delete mode 100644 GScribo/Rendering/graphicsview.cpp
 delete mode 100644 GScribo/Rendering/graphicsview.h
 delete mode 100644 GScribo/Rendering/regionitem.cpp
 delete mode 100644 GScribo/Rendering/regionitem.h
 delete mode 100644 GScribo/Rendering/rootgraphicsitem.h
 delete mode 100644 GScribo/Rendering/scene.cpp
 delete mode 100644 GScribo/Rendering/scene.h
 delete mode 100644 GScribo/Rendering/selection.cpp
 delete mode 100644 GScribo/Rendering/selection.h
 delete mode 100644 GScribo/TODO
 delete mode 100644 GScribo/XmlWidget/attributesmodel.cpp
 delete mode 100644 GScribo/XmlWidget/attributesmodel.h
 delete mode 100644 GScribo/XmlWidget/selectionproxy.h
 delete mode 100644 GScribo/XmlWidget/xmlattributes.cpp
 delete mode 100644 GScribo/XmlWidget/xmlattributes.h
 delete mode 100644 GScribo/XmlWidget/xmldelegate.h
 delete mode 100644 GScribo/XmlWidget/xmlitem.cpp
 delete mode 100644 GScribo/XmlWidget/xmlitem.h
 delete mode 100644 GScribo/XmlWidget/xmlmodel.cpp
 delete mode 100644 GScribo/XmlWidget/xmlmodel.h
 delete mode 100644 GScribo/XmlWidget/xmlview.cpp
 delete mode 100644 GScribo/XmlWidget/xmlview.h
 delete mode 100644 GScribo/XmlWidget/xmlwidget.cpp
 delete mode 100644 GScribo/XmlWidget/xmlwidget.h
 delete mode 100644 GScribo/aboutdialog.h
 delete mode 100644 GScribo/aboutdialog.ui
 delete mode 100644 GScribo/configs.h
 delete mode 100644 GScribo/dir.h
 delete mode 100644 GScribo/dockwidget.h
 delete mode 100644 GScribo/main.cpp
 delete mode 100644 GScribo/mainwindow.cpp
 delete mode 100644 GScribo/mainwindow.h
 delete mode 100644 GScribo/mainwindow.ui
 delete mode 100644 GScribo/region.h
 delete mode 100644 GScribo/regionwidget.cpp
 delete mode 100644 GScribo/regionwidget.h
 delete mode 100644 GScribo/variantpointer.h
 delete mode 100644 GScribo/xml.cpp
 delete mode 100644 GScribo/xml.h
 create mode 100644 milena/doc/examples.dox
 create mode 100644 milena/doc/examples/multi_files_f1.cc.raw
 create mode 100644 milena/doc/examples/multi_files_f2.cc.raw
 create mode 100644 milena/doc/examples/multi_files_main.cc.raw
 create mode 100644 milena/doc/examples/multiple_def.cc.raw
 create mode 100644 milena/doc/examples/typenametemplate.cc.raw
 create mode 100644 milena/doc/examples/undef_global_vars.cc.raw
 create mode 100644 milena/doc/examples/wrongvaluetype.cc.raw
 create mode 100644 milena/doc/img/2dgrid.png
 create mode 100644 milena/doc/mln/convert.dox
 create mode 100644 milena/doc/mln/core/alias/box1d.dox
 create mode 100644 milena/doc/mln/core/alias/box2d.dox
 create mode 100644 milena/doc/mln/core/alias/box2d_h.dox
 create mode 100644 milena/doc/mln/core/alias/box3d.dox
 create mode 100644 milena/doc/mln/core/alias/complex_geometry.dox
 create mode 100644 milena/doc/mln/core/alias/complex_image.dox
 create mode 100644 milena/doc/mln/core/alias/dpoint1d.dox
 create mode 100644 milena/doc/mln/core/alias/dpoint2d.dox
 create mode 100644 milena/doc/mln/core/alias/dpoint3d.dox
 create mode 100644 milena/doc/mln/core/alias/neighb1d.dox
 create mode 100644 milena/doc/mln/core/alias/neighb2d.dox
 create mode 100644 milena/doc/mln/core/alias/neighb3d.dox
 create mode 100644 milena/doc/mln/core/alias/p_run2d.dox
 create mode 100644 milena/doc/mln/core/alias/p_runs2d.dox
 create mode 100644 milena/doc/mln/core/alias/point1d.dox
 create mode 100644 milena/doc/mln/core/alias/point2d.dox
 create mode 100644 milena/doc/mln/core/alias/point2d_h.dox
 create mode 100644 milena/doc/mln/core/alias/point3d.dox
 create mode 100644 milena/doc/mln/core/alias/vec2d.dox
 create mode 100644 milena/doc/mln/core/alias/vec3d.dox
 create mode 100644 milena/doc/mln/core/alias/w_window1d_float.dox
 create mode 100644 milena/doc/mln/core/alias/w_window1d_int.dox
 create mode 100644 milena/doc/mln/core/alias/w_window2d_float.dox
 create mode 100644 milena/doc/mln/core/alias/w_window2d_int.dox
 create mode 100644 milena/doc/mln/core/alias/w_window3d_float.dox
 create mode 100644 milena/doc/mln/core/alias/w_window3d_int.dox
 create mode 100644 milena/doc/mln/core/alias/window1d.dox
 create mode 100644 milena/doc/mln/core/alias/window2d.dox
 create mode 100644 milena/doc/mln/core/alias/window3d.dox
 create mode 100644 milena/doc/mln/core/concept/concept.dox
 create mode 100644 milena/doc/mln/labeling/labeling.dox
 create mode 100644 milena/doc/mln/value/hsl.dox
 create mode 100644 milena/doc/mln/value/int_s16.dox
 create mode 100644 milena/doc/mln/value/int_s24.dox
 create mode 100644 milena/doc/mln/value/int_s32.dox
 create mode 100644 milena/doc/mln/value/int_s8.dox
 create mode 100644 milena/doc/mln/value/int_u12.dox
 create mode 100644 milena/doc/mln/value/int_u16.dox
 create mode 100644 milena/doc/mln/value/int_u24.dox
 create mode 100644 milena/doc/mln/value/int_u32.dox
 create mode 100644 milena/doc/mln/value/int_u8.dox
 create mode 100644 milena/doc/mln/value/label_16.dox
 create mode 100644 milena/doc/mln/value/label_32.dox
 create mode 100644 milena/doc/mln/value/label_8.dox
 create mode 100644 milena/doc/mln/value/rgb16.dox
 create mode 100644 milena/doc/mln/value/rgb8.dox
 create mode 100644 milena/doc/mln/value/value.dox
 create mode 100644 milena/doc/mln/win/disk2d.dox
 create mode 100644 milena/doc/mln/win/hline2d.dox
 create mode 100644 milena/doc/mln/win/segment1d.dox
 create mode 100644 milena/doc/mln/win/sline3d.dox
 create mode 100644 milena/doc/mln/win/sphere3d.dox
 create mode 100644 milena/doc/mln/win/vline2d.dox
 create mode 100644 milena/mln/debug/trace.hh
 create mode 100755 milena/mln/fun/v2b/always_false.hh
 create mode 100755 milena/mln/fun/v2b/always_true.hh
 create mode 100644 milena/mln/io/magick/internal/init_magick.hh
 delete mode 120000 milena/mln/linear/.#ch_convolve.hh
 delete mode 100644 milena/mln/morpho/meyer_wst.hh
 create mode 100644 milena/mln/registration/all.hh
 delete mode 100644 milena/mln/trace/all.hh
 delete mode 100644 milena/mln/trace/entering.hh
 delete mode 100644 milena/mln/trace/essential.hh
 delete mode 100644 milena/mln/trace/exiting.hh
 delete mode 100644 milena/mln/trace/quiet.hh
 delete mode 100644 milena/mln/trace/resume.hh
 delete mode 100644 milena/mln/trace/stop.hh
 delete mode 100644 milena/mln/trace/warning.hh
 create mode 100644 milena/sandbox/anthony/Makefile
 create mode 100644 milena/sandbox/anthony/src/scale_space.cc
 create mode 100644 milena/tests/labeling/foreground.ref.pgm
 delete mode 100644 milena/tests/morpho/meyer_wst.cc
 delete mode 100644 milena/tests/morpho/meyer_wst_long.cc
 create mode 100644 milena/tests/unit_test/cond_tests_poppler
 create mode 100644 scribo/doc/scribo/binarization/kim.dox
 create mode 100644 scribo/doc/scribo/binarization/wolf.dox
 create mode 100644 scribo/doc/scribo/layout/layout.dox
 create mode 100644 scribo/doc/scribo/namespaces.dox
 create mode 100644 scribo/doc/scribo/primitive/extract/components.dox
 create mode 100644 scribo/doc/scribo/primitive/extract/extract.dox
 create mode 100644 scribo/sandbox/icdar_13_table/src/disjoint_set.hh
 create mode 100644 scribo/scribo/binarization/internal/global_max_stddev_functor.hh
 create mode 100644 scribo/scribo/filter/objects_in_borders.hh
 create mode 100644 scribo/src/contest/hbr-2013/Makefile.am
 create mode 100644 scribo/src/contest/hbr-2013/content_in_hdoc_hbr.cc
 create mode 100644 scribo/src/contest/hnla-2013/Makefile.am
 create mode 100644 scribo/src/contest/hnla-2013/content_in_hdoc_hnla.cc
 create mode 100644 swilena/complex.ixx
 create mode 100644 swilena/complex2.i
 create mode 100644 swilena/image2d_point2d.i
 create mode 100644 swilena/image2d_rgb8.i
 delete mode 100644 swilena/int_u32.i
 create mode 100644 swilena/ppm.ixx
 create mode 100644 swilena/python/complex2-misc.py
 delete mode 100644 swilena/python/data.py
 create mode 100644 swilena/python/data.py.in
 create mode 100644 swilena/python/installcheck.mk
 delete mode 100644 swilena/python/ltihooks.py
 create mode 100644 swilena/python/max-tree.py
 create mode 100644 swilena/python/sps-gdb-local.in
 create mode 100644 swilena/rgb.ixx
 create mode 100644 swilena/rgb8.i
hooks/post-receive
-- 
Olena, a generic and efficient image processing platform
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0