Olena-patches
Threads by month
- ----- 2025 -----
- 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
- 9625 discussions

olena: olena-2.0-853-g8f4ee01 Various changes in mln::border::mirror.
by Roland Levillain 20 May '14
by Roland Levillain 20 May '14
20 May '14
* mln/border/mirror.hh: Here.
* tests/border/mirror.cc: Revamp test.
* tests/border/Makefile.am (check_PROGRAMS): Reenable mirror_full.
---
milena/ChangeLog | 8 ++
milena/mln/border/mirror.hh | 225 ++++++++++++++++++---------------------
milena/tests/border/Makefile.am | 5 +-
milena/tests/border/mirror.cc | 74 +++++++------
4 files changed, 157 insertions(+), 155 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index a2e295e..0206b0f 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,11 @@
+2014-05-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Various changes in mln::border::mirror.
+
+ * mln/border/mirror.hh: Here.
+ * tests/border/mirror.cc: Revamp test.
+ * tests/border/Makefile.am (check_PROGRAMS): Reenable mirror_full.
+
2012-10-02 Guillaume Lazzara <z(a)lrde.epita.fr>
Fix a precondition (Trac ticket #256).
diff --git a/milena/mln/border/mirror.hh b/milena/mln/border/mirror.hh
index 89a132d..6fcb788 100644
--- a/milena/mln/border/mirror.hh
+++ b/milena/mln/border/mirror.hh
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008, 2009, 2011, 2012, 2013 EPITA Research and
-// Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2011, 2012, 2013, 2014 EPITA
+// Research and Development Laboratory (LRDE).
//
// This file is part of Olena.
//
@@ -28,28 +28,23 @@
# define MLN_BORDER_MIRROR_HH
/// \file
+/// \brief Fill an image's border using a mirror tranformation.
///
-/// Define function that fills border using nearer pixels with a
-/// mirroring effect.
-///
-/// \todo 2D version is not correct if the border is larger than the
-/// image domain.
-///
-/// \todo Awful code: rewrite it!
+/// \todo The 2D version is not correct when the border is larger than
+/// the image's domain.
# include <mln/core/image/image1d.hh>
# include <mln/core/image/image2d.hh>
# include <mln/core/image/image3d.hh>
-# include <mln/core/concept/image.hh>
-# include <mln/core/internal/fixme.hh>
-# include <mln/core/internal/fixme.hh>
# include <mln/geom/min_row.hh>
# include <mln/geom/max_row.hh>
# include <mln/geom/min_col.hh>
# include <mln/geom/max_col.hh>
# include <mln/geom/ninds.hh>
+# include <mln/math/min.hh>
+
# include <mln/opt/element.hh>
@@ -60,13 +55,18 @@ namespace mln
{
/*! \brief Mirror the virtual (outer) border of image \p ima with
- * the (inner) level contents of this image.
+ * the (inner) contents of this image.
*
* \param[in,out] ima The image whose border is to be mirrored.
+ * Note that \a ima is modified, even though it
+ * is passed as a const reference,
+ * as---following to the usual Milena
+ * semantics---only values in the border (not
+ * the actual image's contents) are altered by
+ * this routine.
*
- * \pre \p ima has to be initialized.
- *
- * \todo Implement 3d version + optimize with memset if possible.
+ * \todo Implement a 3D version.
+ * \todo Optimize using memset if possible.
*
* \ingroup mlnborderext
*/
@@ -79,131 +79,122 @@ namespace mln
namespace impl
{
+ // Implementation for images based on an mln::box1d.
+
template <typename I>
inline
- void mirror_(const box1d&, const I& ima_)
+ void mirror_(const box1d&, I& ima)
{
mln_trace("border::impl::mirror_");
- I& ima = const_cast<I&>(ima_);
-
- def::coord
- border = static_cast<def::coord>(ima.border()),
- nbinds = static_cast<def::coord>(geom::ninds(ima)),
- min;
-
- if (border > nbinds)
- min = nbinds;
- else
- min = border;
-
- /// left border
- {
- def::coord i = 0;
- for (; i < min; ++i)
- opt::element(ima, border - 1 - i) = ima(point1d(i));
-
- for (; i < border; ++i)
- opt::element(ima, border - 1 - i) = ima(point1d(static_cast<def::coord>(min - 1)));
- }
-
- /// right border
- {
- def::coord
- i = 0,
- j = static_cast<def::coord>(nbinds - 1);
- for (;
- i < min;
- ++i, --j)
- opt::element(ima, border + nbinds + i) = ima(point1d(j));
- ++j;
- for (;
- i < border;
- ++i)
- opt::element(ima, border + nbinds + i) = ima(point1d(j));
- }
+
+ def::coord border = ima.border();
+ def::coord ninds = geom::ninds(ima);
+ def::coord min = math::min(border, ninds);
+
+ // Left-hand border.
+ for (def::coord i = 0; i < min; ++i)
+ opt::element(ima, border - 1 - i) = ima(point1d(i));
+ for (def::coord i = min; i < border; ++i)
+ opt::element(ima, border - 1 - i) = ima(point1d(min - 1));
+
+ // Right-hand border.
+ def::coord j = ninds - 1;
+ for (def::coord i = 0; i < min; ++i, --j)
+ opt::element(ima, border + ninds + i) = ima(point1d(j));
+ ++j;
+ for (def::coord i = min; i < border; ++i)
+ opt::element(ima, border + ninds + i) = ima(point1d(j));
}
+
+ // Implementation for images based on an mln::box2d.
+
template <typename I>
inline
- void mirror_(const box2d&, const I& ima_)
+ void mirror_(const box2d&, I& ima)
{
mln_trace("border::impl::mirror_");
- I& ima = const_cast<I&>(ima_);
-
- unsigned border = ima.border ();
- unsigned nbrows = geom::max_row(ima) - geom::min_row(ima);
- unsigned nbcols = geom::max_col(ima) - geom::min_col(ima);
- unsigned real_nbcols = (nbcols + 1) + 2 * border;
- unsigned start = real_nbcols * border + border;
- unsigned s = start;
-
- // mirror top left corner
- for (unsigned i = 0; i < border; ++i)
- for (unsigned j = 0; j < border; ++j)
- opt::element(ima, i * ((nbcols + 1) + 2 * border) + j) =
+
+ /* FIXME: This implementation is buggy, as it does not address
+ the case of a border larger than the width or the height of
+ the image. */
+
+ def::coord border = ima.border ();
+ def::coord nrows = geom::max_row(ima) - geom::min_row(ima);
+ def::coord ncols = geom::max_col(ima) - geom::min_col(ima);
+ def::coord real_ncols = (ncols + 1) + 2 * border;
+ def::coord start = real_ncols * border + border;
+ def::coord s = start;
+
+ // Top left-hand corner.
+ for (def::coord i = 0; i < border; ++i)
+ for (def::coord j = 0; j < border; ++j)
+ opt::element(ima, i * real_ncols + j) =
opt::element(ima, s);
- // mirror top left corner
- s = start + nbcols;
- for (unsigned i = 0; i < border; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, i * ((nbcols + 1) + 2 * border) + (nbcols + border + j)) = opt::element(ima, s);
-
- // mirror bottom left corner
- s = start + (nbrows * real_nbcols);
- for (unsigned i = 1; i <= border; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s - i + (j * (real_nbcols))) =
+ // Top right-hand corner.
+ s = start + ncols;
+ for (def::coord i = 0; i < border; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, i * real_ncols + (ncols + border + j)) =
opt::element(ima, s);
- // mirror bottom right corner
- s = start + (nbrows * real_nbcols) + nbcols;
- for (unsigned i = 1; i <= border; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + i + (j * real_nbcols)) =
+ // Bottom left-hand corner.
+ s = start + (nrows * real_ncols);
+ for (def::coord i = 1; i <= border; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s - i + (j * real_ncols)) =
opt::element(ima, s);
- // mirror top border
- s = start;
- for (unsigned i = 0; i <= nbcols; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + i - (j * real_nbcols)) =
- opt::element(ima, s + i + ((j - 1)* real_nbcols));
+ // Bottom right-hand corner.
+ s = start + (nrows * real_ncols) + ncols;
+ for (def::coord i = 1; i <= border; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + i + (j * real_ncols)) =
+ opt::element(ima, s);
- // mirror left border
+ // Top border.
s = start;
- for (unsigned i = 0; i <= nbrows; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + (i * real_nbcols) - j) =
- opt::element(ima, s + (i * real_nbcols) + (j - 1));
+ for (def::coord i = 0; i <= ncols; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + i - (j * real_ncols)) =
+ opt::element(ima, s + i + ((j - 1) * real_ncols));
- // mirror right border
+ // Left-hand border.
s = start;
- for (unsigned i = 0; i <= nbrows; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + (i * real_nbcols + nbcols) + j) =
- opt::element(ima, s + (i * real_nbcols + nbcols) - (j - 1));
-
- // mirror bottom border
- s = start + (nbrows * real_nbcols);
- for (unsigned i = 0; i <= nbcols; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + i + (j * real_nbcols)) =
- opt::element(ima, s + i - ((j - 1)* real_nbcols));
+ for (def::coord i = 0; i <= nrows; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + (i * real_ncols) - j) =
+ opt::element(ima, s + (i * real_ncols) + (j - 1));
+ // Right-hand border.
+ s = start;
+ for (def::coord i = 0; i <= nrows; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + (i * real_ncols + ncols) + j) =
+ opt::element(ima, s + (i * real_ncols + ncols) - (j - 1));
+
+ // Bottom border.
+ s = start + (nrows * real_ncols);
+ for (def::coord i = 0; i <= ncols; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + i + (j * real_ncols)) =
+ opt::element(ima, s + i - ((j - 1) * real_ncols));
}
+
+ // Implementation for images based on an mln::box3d.
+
template <typename I>
inline
- void mirror_(const box3d&, const I& ima)
+ void mirror_(const box3d&, I& /* ima */)
{
mln_trace_warning("border::mirror for 3D image is not implemented,"
" so image borders have not been mirrored!");
- (void) ima;
- // FIXME write it!
+ // FIXME: write it!
+ abort();
}
-
} // end of namespace mln::border::impl
@@ -212,19 +203,13 @@ namespace mln
void mirror(const Image<I>& ima_)
{
mln_trace("border::mirror");
-
- const I& ima = exact(ima_);
-
- mln_precondition(ima.is_valid());
mlc_is(mln_trait_image_speed(I), trait::image::speed::fastest)::check();
- typedef mln_psite(I) P;
-
- if (!ima.border ())
+ I& ima = const_cast<I&>(exact(ima_));
+ mln_precondition(ima.is_valid());
+ if (!ima.border())
return;
-
impl::mirror_(ima.bbox(), ima);
-
}
# endif // ! MLN_INCLUDE_ONLY
diff --git a/milena/tests/border/Makefile.am b/milena/tests/border/Makefile.am
index 64c8197..a268a5b 100644
--- a/milena/tests/border/Makefile.am
+++ b/milena/tests/border/Makefile.am
@@ -1,5 +1,5 @@
-# Copyright (C) 2007, 2008, 2009, 2010, 2011 EPITA Research and Development
-# Laboratory (LRDE).
+# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2014 EPITA Research and
+# Development Laboratory (LRDE).
#
# This file is part of Olena.
#
@@ -26,6 +26,7 @@ check_PROGRAMS = \
find \
get \
mirror \
+ mirror_full \
resize_equal \
resize_image1d_1 \
resize_image1d_2 \
diff --git a/milena/tests/border/mirror.cc b/milena/tests/border/mirror.cc
index 09435e5..58a038e 100644
--- a/milena/tests/border/mirror.cc
+++ b/milena/tests/border/mirror.cc
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008, 2009, 2011 EPITA Research and Development
-// Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2011, 2014 EPITA Research and Development
+// Laboratory (LRDE).
//
// This file is part of Olena.
//
@@ -24,7 +24,7 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-/// \file
+// Exercise mln::border::mirror.
#include <mln/core/image/image1d.hh>
#include <mln/core/image/image2d.hh>
@@ -35,46 +35,54 @@
#include <mln/data/paste_without_localization.hh>
#include <mln/data/compare.hh>
-using namespace mln;
-
int
-main (void)
+main()
{
- {
- image1d<int> ima(2, 3);
- debug::iota(ima);
- border::mirror(ima);
- mln_assertion(opt::element(ima, 0) == 2);
- mln_assertion(opt::element(ima, 1) == 2);
- mln_assertion(opt::element(ima, 2) == 1);
- mln_assertion(opt::element(ima, 3) == 1);
- mln_assertion(opt::element(ima, 4) == 2);
- mln_assertion(opt::element(ima, 5) == 2);
- mln_assertion(opt::element(ima, 6) == 1);
- mln_assertion(opt::element(ima, 7) == 1);
- }
-
+ using namespace mln;
- // Image2d
+ // image1d.
{
- unsigned ref_data[6][7] = {
- { 1, 1, 4, 5, 6, 3, 3 },
- { 1, 1, 1, 2, 3, 3, 3 },
- { 2, 1, 1, 2, 3, 3, 2 },
- { 5, 4, 4, 5, 6, 6, 5 },
- { 4, 4, 4, 5, 6, 6, 6 },
- { 4, 4, 1, 2, 3, 6, 6 }
- };
+ // A 2-pixel 1D image with a 3-pixel border.
+ image1d<unsigned> input(2, 3);
+ debug::iota(input);
+ border::mirror(input);
+ // Data are framed; other values form the border.
+ unsigned ref_data[8] =
+ // ,-------------.
+ { 2, 2, 1, /* | */ 1, 2, /* | */ 2, 1, 1 };
+ // `-------------'
+ image1d<unsigned> ref = make::image(ref_data);
- image2d<unsigned> ref = make::image(ref_data);
+ image1d<unsigned> output(8, 0);
+ data::paste_without_localization(extended_to(input, input.vbbox()),
+ output);
+ mln_assertion(output == ref);
+ }
+
+ // image2d.
+ {
+ // A 2x3-pixel 2D image with a 2-pixel border.
image2d<unsigned> input(2, 3, 2);
- image2d<unsigned> res(6, 7, 0);
debug::iota(input, 0);
border::mirror(input);
- data::paste_without_localization(extended_to(input, input.vbbox()), res);
+ // Data are framed; other values form the border.
+ unsigned ref_data[6][7] = {
+ { 1, 1, 4, 5, 6, 3, 3 },
+ { 1, 1, 1, 2, 3, 3, 3 },
+ // ,----------------.
+ { 2, 1, /* | */ 1, 2, 3, /* | */ 3, 2 },
+ { 5, 4, /* | */ 4, 5, 6, /* | */ 6, 5 },
+ // `----------------'
+ { 4, 4, 4, 5, 6, 6, 6 },
+ { 4, 4, 1, 2, 3, 6, 6 }
+ };
+ image2d<unsigned> ref = make::image(ref_data);
- mln_assertion(res == ref);
+ image2d<unsigned> output(6, 7, 0);
+ data::paste_without_localization(extended_to(input, input.vbbox()),
+ output);
+ mln_assertion(output == ref);
}
}
--
1.7.10.4
1
0

olena: olena-2.0-853-g888cdfe Various changes in mln::border::mirror.
by Roland Levillain 20 May '14
by Roland Levillain 20 May '14
20 May '14
* mln/border/mirror.hh: Here.
* tests/border/mirror.cc: Revamp test.
* tests/border/Makefile.am (check_PROGRAMS): Reenable mirror_full.
---
milena/ChangeLog | 8 ++
milena/mln/border/mirror.hh | 223 ++++++++++++++++++---------------------
milena/tests/border/Makefile.am | 5 +-
milena/tests/border/mirror.cc | 74 +++++++------
4 files changed, 153 insertions(+), 157 deletions(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index a2e295e..0206b0f 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,11 @@
+2014-05-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Various changes in mln::border::mirror.
+
+ * mln/border/mirror.hh: Here.
+ * tests/border/mirror.cc: Revamp test.
+ * tests/border/Makefile.am (check_PROGRAMS): Reenable mirror_full.
+
2012-10-02 Guillaume Lazzara <z(a)lrde.epita.fr>
Fix a precondition (Trac ticket #256).
diff --git a/milena/mln/border/mirror.hh b/milena/mln/border/mirror.hh
index 89a132d..405caab 100644
--- a/milena/mln/border/mirror.hh
+++ b/milena/mln/border/mirror.hh
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008, 2009, 2011, 2012, 2013 EPITA Research and
-// Development Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2011, 2012, 2013, 2014 EPITA
+// Research and Development Laboratory (LRDE).
//
// This file is part of Olena.
//
@@ -28,28 +28,23 @@
# define MLN_BORDER_MIRROR_HH
/// \file
+/// \brief Fill an image's border using a mirror tranformation.
///
-/// Define function that fills border using nearer pixels with a
-/// mirroring effect.
-///
-/// \todo 2D version is not correct if the border is larger than the
-/// image domain.
-///
-/// \todo Awful code: rewrite it!
+/// \todo The 2D version is not correct when the border is larger than
+/// the image's domain.
# include <mln/core/image/image1d.hh>
# include <mln/core/image/image2d.hh>
# include <mln/core/image/image3d.hh>
-# include <mln/core/concept/image.hh>
-# include <mln/core/internal/fixme.hh>
-# include <mln/core/internal/fixme.hh>
# include <mln/geom/min_row.hh>
# include <mln/geom/max_row.hh>
# include <mln/geom/min_col.hh>
# include <mln/geom/max_col.hh>
# include <mln/geom/ninds.hh>
+# include <mln/math/min.hh>
+
# include <mln/opt/element.hh>
@@ -60,18 +55,17 @@ namespace mln
{
/*! \brief Mirror the virtual (outer) border of image \p ima with
- * the (inner) level contents of this image.
+ * the (inner) contents of this image.
*
* \param[in,out] ima The image whose border is to be mirrored.
*
- * \pre \p ima has to be initialized.
- *
- * \todo Implement 3d version + optimize with memset if possible.
+ * \todo Implement a 3D version.
+ * \todo Optimize using memset if possible.
*
* \ingroup mlnborderext
*/
template <typename I>
- void mirror(const Image<I>& ima);
+ void mirror(Image<I>& ima);
# ifndef MLN_INCLUDE_ONLY
@@ -79,152 +73,137 @@ namespace mln
namespace impl
{
+ // Implementation for images based on an mln::box1d.
+
template <typename I>
inline
- void mirror_(const box1d&, const I& ima_)
+ void mirror_(const box1d&, I& ima)
{
mln_trace("border::impl::mirror_");
- I& ima = const_cast<I&>(ima_);
-
- def::coord
- border = static_cast<def::coord>(ima.border()),
- nbinds = static_cast<def::coord>(geom::ninds(ima)),
- min;
-
- if (border > nbinds)
- min = nbinds;
- else
- min = border;
-
- /// left border
- {
- def::coord i = 0;
- for (; i < min; ++i)
- opt::element(ima, border - 1 - i) = ima(point1d(i));
-
- for (; i < border; ++i)
- opt::element(ima, border - 1 - i) = ima(point1d(static_cast<def::coord>(min - 1)));
- }
-
- /// right border
- {
- def::coord
- i = 0,
- j = static_cast<def::coord>(nbinds - 1);
- for (;
- i < min;
- ++i, --j)
- opt::element(ima, border + nbinds + i) = ima(point1d(j));
- ++j;
- for (;
- i < border;
- ++i)
- opt::element(ima, border + nbinds + i) = ima(point1d(j));
- }
+
+ def::coord border = ima.border();
+ def::coord ninds = geom::ninds(ima);
+ def::coord min = math::min(border, ninds);
+
+ // Left-hand border.
+ for (def::coord i = 0; i < min; ++i)
+ opt::element(ima, border - 1 - i) = ima(point1d(i));
+ for (def::coord i = min; i < border; ++i)
+ opt::element(ima, border - 1 - i) = ima(point1d(min - 1));
+
+ // Right-hand border.
+ def::coord j = ninds - 1;
+ for (def::coord i = 0; i < min; ++i, --j)
+ opt::element(ima, border + ninds + i) = ima(point1d(j));
+ ++j;
+ for (def::coord i = min; i < border; ++i)
+ opt::element(ima, border + ninds + i) = ima(point1d(j));
}
+
+ // Implementation for images based on an mln::box2d.
+
template <typename I>
inline
- void mirror_(const box2d&, const I& ima_)
+ void mirror_(const box2d&, I& ima)
{
mln_trace("border::impl::mirror_");
- I& ima = const_cast<I&>(ima_);
-
- unsigned border = ima.border ();
- unsigned nbrows = geom::max_row(ima) - geom::min_row(ima);
- unsigned nbcols = geom::max_col(ima) - geom::min_col(ima);
- unsigned real_nbcols = (nbcols + 1) + 2 * border;
- unsigned start = real_nbcols * border + border;
- unsigned s = start;
-
- // mirror top left corner
- for (unsigned i = 0; i < border; ++i)
- for (unsigned j = 0; j < border; ++j)
- opt::element(ima, i * ((nbcols + 1) + 2 * border) + j) =
+
+ /* FIXME: This implementation is buggy, as it does not address
+ the case of a border larger than the width or the height of
+ the image. */
+
+ def::coord border = ima.border ();
+ def::coord nrows = geom::max_row(ima) - geom::min_row(ima);
+ def::coord ncols = geom::max_col(ima) - geom::min_col(ima);
+ def::coord real_ncols = (ncols + 1) + 2 * border;
+ def::coord start = real_ncols * border + border;
+ def::coord s = start;
+
+ // Top left-hand corner.
+ for (def::coord i = 0; i < border; ++i)
+ for (def::coord j = 0; j < border; ++j)
+ opt::element(ima, i * real_ncols + j) =
opt::element(ima, s);
- // mirror top left corner
- s = start + nbcols;
- for (unsigned i = 0; i < border; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, i * ((nbcols + 1) + 2 * border) + (nbcols + border + j)) = opt::element(ima, s);
-
- // mirror bottom left corner
- s = start + (nbrows * real_nbcols);
- for (unsigned i = 1; i <= border; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s - i + (j * (real_nbcols))) =
+ // Top right-hand corner.
+ s = start + ncols;
+ for (def::coord i = 0; i < border; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, i * real_ncols + (ncols + border + j)) =
opt::element(ima, s);
- // mirror bottom right corner
- s = start + (nbrows * real_nbcols) + nbcols;
- for (unsigned i = 1; i <= border; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + i + (j * real_nbcols)) =
+ // Bottom left-hand corner.
+ s = start + (nrows * real_ncols);
+ for (def::coord i = 1; i <= border; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s - i + (j * real_ncols)) =
opt::element(ima, s);
- // mirror top border
- s = start;
- for (unsigned i = 0; i <= nbcols; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + i - (j * real_nbcols)) =
- opt::element(ima, s + i + ((j - 1)* real_nbcols));
+ // Bottom right-hand corner.
+ s = start + (nrows * real_ncols) + ncols;
+ for (def::coord i = 1; i <= border; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + i + (j * real_ncols)) =
+ opt::element(ima, s);
- // mirror left border
+ // Top border.
s = start;
- for (unsigned i = 0; i <= nbrows; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + (i * real_nbcols) - j) =
- opt::element(ima, s + (i * real_nbcols) + (j - 1));
+ for (def::coord i = 0; i <= ncols; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + i - (j * real_ncols)) =
+ opt::element(ima, s + i + ((j - 1) * real_ncols));
- // mirror right border
+ // Left-hand border.
s = start;
- for (unsigned i = 0; i <= nbrows; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + (i * real_nbcols + nbcols) + j) =
- opt::element(ima, s + (i * real_nbcols + nbcols) - (j - 1));
-
- // mirror bottom border
- s = start + (nbrows * real_nbcols);
- for (unsigned i = 0; i <= nbcols; ++i)
- for (unsigned j = 1; j <= border; ++j)
- opt::element(ima, s + i + (j * real_nbcols)) =
- opt::element(ima, s + i - ((j - 1)* real_nbcols));
+ for (def::coord i = 0; i <= nrows; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + (i * real_ncols) - j) =
+ opt::element(ima, s + (i * real_ncols) + (j - 1));
+ // Right-hand border.
+ s = start;
+ for (def::coord i = 0; i <= nrows; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + (i * real_ncols + ncols) + j) =
+ opt::element(ima, s + (i * real_ncols + ncols) - (j - 1));
+
+ // Bottom border.
+ s = start + (nrows * real_ncols);
+ for (def::coord i = 0; i <= ncols; ++i)
+ for (def::coord j = 1; j <= border; ++j)
+ opt::element(ima, s + i + (j * real_ncols)) =
+ opt::element(ima, s + i - ((j - 1) * real_ncols));
}
+
+ // Implementation for images based on an mln::box3d.
+
template <typename I>
inline
- void mirror_(const box3d&, const I& ima)
+ void mirror_(const box3d&, I& /* ima */)
{
mln_trace_warning("border::mirror for 3D image is not implemented,"
" so image borders have not been mirrored!");
- (void) ima;
- // FIXME write it!
+ // FIXME: write it!
+ abort();
}
-
} // end of namespace mln::border::impl
template <typename I>
inline
- void mirror(const Image<I>& ima_)
+ void mirror(Image<I>& ima_)
{
mln_trace("border::mirror");
-
- const I& ima = exact(ima_);
-
- mln_precondition(ima.is_valid());
mlc_is(mln_trait_image_speed(I), trait::image::speed::fastest)::check();
- typedef mln_psite(I) P;
-
- if (!ima.border ())
+ I& ima = exact(ima_);
+ mln_precondition(ima.is_valid());
+ if (!ima.border())
return;
-
impl::mirror_(ima.bbox(), ima);
-
}
# endif // ! MLN_INCLUDE_ONLY
diff --git a/milena/tests/border/Makefile.am b/milena/tests/border/Makefile.am
index 64c8197..a268a5b 100644
--- a/milena/tests/border/Makefile.am
+++ b/milena/tests/border/Makefile.am
@@ -1,5 +1,5 @@
-# Copyright (C) 2007, 2008, 2009, 2010, 2011 EPITA Research and Development
-# Laboratory (LRDE).
+# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2014 EPITA Research and
+# Development Laboratory (LRDE).
#
# This file is part of Olena.
#
@@ -26,6 +26,7 @@ check_PROGRAMS = \
find \
get \
mirror \
+ mirror_full \
resize_equal \
resize_image1d_1 \
resize_image1d_2 \
diff --git a/milena/tests/border/mirror.cc b/milena/tests/border/mirror.cc
index 09435e5..58a038e 100644
--- a/milena/tests/border/mirror.cc
+++ b/milena/tests/border/mirror.cc
@@ -1,5 +1,5 @@
-// Copyright (C) 2007, 2008, 2009, 2011 EPITA Research and Development
-// Laboratory (LRDE)
+// Copyright (C) 2007, 2008, 2009, 2011, 2014 EPITA Research and Development
+// Laboratory (LRDE).
//
// This file is part of Olena.
//
@@ -24,7 +24,7 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-/// \file
+// Exercise mln::border::mirror.
#include <mln/core/image/image1d.hh>
#include <mln/core/image/image2d.hh>
@@ -35,46 +35,54 @@
#include <mln/data/paste_without_localization.hh>
#include <mln/data/compare.hh>
-using namespace mln;
-
int
-main (void)
+main()
{
- {
- image1d<int> ima(2, 3);
- debug::iota(ima);
- border::mirror(ima);
- mln_assertion(opt::element(ima, 0) == 2);
- mln_assertion(opt::element(ima, 1) == 2);
- mln_assertion(opt::element(ima, 2) == 1);
- mln_assertion(opt::element(ima, 3) == 1);
- mln_assertion(opt::element(ima, 4) == 2);
- mln_assertion(opt::element(ima, 5) == 2);
- mln_assertion(opt::element(ima, 6) == 1);
- mln_assertion(opt::element(ima, 7) == 1);
- }
-
+ using namespace mln;
- // Image2d
+ // image1d.
{
- unsigned ref_data[6][7] = {
- { 1, 1, 4, 5, 6, 3, 3 },
- { 1, 1, 1, 2, 3, 3, 3 },
- { 2, 1, 1, 2, 3, 3, 2 },
- { 5, 4, 4, 5, 6, 6, 5 },
- { 4, 4, 4, 5, 6, 6, 6 },
- { 4, 4, 1, 2, 3, 6, 6 }
- };
+ // A 2-pixel 1D image with a 3-pixel border.
+ image1d<unsigned> input(2, 3);
+ debug::iota(input);
+ border::mirror(input);
+ // Data are framed; other values form the border.
+ unsigned ref_data[8] =
+ // ,-------------.
+ { 2, 2, 1, /* | */ 1, 2, /* | */ 2, 1, 1 };
+ // `-------------'
+ image1d<unsigned> ref = make::image(ref_data);
- image2d<unsigned> ref = make::image(ref_data);
+ image1d<unsigned> output(8, 0);
+ data::paste_without_localization(extended_to(input, input.vbbox()),
+ output);
+ mln_assertion(output == ref);
+ }
+
+ // image2d.
+ {
+ // A 2x3-pixel 2D image with a 2-pixel border.
image2d<unsigned> input(2, 3, 2);
- image2d<unsigned> res(6, 7, 0);
debug::iota(input, 0);
border::mirror(input);
- data::paste_without_localization(extended_to(input, input.vbbox()), res);
+ // Data are framed; other values form the border.
+ unsigned ref_data[6][7] = {
+ { 1, 1, 4, 5, 6, 3, 3 },
+ { 1, 1, 1, 2, 3, 3, 3 },
+ // ,----------------.
+ { 2, 1, /* | */ 1, 2, 3, /* | */ 3, 2 },
+ { 5, 4, /* | */ 4, 5, 6, /* | */ 6, 5 },
+ // `----------------'
+ { 4, 4, 4, 5, 6, 6, 6 },
+ { 4, 4, 1, 2, 3, 6, 6 }
+ };
+ image2d<unsigned> ref = make::image(ref_data);
- mln_assertion(res == ref);
+ image2d<unsigned> output(6, 7, 0);
+ data::paste_without_localization(extended_to(input, input.vbbox()),
+ output);
+ mln_assertion(output == ref);
}
}
--
1.7.10.4
1
0

20 May '14
* mln/core/internal/site_relative_iterator_base.hh: Here.
Signed-off-by: Roland Levillain <roland(a)lrde.epita.fr>
---
milena/ChangeLog | 6 ++++++
milena/mln/core/internal/site_relative_iterator_base.hh | 3 ++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/milena/ChangeLog b/milena/ChangeLog
index 7897b5e..a2e295e 100644
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-02 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Fix a precondition (Trac ticket #256).
+
+ * mln/core/internal/site_relative_iterator_base.hh: Here.
+
2014-04-02 Roland Levillain <roland(a)lrde.epita.fr>
Milena: Streamline mln/test/positive.cc.
diff --git a/milena/mln/core/internal/site_relative_iterator_base.hh b/milena/mln/core/internal/site_relative_iterator_base.hh
index 87b69b1..caa99e8 100644
--- a/milena/mln/core/internal/site_relative_iterator_base.hh
+++ b/milena/mln/core/internal/site_relative_iterator_base.hh
@@ -195,7 +195,8 @@ namespace mln
const mln_psite(S)&
site_relative_iterator_base<S,E,C>::subj_()
{
- mln_assertion(exact(this)->compute_p_() == p_);
+ // valid => exact(this)->compute_p_() == p_
+ mln_assertion(!this->is_valid() || exact(this)->compute_p_() == p_);
return p_;
}
--
1.7.10.4
1
0
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 next has been updated
via 8758e60615436bdf40fc662343cad3ac24e74d9a (commit)
from be96bce6673467409255e03efc46fe870dc440ec (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 -----------------------------------------------------------------
8758e60 Fix a precondition (Trac ticket #256).
-----------------------------------------------------------------------
Summary of changes:
milena/ChangeLog | 5 +++++
milena/mln/core/internal/site_relative_iterator_base.hh | 3 ++-
2 files changed, 7 insertions(+), 1 deletion(-)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

olena: olena-2.0-895-g0a79e3b Merge branch 'master' into exp/TL
by myriam robert-seidowsky 18 Apr '14
by myriam robert-seidowsky 18 Apr '14
18 Apr '14
This is a merge commit message of the following branches:
Merge: fcf3eb5 bb6ddb7
Conflicts:
ChangeLog
configure.ac
milena/ChangeLog
milena/apps/morphers/iz.cc
milena/mln/algebra/quat.hh
milena/mln/core/internal/labeled_image_base.hh
milena/mln/debug/trace.hh
milena/mln/fun/v2v/rgb8_to_rgbn.hh
milena/mln/io/magick/load.hh
milena/mln/value/int_u.hh
milena/mln/world/binary_2d/subsample.hh
milena/tests/fun/Makefile.am
scribo/scribo/filter/object_groups_with_holes.hh
scribo/scribo/primitive/regroup/from_single_left_link.hh
scribo/scribo/text/extract_paragraphs_hdoc.hh
scribo/scribo/toolchain/internal/text_in_picture_functor.hh
scribo/tests/primitive/extract/alignments.cc
.dir-locals.el | 5 +
AUTHORS | 108 +-
COPYING | 14 +-
ChangeLog | 135 +-
HACKING | 7 +-
INSTALL | 9 +-
bootstrap | 4 +-
build-aux/.gitignore | 1 +
build-aux/mln_add_file | 8 +-
configure.ac | 64 +-
doc/Doxyfile.in | 4 +-
doc/Makefile.am | 92 +-
lrde-scmstats.sh | 4 +-
milena/ChangeLog | 1827 +-
milena/Makefile.am | 1 +
milena/apps/Makefile.am | 6 +-
.../constrained-connectivity.cc | 10 +-
milena/apps/generic-skel/Makefile.am | 115 +
.../generic-skel/image2d-skel-unconstrained.cc | 92 +
.../generic-skel/image2d-skel-with-end-points.cc | 94 +
.../generic-skel/image3d-skel-unconstrained.cc | 109 +
.../generic-skel/image3d-skel-with-1d-isthmuses.cc | 114 +
.../generic-skel/image3d-skel-with-end-points.cc | 114 +
milena/apps/generic-skel/image3d-skel.hh | 399 +
.../test-image2d-skel-unconstrained.in | 24 +
.../test-image2d-skel-with-end-points.in | 24 +
milena/apps/generic-skel/test-mixed.in | 25 +
milena/apps/graph-morpho/convert.hh | 4 +-
milena/apps/graph-morpho/make.hh | 6 +-
milena/apps/graph-morpho/morpho.hh | 8 +-
milena/apps/mesh-segm-skel/Makefile.am | 187 +-
.../apps/mesh-segm-skel/mesh-complex-2-collapse.cc | 153 +
.../mesh-complex-max-curv-1-collapse.cc | 386 +
.../mesh-complex-max-curv-2-collapse.cc | 328 +
.../mesh-complex-max-curv-extrema.cc | 187 +
.../mesh-segm-skel/mesh-complex-max-curv-segm.cc | 56 +-
.../mesh-segm-skel/mesh-complex-max-curv-skel.cc | 328 +
.../apps/mesh-segm-skel/mesh-complex-max-curv.cc | 17 +-
.../mesh-segm-skel/mesh-complex-pinv-curv-segm.cc | 192 +
.../mesh-segm-skel/mesh-complex-pinv-curv-skel.cc | 344 +
milena/apps/mesh-segm-skel/mesh-complex-segm.cc | 26 +-
milena/apps/mesh-segm-skel/mesh-complex-skel.cc | 126 +-
milena/apps/mesh-segm-skel/misc.hh | 15 +-
milena/apps/mesh-segm-skel/off-to-vtk-bin.cc | 58 +
milena/apps/mesh-segm-skel/save_bin_alt.hh | 310 +-
.../mesh-segm-skel/test-mesh-complex-2-collapse.in | 23 +
.../test-mesh-complex-max-curv-1-collapse.in | 24 +
.../test-mesh-complex-max-curv-2-collapse.in | 24 +
.../test-mesh-complex-max-curv-extrema.in | 26 +
.../test-mesh-complex-max-curv-skel.in | 26 +
.../test-mesh-complex-pinv-curv-segm.in | 27 +
.../test-mesh-complex-pinv-curv-skel.in | 26 +
milena/apps/mesh-segm-skel/test-mixed.in | 25 +
milena/apps/morphers/iz.cc | 35 +-
milena/apps/morphers/recorder-bft.cc | 9 +-
milena/doc/Doxyfile.in | 6 +-
milena/doc/Makefile.am | 77 +-
milena/doc/examples/devel/facade.cc.raw | 4 +-
milena/doc/examples/devel/impl.cc.raw | 7 +-
milena/doc/figures/extend-1.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/extend-2.ppm | Bin 16546 -> 16547 bytes
milena/doc/figures/extend-3.ppm | Bin 16546 -> 16547 bytes
milena/doc/figures/extend-4.ppm | 2 +-
milena/doc/figures/extend-5.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/fill-1.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/fill-2.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/fill-imageif-cfun-1.ppm | Bin 206 -> 207 bytes
milena/doc/figures/fill-subdomain-1.pbm | 2 +-
milena/doc/figures/fill-subdomain-2.ppm | Bin 206 -> 207 bytes
milena/doc/figures/fill-subdomain-3.ppm | Bin 206 -> 207 bytes
milena/doc/figures/fill-subdomain-4.ppm | Bin 206 -> 207 bytes
milena/doc/figures/ima2d-rot-1.ppm | Bin 235320 -> 235321 bytes
milena/doc/figures/ima2d-rot-2.ppm | Bin 235320 -> 235321 bytes
milena/doc/figures/ima_save.pbm | 2 +-
milena/doc/figures/labeling-compute-1.pbm | 2 +-
milena/doc/figures/labeling-compute-2.ppm | Bin 206 -> 207 bytes
milena/doc/figures/logical-not-1.pbm | 2 +-
milena/doc/figures/logical-not-2.pbm | 2 +-
milena/doc/figures/logical-not-3.pbm | 2 +-
milena/doc/figures/tuto2_first_image-1.pbm | 2 +-
milena/doc/figures/tuto3_colorize-1.pgm | Bin 141 -> 142 bytes
milena/doc/figures/tuto3_colorize-2.ppm | Bin 191 -> 192 bytes
milena/doc/figures/tuto3_rw_image-1.ppm | Bin 4918 -> 4919 bytes
milena/doc/figures/tuto3_rw_image-2.ppm | 2 +-
milena/doc/figures/tuto3_rw_image-3.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-1.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-2.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-3.pbm | 2 +-
.../figures/tuto4_genericity_and_algorithms-4.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-5.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-6.ppm | Bin 12406 -> 12407 bytes
milena/doc/generate_dist_files.sh | 47 -
milena/doc/tools/clearbanner.sh | 21 -
milena/doc/tools/todoxygen.sh | 23 +-
milena/headers.mk | 20 +-
milena/img/README | 6 +
milena/img/bunny.pgm | Bin 0 -> 27000043 bytes
milena/mesh/Makefile.am | 26 +-
milena/mesh/bunny-holefilled.vtk |458714 ++++++++++++++++++++
milena/mesh/pseudo-manifold.vtk | 188 +
milena/mesh/teapot.vtk |25008 ++
milena/mesh/tetrahedron.vtk | 48 +
milena/mln/accu/stat/median_alt.hh | 14 +-
milena/mln/accu/transform_snake.hh | 2 +-
milena/mln/algebra/mat.hh | 4 +-
milena/mln/algebra/quat.hh | 7 +-
milena/mln/canvas/all.hh | 2 +-
.../canvas/browsing/dir_struct_elt_incr_update.hh | 31 +-
milena/mln/core/alias/complex_image.hh | 18 +-
milena/mln/core/concept/function.hh | 12 +-
milena/mln/core/contract.hh | 11 +-
.../mln/core/image/dmorph/mutable_extension_ima.hh | 272 +
milena/mln/core/image/graph_elt_neighborhood_if.hh | 8 +-
milena/mln/core/image/graph_elt_window_if.hh | 10 +-
milena/mln/core/image/image2d.hh | 5 -
milena/mln/core/image/imorph/labeled_image.hh | 8 +-
milena/mln/core/image/vmorph/fun_image.hh | 24 +-
milena/mln/core/internal/classical_window_base.hh | 1 -
milena/mln/core/internal/image_morpher.hh | 1 -
milena/mln/core/internal/labeled_image_base.hh | 35 +-
milena/mln/core/point.hh | 2 +-
milena/mln/core/routine/mutable_extend.hh | 67 +
milena/mln/core/site_set/p_edges.hh | 16 +-
milena/mln/core/site_set/p_graph_piter.hh | 4 +-
milena/mln/core/site_set/p_line2d.hh | 1 -
milena/mln/core/site_set/p_set.hh | 14 +-
milena/mln/data/fill.hh | 3 +-
milena/mln/data/stretch.hh | 12 +-
milena/mln/debug/trace.hh | 40 +-
milena/mln/draw/dashed_line.hh | 18 +-
milena/mln/fun/p2b/antilogy.hh | 1 -
milena/mln/fun/p2b/tautology.hh | 1 -
milena/mln/fun/v2v/array.hh | 11 +-
milena/mln/fun/v2v/rgb8_to_rgbn.hh | 61 +-
milena/mln/fun/v2v/rgb_to_hsl.hh | 2 +-
milena/mln/fun/x2x/rotation.hh | 7 +-
milena/mln/geom/complex_geometry.hh | 16 +-
milena/mln/io/fld/write_header.hh | 9 +-
milena/mln/io/magick/load.hh | 6 +-
milena/mln/io/off/load.hh | 27 +-
milena/mln/io/off/save.hh | 10 +-
milena/mln/io/pdf/load.hh | 8 +-
milena/mln/io/pnm/save_header.hh | 10 +-
milena/mln/io/raw/load.hh | 3 +-
milena/mln/io/tiff/load.hh | 10 +-
milena/mln/io/vtk/all.hh | 47 +
milena/mln/io/vtk/load.hh | 615 +
milena/mln/io/vtk/save.hh | 649 +
milena/mln/labeling/flat_zones.hh | 4 +-
milena/mln/linear/#ch_convolve.hh# | 103 -
milena/mln/linear/gaussian.hh | 3 +-
milena/mln/make/attachment.hh | 53 +-
milena/mln/make/cell.hh | 11 +-
milena/mln/make/detachment.hh | 56 +-
milena/mln/math/pi.hh | 10 +-
milena/mln/morpho/tree/data.hh | 32 +-
milena/mln/morpho/tree/impl/dual_hqueue.hh | 5 +-
milena/mln/morpho/tree/impl/dual_union_find.hh | 13 +-
milena/mln/morpho/watershed/flooding.hh | 25 +-
milena/mln/morpho/watershed/topological.hh | 198 +-
milena/mln/registration/icp.hh | 15 +-
milena/mln/tag/init.hh | 1 -
milena/mln/test/positive.hh | 11 +-
milena/mln/test/predicate.hh | 8 +-
milena/mln/topo/connectivity_number_2d.hh | 130 +
milena/mln/topo/connectivity_number_3d.hh | 309 +
milena/mln/topo/detach.hh | 83 -
milena/mln/topo/detach_cell.hh | 154 +
milena/mln/topo/detach_pair.hh | 191 +
milena/mln/topo/detach_point.hh | 114 +
milena/mln/topo/is_facet.hh | 52 +-
milena/mln/topo/is_n_face.hh | 16 +-
milena/mln/topo/is_not_1d_isthmus.hh | 208 +
milena/mln/topo/is_not_end_point.hh | 121 +
milena/mln/topo/is_simple_2d.hh | 135 +-
milena/mln/topo/is_simple_cell.hh | 114 +-
milena/mln/topo/is_simple_pair.hh | 225 +
milena/mln/topo/is_simple_point2d.hh | 142 +
milena/mln/topo/is_simple_point3d.hh | 191 +
milena/mln/topo/no_constraint.hh | 82 +
milena/mln/topo/skeleton/breadth_first_thinning.hh | 171 +-
.../mln/topo/skeleton/priority_driven_thinning.hh | 215 +
milena/mln/trait/image/props.hh | 2 +-
milena/mln/trait/images.hh | 7 +-
milena/mln/transform/fft.hh | 705 +
milena/mln/util/adjacency_matrix.hh | 13 +-
milena/mln/util/array.hh | 43 +-
milena/mln/util/edge.hh | 3 +-
milena/mln/util/fibonacci_heap.hh | 93 +-
milena/mln/util/object_id.hh | 8 +-
milena/mln/util/set.hh | 4 +-
milena/mln/util/timer.hh | 24 -
milena/mln/util/tracked_ptr.hh | 8 +-
milena/mln/value/hsl.hh | 9 +-
milena/mln/value/int_u.hh | 194 +-
milena/mln/value/int_u.hxx | 198 +
milena/mln/value/internal/gray_f.hh | 2 +-
milena/mln/value/lut_vec.hh | 8 +-
milena/mln/value/qt/rgb32.hh | 78 +-
milena/mln/value/rgb.hh | 38 +-
milena/mln/version.hh.in | 19 +-
milena/mln/world/binary_2d/subsample.hh | 27 +-
milena/new-header | 4 +-
milena/tests/Makefile.am | 10 +-
milena/tests/accu/compute.cc | 5 +-
milena/tests/core/alias/Makefile.am | 3 +-
milena/tests/core/alias/dpoint2d.cc | 4 +-
milena/tests/core/alias/neighb2d.cc | 54 +
milena/tests/core/image/complex_image.hh | 20 +-
milena/tests/data/transform.cc | 18 +-
milena/tests/draw/Makefile.am | 4 +-
milena/tests/draw/dashed_line.cc | 53 +
milena/tests/draw/line.cc | 17 +-
milena/tests/io/Makefile.am | 5 +-
milena/tests/io/dump/Makefile.am | 4 +-
milena/tests/io/dump/dump.cc | 32 +
milena/tests/io/magick/load.cc | 2 +-
milena/tests/io/vtk/Makefile.am | 30 +
milena/tests/io/vtk/load_bin.cc | 60 +
milena/tests/io/vtk/load_save_bin.cc | 48 +
milena/tests/io/vtk/save.cc | 106 +
milena/tests/labeling/compute.cc | 14 +-
milena/tests/labeling/pack.cc | 13 +-
milena/tests/make/Makefile.am | 4 +-
milena/tests/make/attachment.cc | 77 +
milena/tests/make/detachment.cc | 98 +
milena/tests/topo/Makefile.am | 13 +-
milena/tests/topo/complex.cc | 3 +
milena/tests/topo/connectivity_numbers_2d.cc | 87 +
milena/tests/topo/detach_pair.cc | 73 +
milena/tests/topo/is_facet.cc | 80 +
milena/tests/topo/is_simple_pair.cc | 73 +
milena/tests/topo/skeleton/Makefile.am | 12 +-
.../tests/topo/skeleton/breadth_first_thinning.cc | 74 +
.../skeleton/breadth_first_thinning_constrained.cc | 78 +
.../topo/skeleton/priority_driven_thinning.cc | 92 +
.../priority_driven_thinning_constrained.cc | 96 +
milena/tests/transform/Makefile.am | 22 +-
milena/tests/transform/fft.cc | 105 +
milena/tests/unit_test/Makefile.am | 3 +-
milena/tests/unit_test/cond_tests_fftw3 | 1 +
milena/tests/unit_test/unit-tests.mk | 35 +-
milena/tests/util/line_graph.cc | 22 +-
milena/tests/value/Makefile.am | 8 +-
milena/tests/value/int_u32.cc | 37 +
milena/tests/value/scalar.cc | 90 -
milena/tests/world/binary_2d/Makefile.am | 11 +-
milena/tests/world/binary_2d/subsample.cc | 48 +
milena/tools/Makefile.am | 66 +-
milena/tools/compute_local_configurations.cc | 109 +
milena/tools/connectivity_numbers_3d.cc | 46 +
milena/tools/connectivity_numbers_3d.hh | 407 +
milena/tools/connectivity_numbers_3d_tbb.cc | 47 +
milena/tools/connectivity_numbers_3d_tbb.hh | 163 +
milena/tools/gen_cxx_lut | 103 +
milena/tools/simple_point3d_lut.cc | 48 +
milena/tools/simple_point3d_lut.hh | 190 +
milena/tools/simple_point3d_lut_26_6.cc | 30 +
milena/tools/simple_point3d_lut_tbb.cc | 49 +
milena/tools/simple_point3d_lut_tbb.hh | 185 +
milena/tools/test_simple_point3d_lut_26_6.cc | 136 +
milena/tools/tools.mk | 7 +-
milena/trash/display_color_pretty.hh | 15 +-
milena/trash/display_remove.hh | 13 +-
milena/trash/display_save.hh | 14 +-
milena/trash/display_save_and_show.hh | 10 +-
milena/trash/display_show.hh | 10 +-
milena/trash/neighb_get.hh | 6 +-
scribo/ChangeLog | 220 +-
scribo/demo/viewer/Makefile.am | 3 +-
scribo/doc/Doxyfile.in | 2 +-
scribo/doc/Makefile.am | 77 +-
scribo/doc/tools/todoxygen.sh | 23 +-
scribo/headers.mk | 3 +
scribo/scribo/afp/components.hh | 218 +
scribo/scribo/afp/link.hh | 181 +
scribo/scribo/afp/regroup.hh | 123 +
.../binarization/internal/local_threshold_core.hh | 3 +-
scribo/scribo/core/document.hh | 13 +-
scribo/scribo/core/internal/doc_serializer.hh | 18 +-
scribo/scribo/core/line_info.hh | 6 +-
scribo/scribo/core/line_set.hh | 2 -
scribo/scribo/core/object_groups.hh | 5 +-
scribo/scribo/core/paragraph_set.hh | 3 +-
scribo/scribo/estim/components_features.hh | 24 +-
scribo/scribo/filter/internal/component_aligned.hh | 4 +-
scribo/scribo/filter/internal/compute.hh | 4 +-
scribo/scribo/filter/object_groups_with_holes.hh | 2 +-
scribo/scribo/filter/objects_with_holes.hh | 33 +-
scribo/scribo/filter/separators_in_borders.hh | 14 -
scribo/scribo/io/xml/load.hh | 15 +-
scribo/scribo/postprocessing/fill_object_holes.hh | 9 -
scribo/scribo/preprocessing/deskew.hh | 7 +-
scribo/scribo/preprocessing/deskew_crop.hh | 3 +-
scribo/scribo/primitive/extract/alignments.hh | 8 +-
.../primitive/extract/lines_h_thick_and_thin.hh | 3 +-
scribo/scribo/primitive/extract/non_text.hh | 4 -
scribo/scribo/primitive/extract/non_text_kmean.hh | 5 +-
.../primitive/extract/separators_nonvisible.hh | 63 -
.../primitive/link/internal/link_functor_base.hh | 4 +-
.../primitive/regroup/from_single_left_link.hh | 4 +-
scribo/scribo/text/clean_inplace.hh | 15 +-
scribo/scribo/text/extract_paragraphs_hdoc.hh | 44 -
scribo/scribo/text/merging.hh | 55 +-
scribo/scribo/text/recognition.hh | 216 +-
.../toolchain/internal/text_in_picture_functor.hh | 42 +-
scribo/scribo/util/init_integral_image.hh | 5 +-
scribo/src/Makefile.am | 9 +-
scribo/src/afp/components.hh | 228 -
scribo/src/afp/link.hh | 178 -
scribo/src/afp/regroup.hh | 120 -
scribo/src/binarization/Makefile.am | 5 -
scribo/src/text_recognition_in_picture.cc | 4 +-
scribo/tests/preprocessing/crop.cc | 6 +-
.../preprocessing/crop_without_localization.cc | 6 +-
scribo/tests/preprocessing/deskew.cc | 6 +-
scribo/tests/preprocessing/rotate_90.cc | 6 +-
scribo/tests/primitive/extract/alignments.cc | 19 +-
scribo/tests/unit_test/unit-tests.mk | 3 +
swilena/ChangeLog | 10 +-
swilena/python/Makefile.am | 2 +-
321 files changed, 500117 insertions(+), 2789 deletions(-)
diff --cc ChangeLog
index cfd20e3,2314fc0..2d897e4
--- a/ChangeLog
+++ b/ChangeLog
@@@ -1,23 -1,134 +1,154 @@@
+2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * NEWS: Notify changes in data::convert prototype.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Cite papers in documentation.
+
+ * mln/linear/log.hh,
+ * mln/topo/skeleton/crest.hh: Here.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/doc.bib: Add more references.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * configure.ac: Do not configure milena/tests/fun/i2v and
+ milena/tests/fun/stat.
+
+ 2013-08-30 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * configure.ac: Untabify.
+
+ 2011-07-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove buggy symbol definitions.
+
+ * configure.ac: No longer define OLN_PACKAGE_NAME,
+ OLN_PACKAGE_BUGREPORT, OLN_PACKAGE_STRING and OLN_PACKAGE_VERSION
+ using AC_DEFINE_UNQUOTED.
+
+ 2010-08-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * configure.ac: Configure milena/apps/generic-skel/Makefile.
+
+ 2010-06-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * configure.ac: Configure milena/tests/io/vtk/Makefile.
+
+ 2010-07-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Configure tests in mesh-segm-skel apps.
+
+ * configure.ac: Configure
+ milena/apps/mesh-segm-skel/test-mesh-complex-pinv-curv-segm and
+ milena/apps/mesh-segm-skel/test-mesh-complex-pinv-curv-skel.
+
+ 2010-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Configure milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-skel.
+
+ * configure.ac: Here.
+
+ 2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Configure milena/apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.
+
+ * configure.ac: Here.
+
+ 2013-08-26 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve the generation of Doxyfiles in Olena.
+
+ * doc/Makefile.am (edit)
+ ($(srcdir)/user-refman.stamp):
+ Use `[@]' instead of `\@' for portability reasons.
+ (ID): New (empty).
+ ($(DOXYFILE_USER)): Do not depend on $Id$ from ChangeLog.
+ * doc/Doxyfile.in (PROJECT_NUMBER): Reintegrate @ID@ to the
+ project number, even if it is not yet set.
+ Improve the generation of Doxyfiles in Olena.
+
+ 2012-10-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Ask configure to try to find FFTW (version 3).
+
+ * configure.ac: Here.
+
+ 2013-08-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * AUTHORS: Update.
+
+ 2013-08-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * COPYING: Untabify.
+
+ 2013-08-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * configure.ac: Configure milena/tests/fun/v2i/Makefile.
+
+ 2010-04-23 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * configure.ac: Typo.
+
+ 2013-06-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Have configure find bib2bib and bibtex2html.
+
+ * configure.ac: Check for bib2bib and bibtex2html.
+ Define BIB2BIB and BIBTEX2HTML and use them...
+ * doc/Makefile.am (lrde_olena.bib, lrde_olena.html): ...here.
+ * bootstrap: No longer check for bib2bib and bibtex2html.
+
+ 2013-06-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Have configure find rst2html.
+
+ * configure.ac: Check for rst2html.
+ Define RST2HTML and use it...
+ * doc/Makefile.am (contributors.html): ...here.
+
+ 2013-06-18 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Mention bibtex2html and bib2bib as documentation build dependencies.
+
+ * HACKING (Required Software): Here.
+
+ 2013-06-18 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Require bibtex2html 1.95 and bib2bib 1.95.
+
+ * bootstrap: Here.
+ (require): Accept complex command line patterns as third argument
+ to handle bibtex2html's and bib2bib's ``--version'' option.
+
+ 2013-06-18 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Work around constraints of TeXLive's bibtex2html on Mac OS X.
+
+ * doc/Makefile.am (lrde_olena.html): Here.
+
+ 2013-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Shell-related portability fixes in Olena's Makefiles.
+
+ * doc/Makefile.am: Rewrite patterns ``perl X `find Y''' as
+ ``find Y -exec perl X {} \;'' to avoid long `perl' command lines and
+ please the shell.
+
+ 2013-06-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use `perl -pi' instead of `sed -i' in Olena.
+
+ * build-aux/mln_add_file,
+ * doc/Makefile.am,
+ * lrde-scmstats.sh:
+ Here, as `sed -i' (with no backup file) behaves differently on
+ GNU/Linux and Mac OS X. For more information, see:
+ http://stackoverflow.com/questions/5694228/.
+
2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
Remove unstable viewer.
diff --cc INSTALL
index 7d1c323,7d1c323..a1e89e1
--- a/INSTALL
+++ b/INSTALL
@@@ -1,8 -1,8 +1,8 @@@
Installation Instructions
*************************
--Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
--2006, 2007, 2008, 2009 Free Software Foundation, Inc.
++Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
++Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
@@@ -226,6 -226,6 +226,11 @@@ order to use an ANSI C compiler
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
++ HP-UX `make' updates targets which have the same time stamps as
++their prerequisites, which makes it generally unusable when shipped
++generated files such as `configure' are involved. Use GNU `make'
++instead.
++
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
a workaround. If GNU CC is not installed, it is therefore recommended
diff --cc milena/ChangeLog
index 0b4eefd,3a3a087..c9cdf37
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@@ -1,723 -1,1826 +1,2546 @@@
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/labeling/labeling.dox: Write general documentation on
+ labeling.
+
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/ref-guide.tex: Mention *_without_localization routines in
+ reference guide.
+
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Document sub_image morpher.
+
+ * doc/examples-outputs.mk,
+ * doc/examples.mk,
+ * doc/figures.mk,
+ * doc/outputs.mk,
+ * doc/programs-examples.mk: Regen.
+
+ * doc/examples.dox: Revamp layout and add link to the new sub_image
+ example.
+
+ * doc/examples/sub_image.cc,
+ * doc/outputs/sub_image.txt,
+ * doc/figures/sub_image-1.pbm,
+ * doc/figures/sub_image-2.pbm: New.
+
+ * mln/core/image/dmorph/sub_image.hh: Write documentation.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/routine/duplicate.hh: Document this routine.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Small fixes in documentation.
+
+ * doc/mln/core/image/morphers.dox: Add a reference to duplicate().
+
+ * mln/core/pixter1d.hh: Remove \internal commands.
+
+ * mln/data/transform.hh: Improve layout of pseudo-code.
+
+ * mln/io/pdf/load.hh: Remove duplicate '*' in comments.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Improve documentation of several macros.
+
+ * mln/core/concept/iterator.hh: Document arguments.
+
+ * mln/core/macros.hh: Add more documentation details for iterator
+ related macros.
+
+ * mln/core/var.hh: Fix typos.
+
+ * mln/debug/trace.hh: Add documentation to mln_trace and
+ mln_trace_warning.
+
+ * mln/trait/value_.hh: Add documentation to several common macros.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Fix missing parts of mln::box interface in documentation.
+
+ * doc/mln/core/alias/box1d.dox,
+ * doc/mln/core/alias/box2d.dox,
+ * doc/mln/core/alias/box2d_h.dox,
+ * doc/mln/core/alias/box3d.dox: Make class inherit from box_impl.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/var.hh: Document mln_VAR().
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Cross reference algebra::vec and make::vec in their respective
+ documentation.
+
+ * mln/algebra/vec.hh,
+ * mln/make/vec.hh: Here.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Document extended and transformed_image morphers.
+
+ * doc/examples-outputs.mk,
+ * doc/examples.mk,
+ * doc/outputs.mk: Regen.
+
+ * doc/examples.dox: Add link to new examples.
+
+ * doc/outputs/extended_image.txt,
+ * doc/outputs/transformed_image.txt,
+ * doc/examples/extended_image.cc,
+ * doc/examples/transformed_image.cc: New.
+
+ * doc/programs-examples.mk: Add new example programs.
+
+ * mln/core/image/dmorph/extended.hh,
+ * mln/core/image/dmorph/transformed_image.hh: Write documentation
+ and insert example code.
+
+ * mln/fun/p2p/fold.hh,
+ * mln/fun/p2p/mirror.hh,
+ * mln/fun/p2p/translation.hh: Make references to
+ transformed_image.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/site_set/box.hh: Add shrink() and to_smaller() members.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a module related to literals.
+
+ * doc/mln/literal/literal.dox: New.
+
+ * mln/literal/black.hh,
+ * mln/literal/colors.hh,
+ * mln/literal/identity.hh,
+ * mln/literal/max.hh,
+ * mln/literal/min.hh,
+ * mln/literal/one.hh,
+ * mln/literal/origin.hh,
+ * mln/literal/white.hh,
+ * mln/literal/zero.hh: Move to literal module.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Small fixes in existing documentation.
+
+ * mln/data/convert.hh: Remove a duplicate \overload.
+
+ * mln/core/macros.hh: Fix definitions.
+
+ * mln/value/qt/rgb32.hh: Fix invalid cross reference.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/concept/iterator.hh: Document iterator macros.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Move concepts in their related type module.
+
+ * mln/core/concept/image.hh,
+ * mln/core/concept/neighborhood.hh,
+ * mln/core/concept/site_set.hh,
+ * mln/core/concept/value.hh,
+ * mln/core/concept/window.hh: Here.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/Doxyfile.in: Hide 'It' symbol.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/core/image/images.dox: Document generic image interface.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/main.dox: Set macro module as top level entry.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/concept/image.hh: Document Image concept.
+
+2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/value/value/dox: Specify that built-in types can be
+ used.
+
+2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Introduce a new module for useful macros.
+
+ * doc/mln/core/macros.dox: New.
+
+ * doc/mln/main.dox: New module.
+
+ * mln/core/macros.hh: Add comments.
+
+2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Improve documentation in fun::p2b, fun::p2p, fun::p2v and
+ fun::x2v.
+
+ * mln/fun/p2b/antilogy.hh,
+ * mln/fun/p2b/big_chess.hh,
+ * mln/fun/p2b/chess.hh,
+ * mln/fun/p2b/has.hh,
+ * mln/fun/p2b/tautology.hh,
+ * mln/fun/p2p/fold.hh,
+ * mln/fun/p2p/mirror.hh,
+ * mln/fun/p2p/translation.hh,
+ * mln/fun/p2v/elifs.hh,
+ * mln/fun/p2v/iota.hh,
+ * mln/fun/p2v/ternary.hh,
+ * mln/fun/x2v/bilinear.hh,
+ * mln/fun/x2v/l1_norm.hh,
+ * mln/fun/x2v/nneighbor.hh,
+ * mln/fun/x2v/trilinear.hh: Here.
+
+2013-04-24 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Handle 16 bits value types with io::magick.
+
+ * mln/io/magick/load.hh,
+ * mln/io/magick/save.hh: Enable portions of code supporting 16bits
+ images if GraphicsMagick supports it.
+
+2013-04-24 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Relax conversion dispatch.
+
+ * mln/convert/impl/from_value_to_value.hh: Disable dispatch and
+ rely on from_to().
+
+ * mln/value/rgb.hh: Add a from_to_() overload to handle conversion
+ from rgb<n> to rgb<m>.
+
+2013-04-23 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * tests/io/magick/save.cc: Kill compilation warnings.
+
+2013-04-23 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add save options to magick::save.
+
+ * mln/io/magick/save.hh: Add save_options structure.
+
+2013-04-23 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a new routine to get image headers thanks to GraphicsMagick.
+
+ * mln/io/magick/get_header.hh,
+ * mln/tests/io/magick/get_header.cc: New
+
+ * mln/tests/io/magick/Makefile.am: New target.
+
+2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * tests/fun/Makefile.am: Remove duplicate subdir entry for v2v.
+
+2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Swap arguments in data::convert.
+
+ * mln/data/convert.hh: Here.
+
+ * apps/morphers/iz.cc,
+ * demos/inter_pixel/inter_pixel.cc,
+ * doc/examples/trash/graph.cc,
+ * doc/mln/convert.dox,
+ * mln/debug/superpose.hh,
+ * mln/morpho/watershed/superpose.hh,
+ * mln/world/binary_2d/subsample.hh,
+ * tests/data/compute_in_window.cc,
+ * tests/data/convert.cc: Update calls to data::convert.
+
+2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/io/io.dox: List the required dependencies for each I/O
+ type.
+
+2013-04-26 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/internal/image_base.hh: Add more documentation for
+ destroy() method.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/topo/topo.dox: New. Introduce mathematical topology
+ module.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add more "See also" statement in function documentation.
+
+ * mln/fun/v2b/always_false.hh,
+ * mln/fun/v2b/always_true.hh,
+ * mln/fun/v2b/lnot.hh,
+ * mln/fun/v2b/threshold_ge.hh,
+ * mln/fun/v2b/threshold_le.hh,
+ * mln/fun/v2v/abs.hh,
+ * mln/fun/v2v/all_to.hh,
+ * mln/fun/v2v/array.hh,
+ * mln/fun/v2v/cast.hh,
+ * mln/fun/v2v/ch_function_value.hh,
+ * mln/fun/v2v/component.hh,
+ * mln/fun/v2v/convert.hh,
+ * mln/fun/v2v/dec.hh,
+ * mln/fun/v2v/enc.hh,
+ * mln/fun/v2v/hsl_to_rgb.hh,
+ * mln/fun/v2v/id.hh,
+ * mln/fun/v2v/inc.hh,
+ * mln/fun/v2v/index_of_value.hh,
+ * mln/fun/v2v/linear.hh,
+ * mln/fun/v2v/mahalanobis.hh,
+ * mln/fun/v2v/norm.hh,
+ * mln/fun/v2v/projection.hh,
+ * mln/fun/v2v/qt_rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb8_to_rgbn.hh,
+ * mln/fun/v2v/rgb_to_hsl.hh,
+ * mln/fun/v2v/rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb_to_luma.hh,
+ * mln/fun/v2v/round.hh,
+ * mln/fun/v2v/round_sat.hh,
+ * mln/fun/v2v/saturate.hh,
+ * mln/fun/v2v/value_at_index.hh,
+ * mln/fun/v2v/wrap.hh,
+ * mln/fun/vv2b/eq.hh,
+ * mln/fun/vv2b/ge.hh,
+ * mln/fun/vv2b/gt.hh,
+ * mln/fun/vv2b/implies.hh,
+ * mln/fun/vv2b/le.hh,
+ * mln/fun/vv2b/lt.hh,
+ * mln/fun/vv2v/diff_abs.hh,
+ * mln/fun/vv2v/land.hh,
+ * mln/fun/vv2v/land_not.hh,
+ * mln/fun/vv2v/lor.hh,
+ * mln/fun/vv2v/lxor.hh,
+ * mln/fun/vv2v/max.hh,
+ * mln/fun/vv2v/min.hh,
+ * mln/fun/vv2v/vec.hh: Here.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/make/relabelfun.hh: Fix bad variable replacement.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/Doxyfile.in: Enable BRIEF_MEMBER_DESC.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/split-examples.mk: Regen.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/concept/function.hh: Make Function_vv2b inherit from
+ Function_vv2v.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add function module in Milena documentation.
+
+ * doc/mln/fun/fun.dox: Add new documentation groups.
+
+ * doc/mln/main.dox: Include a figure of the function hierarchy.
+
+ * mln/fun/n2v/white_gaussian.hh,
+ * mln/fun/v2v/abs.hh,
+ * mln/fun/v2v/cast.hh,
+ * mln/fun/v2v/ch_function_value.hh,
+ * mln/fun/v2v/component.hh,
+ * mln/fun/v2v/convert.hh,
+ * mln/fun/v2v/dec.hh,
+ * mln/fun/v2v/enc.hh,
+ * mln/fun/v2v/hsl_to_rgb.hh,
+ * mln/fun/v2v/id.hh,
+ * mln/fun/v2v/inc.hh,
+ * mln/fun/v2v/linear.hh,
+ * mln/fun/v2v/norm.hh,
+ * mln/fun/v2v/projection.hh,
+ * mln/fun/v2v/qt_rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb8_to_rgbn.hh,
+ * mln/fun/v2v/rgb_to_hsl.hh,
+ * mln/fun/v2v/rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb_to_luma.hh,
+ * mln/fun/v2v/round.hh,
+ * mln/fun/v2v/round_sat.hh,
+ * mln/fun/v2v/saturate.hh,
+ * mln/fun/v2v/wrap.hh,
+ * mln/fun/v2w2v/all.hh,
+ * mln/fun/v2w2v/cos.hh,
+ * mln/fun/v2w_w2v/all.hh,
+ * mln/fun/v2w_w2v/norm.hh,
+ * mln/fun/vv2b/all.hh,
+ * mln/fun/vv2b/eq.hh,
+ * mln/fun/vv2b/ge.hh,
+ * mln/fun/vv2b/gt.hh,
+ * mln/fun/vv2b/implies.hh,
+ * mln/fun/vv2b/le.hh,
+ * mln/fun/vv2b/lt.hh: Move to their respective function group.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/convert.dox: Fix a typo.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/Makefile.am: Do not regenerate non-generated images.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a new figure in Milena documentation.
+
+ * doc/img/function_hierarchy.png,
+ * doc/img/src/function_hierarchy.dia: New.
+
+2013-04-25 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Move fun::i2v, fun::stat and fun::v2i in fun::v2v.
+
+ * mln/fun/i2v/all_to.hh,
+ * mln/fun/i2v/array.hh,
+ * mln/fun/i2v/value_at_index.hh,
+ * mln/fun/stat/mahalanobis.hh,
+ * mln/fun/v2i/index_of_value.hh,
+ * tests/fun/i2v/all_to.cc,
+ * tests/fun/i2v/array.cc,
+ * tests/fun/i2v/value_at_index.cc,
+ * tests/fun/stat/mahalanobis.cc,
+ * tests/fun/v2i/index_of_value.cc: Move...
+
+ * mln/fun/v2v/all_to.hh,
+ * mln/fun/v2v/array.hh,
+ * mln/fun/v2v/index_of_value.hh,
+ * mln/fun/v2v/mahalanobis.hh,
+ * mln/fun/v2v/value_at_index.hh,
+ * tests/fun/v2v/all_to.cc,
+ * tests/fun/v2v/array.cc,
+ * tests/fun/v2v/index_of_value.cc,
+ * tests/fun/v2v/mahalanobis.cc,
+ * tests/fun/v2v/value_at_index.cc,
+ * tests/fun/x2x/composed.cc,
+ * tests/fun/x2x/translation.cc: ... here.
+
+ * mln/fun/stat/all.hh,
+ * mln/fun/i2v/essential.hh,
+ * mln/fun/i2v/all.hh,
+ * mln/fun/v2i/all.hh,
+ * tests/fun/i2v/Makefile.am,
+ * tests/fun/stat/Makefile.am,
+ * tests/fun/v2i/Makefile.am: Remove.
+
+ * tests/fun/Makefile.am: Remove deprecated subdirs.
+
+ * tests/fun/v2v/Makefile.am: Add new targets.
+
+ * apps/papers/levillain.09.ismm/classif-graph.cc,
+ * doc/examples/graph-data.cc,
+ * doc/examples/split/graph-data-4.cc.raw,
+ * doc/examples/trash/graph.cc,
+ * doc/examples/trash/mk_graph.cc,
+ * doc/examples/trash/tuto_bis.cc,
+ * headers.mk,
+ * mln/accu/label_used.hh,
+ * mln/accu/stat/var.hh,
+ * mln/algebra/vec.hh,
+ * mln/core/image/edge_image.hh,
+ * mln/core/image/image1d.hh,
+ * mln/core/image/image2d.hh,
+ * mln/core/image/image3d.hh,
+ * mln/core/image/vertex_image.hh,
+ * mln/core/internal/labeled_image_base.hh,
+ * mln/core/routine/init.hxx,
+ * mln/core/site_set/p_array.hh,
+ * mln/core/window.hh,
+ * mln/data/transform.spe.hh,
+ * mln/fun/all.hh,
+ * mln/fun/essential.hh,
+ * mln/fun/x2x/translation.hh,
+ * mln/histo/point_from_value.hh,
+ * mln/labeling/colorize.hh,
+ * mln/labeling/mean_values.hh,
+ * mln/labeling/pack.hh,
+ * mln/labeling/relabel.hh,
+ * mln/make/edge_image.hh,
+ * mln/make/p_edges_with_mass_centers.hh,
+ * mln/make/p_vertices_with_mass_centers.hh,
+ * mln/make/relabelfun.hh,
+ * mln/make/voronoi.hh,
+ * mln/metal/vec.hh,
+ * mln/morpho/line_gradient.hh,
+ * mln/trait/ch_function_value.hh,
+ * mln/util/array.hh,
+ * mln/value/lut_vec.hh,
+ * mln/win/ball.hh,
+ * tests/algebra/h_mat.cc,
+ * tests/algebra/mat.cc,
+ * tests/algebra/vec2.cc,
+ * tests/core/image/edge_image.cc,
+ * tests/core/image/graph_image.cc,
+ * tests/core/image/imorph/labeled_image.cc,
+ * tests/core/image/line_graph_image.cc,
+ * tests/core/image/vertex_and_edge_image.cc,
+ * tests/core/image/vertex_image.cc,
+ * tests/core/other/graph_elt_neighborhood.cc,
+ * tests/core/other/graph_elt_window.cc,
+ * tests/core/other/point_set_compatibility.cc,
+ * tests/core/site_set/p_vertices.cc,
+ * tests/draw/graph.cc,
+ * tests/graph/labeling.cc,
+ * tests/make/p_edges_with_mass_centers.cc,
+ * tests/make/p_vertices_with_mass_centers.cc,
+ * tests/morpho/artificial_line_graph_image_wst.cc,
+ * tests/morpho/closing/area_on_vertices.cc,
+ * tests/morpho/graph_image_morpho.cc,
+ * tests/morpho/graph_image_wst.cc,
+ * tests/morpho/lena_line_graph_image_wst1.cc,
+ * tests/morpho/lena_line_graph_image_wst2.cc,
+ * tests/morpho/line_graph_image_morpho.cc,
+ * tests/morpho/line_graph_image_wst.cc,
+ * tests/morpho/opening/area_on_vertices.cc,
+ * tests/pw/image.cc,
+ * tests/unit_test/unit-tests.mk,
+ * tools/area_flooding.cc: Rename fun::i2v, fun::stat and fun::v2i
+ namespaces to v2v.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/concept/function.hh: Document function interface for
+ each concept.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/image/image2d_ffmpeg.hh: Fix compilation issues.
+
+2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/image/image2d_ffmpeg.hh: Enable fastest access.
+
+2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/image/image2d_ffmpeg.hh: New image type for ffmpeg frames.
+
+2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add support for graylevel images in labeling::blobs.
+
+ * mln/canvas/labeling/blobs.hh: Add a fastest version and make it
+ support graylevel images.
+
+ * mln/labeling/blobs.hh,
+ * mln/labeling/blobs_and_compute.hh: Add support for graylevel images.
+
+ * tests/labeling/blobs.cc,
+ * tests/labeling/blobs_and_compute.cc: Add a test for graylevel images.
+
+ * tests/labeling/Makefile.am: Remove all_blobs target.
+
+ * mln/labeling/all_blobs.hh,
+ * tests/labeling/all_blobs.cc: Remove.
+
+2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/internal/pixel_impl.hh: Add change_offset().
+
+2013-04-17 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a labeling routine working on grayscale images.
+
+ * mln/canvas/labeling/blobs.hh,
+ * mln/labeling/blobs.hh,
+ * mln/labeling/blobs_and_compute.hh: Introduce a new functor
+ method handles().
+
+ * tests/labeling/Makefile.am: Add target.
+
+ * mln/labeling/all_blobs.hh,
+ * tests/labeling/all_blobs.cc: New.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Kill Doxygen warnings.
+
+ * mln/data/convert.hh: Add a missing \overload.
+
+ * mln/value/qt/rgb32.hh: Do not force autolink.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Specify conversion formulas for rgb to integer conversion
+ functions.
+
+ * mln/fun/v2v/rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb_to_luma.hh: Here.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Create sub-modules in image geometry module.
+
+ * doc/mln/geom/geom.dox: Add cropping sub-module.
+
+ * doc/mln/transformation.dox: Add new sub-modules.
+
+ * mln/binarization/threshold.hh: Move to conversion module.
+
+ * mln/geom/crop.hh,
+ * mln/geom/crop_without_localization.hh,
+ * mln/geom/horizontal_symmetry.hh,
+ * mln/geom/rotate.hh,
+ * mln/geom/translate.hh,
+ * mln/geom/vertical_symmetry.hh,
+ * mln/registration/icp.hh,
+ * mln/subsampling/antialiased.hh,
+ * mln/upscaling/art/scale2x.hh,
+ * mln/upscaling/art/scale3x.hh: Move to newly created sub-modules.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/convert.dox: Fix typos.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add documentation about image conversions.
+
+ * doc/mln/convert.dox: Add examples and explanations.
+
+ * mln/convert/from_to.hh,
+ * mln/convert/to.hh,
+ * mln/convert/to_image.hh,
+ * mln/convert/to_p_array.hh,
+ * mln/convert/to_p_set.hh,
+ * mln/convert/to_qimage.hh,
+ * mln/convert/to_qimage_nocopy.hh,
+ * mln/convert/to_upper_window.hh,
+ * mln/convert/to_window.hh,
+ * mln/data/convert.hh,
+ * mln/fun/v2v/convert.hh,
+ * mln/fun/v2v/hsl_to_rgb.hh,
+ * mln/fun/v2v/qt_rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb8_to_rgbn.hh,
+ * mln/fun/v2v/rgb_to_hsl.hh,
+ * mln/fun/v2v/rgb_to_int_u.hh,
+ * mln/fun/v2v/rgb_to_luma.hh: Add to conversion module.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/data/convert.hh: Introduce a new overload taking a
+ conversion function as parameter.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add references to from_to_ overloads in documentation.
+
+ * mln/algebra/h_mat.hh,
+ * mln/algebra/quat.hh,
+ * mln/algebra/vec.hh,
+ * mln/convert/from_to.hh,
+ * mln/convert/impl/from_double_to_value.hh,
+ * mln/convert/impl/from_float_to_value.hh,
+ * mln/convert/impl/from_unsigned_to_value.hh,
+ * mln/core/alias/neighb2d.hh,
+ * mln/core/alias/neighb3d.hh,
+ * mln/core/alias/window1d.hh,
+ * mln/core/alias/window2d.hh,
+ * mln/core/alias/window3d.hh,
+ * mln/core/concept/gpoint.hh,
+ * mln/core/image/#image2d#,
+ * mln/core/image/image1d.hh,
+ * mln/core/image/image2d.hh,
+ * mln/core/image/image3d.hh,
+ * mln/core/mixed_neighb.hh,
+ * mln/core/neighb.hh,
+ * mln/core/w_window.hh,
+ * mln/fun/i2v/array.hh,
+ * mln/histo/array.hh,
+ * mln/util/array.hh,
+ * mln/util/object_id.hh,
+ * mln/value/hsl.hh,
+ * mln/value/int_u.hh,
+ * mln/value/label.hh,
+ * mln/value/qt/rgb32.hh,
+ * mln/value/rgb.hh: Add to from_to_ group.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Explain how to iterate over an image in tutorial.
+
+ * doc/examples/split/tuto3_rw_image-3.cc.raw,
+ * doc/examples/split/tuto3_rw_image-4.cc.raw,
+ * doc/examples/split/tuto3_rw_image-5.cc.raw,
+ * doc/examples/split/tuto3_rw_image-6.cc.raw,
+ * doc/examples/split/tuto3_rw_image-7.cc.raw,
+ * doc/examples/split/tuto3_rw_image-8.cc.raw: Regen.
+
+ * doc/examples/tuto3_rw_image.cc: Add an example with iterators.
+
+ * doc/tutorial.tex: Add more explanations on iterators.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Introduce image transformation module in documentation.
+
+ * doc/mln/main.dox: Create new group.
+
+ * mln/geom/crop.hh,
+ * mln/geom/crop_without_localization.hh,
+ * mln/geom/horizontal_symmetry.hh,
+ * mln/geom/rotate.hh,
+ * mln/geom/translate.hh,
+ * mln/geom/vertical_symmetry.hh,
+ * mln/registration/icp.hh,
+ * mln/subsampling/antialiased.hh,
+ * mln/upscaling/art/scale2x.hh,
+ * mln/upscaling/art/scale3x.hh: move to this new group.
+
+2013-04-19 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Make template parameter name more consistant with naming
+ conventions.
+
+ * mln/core/image/image1d.hh,
+ * mln/core/image/image2d.hh,
+ * mln/core/image/image3d.hh: Here.
+
+2013-04-17 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add data::fill_without_localization.
+
+ * mln/data/fill_without_localization.hh,
+ * tests/data/fill_without_localization.cc: New.
+
+ * tests/data/Makefile.am: Add a new target.
+
+ 2013-09-02 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add parentheses around complex operands of operator `|'.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc:
+ Here, as suggested by g++ 4.7.
+
+ 2013-09-02 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Do not run test-mixed in Milena apps with the `check' target.
+
+ * apps/generic-skel/test-mixed.in,
+ * apps/mesh-segm-skel/test-mixed.in:
+ Add a `-wadgmm-2010' suffix to saved images to distinguish them
+ from outputs of other tests.
+ * apps/generic-skel/Makefile.am,
+ * apps/mesh-segm-skel/Makefile.am
+ (MOSTLYCLEANFILES): Adjust.
+ Add files generated by disabled test cases.
+ (generated_checked_tests): New.
+ Contain all generated checked tests.
+ (generated_tests): Set it to contain all test (checked
+ automatically and run manually).
+ (TESTS): Set it to $(generated_checked_tests).
+ Aesthetic changes.
+
+ 2013-08-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Aesthetic changes in Milena apps Makefiles.
+
+ * apps/generic-skel/Makefile.am,
+ * apps/mesh-segm-skel/Makefile.am:
+ Here.
+
+ 2013-08-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Factor the generation of tests in Milena's apps/mesh-segm-skel.
+
+ * apps/mesh-segm-skel/Makefile.am: Here.
+
+ 2013-08-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Distribute sources of generated tests in Milena apps.
+
+ * apps/generic-skel/Makefile.am (EXTRA_DIST): Add test-mixed.in.
+ * apps/mesh-segm-skel/Makefile.am (EXTRA_DIST): Add
+ test-mesh-complex-2-collapse.in,
+ test-mesh-complex-max-curv-2-collapse.in,
+ test-mesh-complex-max-curv-1-collapse.in and
+ test-mixed.in.
+
+ 2013-08-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Do not install Milena apps.
+
+ * apps/generic-skel/Makefile.am,
+ * apps/mesh-segm-skel/Makefile.am:
+ s/bin_PROGRAMS/noinst_PROGRAMS/.
+
+ 2013-08-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix the distribution.
+
+ * apps/generic-skel/Makefile.am (noinst_HEADERS):
+ Add image3d-skel.hh.
+
+ 2013-08-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix a Makefile inclusion in Milena's apps/generic-skel.
+
+ * apps/generic-skel/Makefile.am: Include
+ $(top_srcdir)/milena/common.mk.
+
+ 2013-08-30 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Simplify even more Milena Makefiles thanks to AM_DEFAULT_SOURCE_EXT.
+
+ * apps/generic-skel/Makefile.am,
+ * apps/mesh-segm-skel/Makefile.am,
+ * tests/io/vtk/Makefile.am,
+ * tests/transform/Makefile.am,
+ * tools/Makefile.am:
+ Here.
+
+ 2013-08-30 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Regen images of the Milena documentation.
+
+ * doc/figures/extend-1.ppm,
+ * doc/figures/extend-2.ppm,
+ * doc/figures/extend-3.ppm,
+ * doc/figures/extend-4.ppm,
+ * doc/figures/extend-5.ppm,
+ * doc/figures/fill-1.ppm,
+ * doc/figures/fill-2.ppm,
+ * doc/figures/fill-imageif-cfun-1.ppm,
+ * doc/figures/fill-subdomain-1.pbm,
+ * doc/figures/fill-subdomain-2.ppm,
+ * doc/figures/fill-subdomain-3.ppm,
+ * doc/figures/fill-subdomain-4.ppm,
+ * doc/figures/ima2d-rot-1.ppm,
+ * doc/figures/ima2d-rot-2.ppm,
+ * doc/figures/ima_save.pbm,
+ * doc/figures/labeling-compute-1.pbm,
+ * doc/figures/labeling-compute-2.ppm,
+ * doc/figures/logical-not-1.pbm,
+ * doc/figures/logical-not-2.pbm,
+ * doc/figures/logical-not-3.pbm,
+ * doc/figures/tuto2_first_image-1.pbm,
+ * doc/figures/tuto3_colorize-1.pgm,
+ * doc/figures/tuto3_colorize-2.ppm,
+ * doc/figures/tuto3_rw_image-1.ppm,
+ * doc/figures/tuto3_rw_image-2.ppm,
+ * doc/figures/tuto3_rw_image-3.ppm,
+ * doc/figures/tuto4_genericity_and_algorithms-1.ppm,
+ * doc/figures/tuto4_genericity_and_algorithms-2.ppm,
+ * doc/figures/tuto4_genericity_and_algorithms-3.pbm,
+ * doc/figures/tuto4_genericity_and_algorithms-4.ppm,
+ * doc/figures/tuto4_genericity_and_algorithms-5.ppm,
+ * doc/figures/tuto4_genericity_and_algorithms-6.ppm:
+ Regen.
+
+ 2013-08-30 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Make remaining Milena copyright headers uniform.
+
+ * apps/generic-skel/image2d-skel-unconstrained.cc,
+ * apps/generic-skel/image2d-skel-with-end-points.cc,
+ * apps/mesh-segm-skel/mesh-complex-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc,
+ * apps/mesh-segm-skel/off-to-vtk-bin.cc,
+ * mln/topo/is_not_1d_isthmus.hh,
+ * mln/topo/is_not_end_point.hh:
+ Here.
+
+ 2013-08-30 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Disable tests/value/int_u32 in Milena.
+
+ * tests/value/Makefile.am: Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix 3D simple point generators in Milena tools.
+
+ * tools/Makefile.am: Fix build rules of optional programs.
+ * tools/simple_point3d_lut_tbb.cc: Rename as...
+ * tools/simple_point_3d_lut_tbb.cc: ...this.
+ s/point_3d/point3d/.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Kill warnings about unused variables.
+
+ * mln/io/vtk/save.hh,
+ * tools/connectivity_numbers_3d_tbb.hh,
+ * tools/simple_point3d_lut_tbb.hh:
+ Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Kill warnings about signed vs unsigned values.
+
+ * mln/topo/is_not_1d_isthmus.hh
+ (mln::topo::is_not_1d_isthmus<I, N>::operator()): Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Catch up with the current interface of breadth_first_thinning.
+
+ * apps/morphers/recorder-bft.cc: Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Catch up with the current interface of mln::image3d.
+
+ * apps/generic-skel/image3d-skel-unconstrained.cc,
+ * apps/generic-skel/image3d-skel.hh:
+ Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Replace meyer_wst with watershed::flooding.
+
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-segm.cc: Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Convert remaining Milena code to mln_trace.
+
+ * doc/examples/devel/facade.cc.raw,
+ * doc/examples/devel/impl.cc.raw,
+ * mln/io/vtk/save.hh,
+ * mln/topo/skeleton/breadth_first_thinning.hh,
+ * mln/topo/skeleton/priority_driven_thinning.hh,
+ * new-header:
+ Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix the use of Pi in Milena's apps/mesh-segm-skel.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc:
+ Here.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix header inclusions in Milena's apps/mesh-segm-skel.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc:
+ Here.
+
+ 2012-02-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add tests to generate figures for the WADGMM 2010/LNCS submission.
+
+ * apps/generic-skel/image2d-skel-unconstrained.cc,
+ * apps/generic-skel/image2d-skel-with-end-points.cc,
+ * apps/generic-skel/image3d-skel-unconstrained.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc:
+ Display the size of the input.
+ Time the thinning step.
+ * milena/apps/generic-skel/test-mixed.in,
+ * milena/apps/mesh-segm-skel/test-mixed.in:
+ New.
+ * apps/generic-skel/Makefile.am (generated_tests): Add test-mixed.
+ (test-mixed): New target.
+ (check-mixed): New (phony) target.
+ * apps/mesh-segm-skel/Makefile.am: Likewise.
+ ($(generated_tests)): New target.
+ (AM_CPPFLAGS): Add -I$(top_builddir)/milena so that
+ mln/version.hh, which is a generated header, can be found by the
+ compiler.
+
+ 2011-06-13 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Introduce a no-constraint functor to replace fun::p2b::tautology.
+
+ * mln/fun/p2b/antilogy.hh,
+ * mln/fun/p2b/tautology.hh:
+ Do not include mln/core/alias/point2d.hh.
+ * mln/topo/no_constraint.hh: New file.
+ * mln/topo/skeleton/breadth_first_thinning.hh,
+ * mln/topo/skeleton/priority_driven_thinning.hh:
+ Use mln::topo::no_constraint instead of mln::fun::p2b::tautology.
+ Do not include the standard header `algorithm'.
+ * headers.mk, tests/unit_test/unit-tests.mk: Regen.
+
+ 2011-07-13 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Factor code of 2D skeletonizations in apps/generic-skel/.
+
+ * mln/topo/is_not_end_point.hh: s/nbh/nbh_fg/.
+ (is_not_end_point<I, N>::is_not_end_point(const Neighborhood<N>&)):
+ New ctor.
+ (is_not_end_point<I, N>::set_image): New method.
+ (is_not_end_point<I, N>::ima_): Turn this reference into a pointer.
+ Adjust.
+ * mln/topo/is_simple_point2d.hh
+ (mln::topo::is_simple_point2d<I, N>::operator())
+ * mln/topo/detach_point.hh
+ (mln::topo::detach_point<I>::operator()):
+ Add preconditions.
+ * apps/generic-skel/image2d-skel-with-end-points.cc:
+ Use `mln::topo::is_simple_point2d' and `mln:: topo::detach_point'
+ from mln/topo/, instead of `is_simple_2d' and `detach' from
+ image2d-skel.hh
+ * apps/generic-skel/image2d-skel-unconstrained.cc: Likewise.
+ Remove the (lack of) constraint, as
+ mln::topo::skeleton::breadth_first_thinning already takes care of
+ this.
+ * apps/generic-skel/image2d-skel.hh: Remove.
+ * apps/generic-skel/Makefile.am
+ (image2d_skel_unconstrained_SOURCES)
+ (image2d_skel_with_end_points_SOURCES):
+ Remove image2d-skel.hh.
+
+ 2011-07-13 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Misc changes in apps/generic-skel/ and tools/.
+
+ * apps/generic-skel/image3d-skel-unconstrained.cc:
+ Remove a useless header inclusion.
+ * apps/generic-skel/image3d-skel-with-end-points.cc:
+ Fix a comment.
+ * tools/compute_local_configurations.cc:
+ Add a comment.
+ * tools/connectivity_numbers_3d.hh: Add a FIXME.
+
+ 2011-07-13 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Exercise breadth-first thinning with predicate is_not_1d_isthmus.
+
+ * apps/generic-skel/image3d-skel-with-1d-isthmuses.cc: New.
+ * apps/generic-skel/Makefile.am (bin_PROGRAMS):
+ Add image3d-skel-with-1d-isthmuses.
+ (image3d_skel_with_1d_isthmuses_SOURCES): New.
+ (TESTS): Add image3d-skel-with-1d-isthmuses.
+ (MOSTLYCLEANFILES): Add
+ image3d-skel-with-1d-isthmuses-input.raw,
+ image3d-skel-with-1d-isthmuses-input.vtk,
+ image3d-skel-with-1d-isthmuses-skel.raw and
+ image3d-skel-with-1d-isthmuses-skel.vtk.
+
+ 2011-07-13 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a non 1D isthmus predicate for (2D and 3D) binary images.
+
+ * mln/topo/is_not_1d_isthmus.hh: New.
+ * headers.mk, tests/unit_test/unit-tests.mk: Regen.
+
+ 2011-07-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Check the consistency of tools/simple_point3d_lut_26_6.hh.
+
+ * tools/simple_point3d_lut_26_6.cc: New.
+ * tools/test_simple_point3d_lut_26_6.cc: New.
+ * tools/tools.mk (AM_CPPFLAGS): Add -I$(top_builddir)/milena.
+ * tools/Makefile.am (noinst_LTLIBRARIES): New.
+ Add libsimple_point3d_lut_26_6.la.
+ (libsimple_point3d_lut_26_6_la_SOURCES): New.
+ (EXTRA_PROGRAMS): Add test_simple_point3d_lut_26_6.
+ (test_simple_point3d_lut_26_6_SOURCES)
+ (test_simple_point3d_lut_26_6_LDADD):
+ New.
+
+ 2011-07-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix and improve the (fast) computation of 2D connectivity numbers.
+
+ * mln/topo/is_simple_2d.hh (mln::connectivity_number_2d): Create
+ the configuration number by considering that the first (resp.
+ last) neighbors (in the forward browsing order) represent the
+ least (resp. most) significant bits of the configuration number,
+ as does the algorithm that computed the 8-c and 4-c LUTs (arrays
+ mln::connectivity_number_c8 and mln::connectivity_number_c4).
+ * mln/topo/connectivity_number_2d.hh: New.
+ * mln/topo/is_simple_point2d.hh: Fix dates in copyright header.
+ * tests/topo/connectivity_numbers_2d.cc: New.
+ * tests/topo/Makefile.am (check_PROGRAMS):
+ Add connectivity_numbers_2d.
+ (connectivity_numbers_2d_SOURCES): New.
+
+ 2011-07-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add more tests.
+
+ * tests/core/alias/dpoint2d.cc: Exercise the substraction of a
+ dpoint2d from a point2d.
+ * tests/core/alias/neighb2d.cc: New.
+ * tests/core/alias/Makefile.am (check_PROGRAMS): Add neighb2d.
+ (neighb2d_SOURCES): New.
+ * tests/io/dump/dump.cc: Exercise mln::io::dump::load and
+ mln::io::dump::save with 3D binary images.
+ * tests/io/dump/Makefile.am (MOSTLYCLEANFILES):
+ Add dump-bool-3d.dump
+ * tests/value/int_u32.cc: New test (known to fail).
+ * tests/value/Makefile.am (check_PROGRAMS): Add int_u32.
+ (int_u32_SOURCES): New.
+ (XFAIL_TESTS): New.
+ Add int_u32.
+
+ 2011-07-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * apps/generic-skel/image3d-skel.hh: Add `inline' qualifiers.
+
+ 2011-07-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Introduce a better VTK output routine in apps/generic-skel.
+
+ * apps/generic-skel/image3d-skel.hh (save_vtk_polyhedrons):
+ New function.
+ Use it...
+ * apps/generic-skel/image3d-skel-unconstrained.cc,
+ * apps/generic-skel/image3d-skel-with-end-points.cc:
+ ...here, instead of save_vtk_polygons.
+
+ 2011-07-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a VTK output routine in apps/generic-skel.
+
+ * apps/generic-skel/image3d-skel.hh: Aesthetic changes.
+ (save_vtk_polygons): New function.
+ Use it...
+ * apps/generic-skel/image3d-skel-unconstrained.cc,
+ * apps/generic-skel/image3d-skel-with-end-points.cc:
+ ...here, to save images in VTK format.
+ * apps/generic-skel/Makefile.am (MOSTLYCLEANFILES):
+ Add image3d-skel-unconstrained-input.vtk,
+ image3d-skel-unconstrained-skel.vtk,
+ image3d-skel-with-end-points-input.vtk and
+ image3d-skel-with-end-points-skel.vtk,
+
+ 2011-07-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use package metadata macros instead of hard-coded strings in I/Os.
+
+ * mln/io/fld/write_header.hh (mln::io::fld::write_header)
+ * mln/io/off/save.hh
+ (mln::io::off::internal::off_saver<I, E>::operator())
+ * mln/io/pnm/save_header.hh (mln::io::pnm::save_header)
+ * mln/io/vtk/save.hh
+ (mln::io::vtk::internal::vtk_saver<I, E>::operator()):
+ Here.
+ * mln/version.hh.in (OLN_PACKAGE_URL, OLN_PACKAGE_AUTHORS):
+ New macros.
+
+ 2011-07-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ No longer consider mln/version.hh.in as handled by autoheader.
+
+ * mln/version.hh.in (OLN_PACKAGE_BUGREPORT, OLN_PACKAGE_NAME)
+ (OLN_PACKAGE_STRING, OLN_PACKAGE_VERSION): Define these macros
+ using "@PACKAGE_BUGREPORT@", "@PACKAGE_NAME@", "@PACKAGE_STRING@"
+ and "@PACKAGE_VERSION@".
+
+ 2011-06-16 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Set connectivity number functions when building is_simple_point3d.
+
+ * mln/topo/is_simple_point3d.hh
+ (mln::topo::is_simple_point3d<I, N>::init_): New method.
+ (connectivity_number_fun_t): New (private) typedef.
+ (connectivity_number_fg, connectivity_number_bg):
+ New (private) members.
+ Initialize them...
+ (mln::topo::is_simple_point3d<I, N>::is_simple_point3d):
+ ...from the ctors, using init_().
+
+ 2011-06-16 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix, factor and improve the (exact) simple 3D point criterion.
+
+ * mln/topo/is_simple_point3d.hh
+ (mln::topo::is_simple_point3d<I, N>::operator()):
+ Honor the neighborhoods.
+ Use the new routines to compute the connectivity numbers instead
+ of computing them directly.
+
+ 2011-06-16 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add routines to compute 3D connectivity numbers.
+
+ * mln/topo/connectivity_number_3d.hh: New.
+ * headers.mk, tests/unit_test/unit-tests.mk: Regen.
+
+ 2011-06-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve the generation of simple 3D point look-up tables.
+
+ * tools/gen_cxx_lut: New script.
+ * tools/Makefile.am (EXTRA_DIST): Add gen_cxx_lut.
+ (simple_point3d_lut_26_6.hh): Add a dependency on
+ $(srcdir)/gen_cxx_lut.
+ Use gen_cxx_lut to generate this target.
+
+ 2011-06-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ tools: s/simple_point_3d/simple_point3d/.
+
+ * tools/simple_point_3d_lut.cc,
+ * tools/simple_point_3d_lut.hh,
+ * tools/simple_point_3d_lut_tbb.hh:
+ Rename as...
+ * tools/simple_point3d_lut.cc,
+ * tools/simple_point3d_lut.hh,
+ * tools/simple_point3d_lut_tbb.hh:
+ ...these.
+ * tools/Makefile.am: s/simple_point_3d/simple_point3d/.
+
+ 2011-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New app: apps/generic-skel/image3d-skel-unconstrained.
+
+ * apps/generic-skel/image3d-skel-unconstrained.cc: New.
+ * apps/generic-skel/Makefile.am (bin_PROGRAMS):
+ Add image3d-skel-unconstrained.
+ (image3d_skel_unconstrained_SOURCES): New.
+ (TESTS): Rename as...
+ (generated_tests): New variable.
+ ($(generated_tests)): New target.
+ Supersede...
+ (test-image2d-skel-unconstrained test-image2d-skel-with-end-points):
+ ...this target.
+ (CLEANFILES): Set to $(generated_tests).
+ (TESTS): Add $(generated_tests).
+ Add image3d-skel-unconstrained and image3d-skel-with-end-points.
+ (MOSTLYCLEANFILES): Add image3d-skel-unconstrained-input.raw and
+ image3d-skel-unconstrained-skel.raw.
+
+ 2011-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Isolate reusable code from image3d-skel-with-end-points.
+
+ * apps/generic-skel/image3d-skel-with-end-points.cc
+ (load_pgm_3d, save_raw_3d, subsampling_3d, draw_torus):
+ Move functions...
+ * apps/generic-skel/image3d-skel.hh: ...here (new file).
+ (make_triple_torus): New function.
+ * apps/generic-skel/Makefile.am (noinst_HEADERS):
+ Add image3d-skel.hh.
+
+ 2011-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a 3D volume of the Stanford bunny.
+
+ * img/bunny.pgm: New.
+ From Benjamin Raynal <raynalb(a)esiee.fr>.
+ Document it...
+ * img/README: ...here.
+ * Makefile.am (dist_img_DATA): Add img/bunny.pgm.
+
+ 2011-06-01 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New application computing a 3D skeleton preserving end points.
+
+ * apps/generic-skel/image3d-skel-with-end-points.cc: New.
+ * apps/generic-skel/Makefile.am (bin_PROGRAMS):
+ Add image3d_skel_with_end_points.
+ (image3d_skel_with_end_points): New.
+ (MOSTLYCLEANFILES): Add image3d-skel-with-end-points-input.raw
+ and image3d-skel-with-end-points-skel.raw.
+
+ 2011-05-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Regen Milena's Makefile helpers.
+
+ * headers.mk, tests/unit_test/unit-tests.mk: Here.
+
+ 2011-05-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a first version of a simple 3D point predicate.
+
+ * mln/topo/is_simple_point3d.hh: New.
+
+ 2011-05-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Generate a simple 3D points look-up table for the (26,6)-adjacency.
+
+ * tools/Makefile.am (CLEANFILES): New.
+ Add simple_point_3d_lut_26_6.txt and simple_point_3d_lut_26_6.hh.
+ (simple_point_luts): New (phony) target.
+ (simple_point_3d_lut_26_6.txt)
+ (simple_point_3d_lut_26_6.hh):
+ New targets.
+
+ 2011-05-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Parallel computation of simple 3D point look-up tables.
+
+ * tools/simple_point_3d_lut_tbb.hh,
+ * tools/simple_point_3d_lut_tbb.cc:
+ New.
+ * tools/Makefile.am (noinst_HEADERS): Add simple_point_3d_lut_tbb.hh.
+ (EXTRA_PROGRAMS): Add simple_point_3d_lut_tbb.
+ (simple_point_3d_lut_tbb_SOURCES)
+ (simple_point_3d_lut_tbb_CPPFLAGS)
+ (simple_point_3d_lut_tbb_LDFLAGS):
+ New.
+
+ 2011-05-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Sequential computation of simple 3D points look-up tables.
+
+ * tools/simple_point_3d_lut.hh,
+ * tools/simple_point_3d_lut.cc:
+ New.
+ * tools/Makefile.am (noinst_HEADERS): Add simple_point_3d_lut.hh.
+ (EXTRA_PROGRAMS): Add simple_point_3d_lut.
+ (simple_point_3d_lut_SOURCES): New.
+
+ 2013-08-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve mln::topo::is_simple_2d_t.
+
+ * mln/topo/is_simple_2d.hh
+ (mln::topo::is_simple_2d_t<N>::nb_connectivity2d):
+ (mln::topo::is_simple_2d_t<N>::nb_connectivity2d__):
+ Use a more reliable method to identify the neighborhood.
+ * mln/topo/is_simple_point2d.hh: Typo in comment.
+
+ 2013-08-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Reintroduce is_simple_2d and connectivity_number_2d into mln::topo.
+
+ * mln/topo/is_simple_2d.hh (mln::topo::is_simple_2d)
+ (mln::topo::connectivity_number_2d):
+ New.
+ * apps/generic-skel/image2d-skel.hh (is_simple_2d::operator()):
+ Adjust.
+
+ 2011-05-31 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Factor connectivity_numbers_3d and connectivity_numbers_3d_tbb.
+
+ * tools/connectivity_numbers_3d.hh (connectivity_numbers_3d):
+ Reindent.
+ (connectivity_number_3d__6_26_one)
+ (connectivity_number_3d__6p_18_one)
+ (connectivity_number_3d__18_6p_one):
+ Fix types: s/config_3d_t/conn_number_t/.
+ (usage): New function.
+ (display_connectivity_numbers): New function.
+ Use it to simplify...
+ * tools/connectivity_numbers_3d.cc,
+ * tools/connectivity_numbers_3d_tbb.cc (main): ...these functions.
+ (usage): Remove.
+ * tools/compute_local_configurations.cc,
+ * tools/connectivity_numbers_3d_tbb.hh:
+ Add a comment.
+
+ 2011-05-25 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a parallel version of connectivity_numbers_3d using TBB.
+
+ * tools/connectivity_numbers_3d_tbb.hh,
+ * tools/connectivity_numbers_3d_tbb.cc:
+ New.
+ * tools/Makefile.am (CPPFLAGS_TBB, LDFLAGS_TBB): New.
+ (extra): New (phony) target.
+ (EXTRA_PROGRAMS)
+ (connectivity_numbers_3d_tbb_SOURCES)
+ (connectivity_numbers_3d_tbb_CPPFLAGS)
+ (connectivity_numbers_3d_tbb_LDFLAGS):
+ New variables.
+
+ 2011-05-25 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Make tools/connectivity_numbers_3d thread-safe.
+
+ * tools/connectivity_numbers_3d.hh
+ (connectivity_number_3d__6_26_one)
+ (connectivity_number_3d__26_6_one)
+ (connectivity_number_3d__6p_18_one)
+ (connectivity_number_3d__18_6p_one):
+ Create and use a copy of the neighborhood instead of using a
+ shared, thread-unsafe object.
+ Aesthetic changes.
+ * tools/connectivity_numbers_3d.cc: Aesthetic changes.
+
+ 2011-05-25 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Factor soon-to-be shared components of connectivity_numbers_3d.
+
+ * tools/connectivity_numbers_3d.cc: Move most of the contents of
+ this file into..
+ * tools/connectivity_numbers_3d.hh: ...this (new) file.
+ * tools/Makefile.am (connectivity_numbers_3d_SOURCES):
+ Add connectivity_numbers_3d.hh
+
+ 2011-05-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a tool to compute 3D connectivity numbers.
+
+ * tools/connectivity_numbers_3d.cc: New.
+ * tools/Makefile.am (noinst_PROGRAMS):
+ Add connectivity_numbers_3d.
+ (connectivity_numbers_3d_SOURCES): New.
+
+ 2011-04-21 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Have tools/compute_local_configurations compile.
+
+ * tools/compute_local_configurations.cc: Add missing header
+ inclusion (mln/value/int_u8.hh).
+ Add copyright notice.
+ * tools/Makefile.am (noinst_PROGRAMS): Add
+ compute_local_configurations.
+
+ 2011-04-21 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Import the computation of (2D) connectivity numbers from sandbox.
+
+ * tools/compute_local_configurations.cc: New.
+ Imported from
+ sandbox/inim/2009/ocr/compute_local_configurations.cc.
+
+ 2010-08-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New apps on generic skeletonization.
+
+ * apps/generic-skel/image2d-skel-unconstrained.cc,
+ * apps/generic-skel/image2d-skel-with-end-points.cc,
+ * apps/generic-skel/image2d-skel.hh:
+ New.
+ * apps/generic-skel/test-image2d-skel-unconstrained.in,
+ * apps/generic-skel/test-image2d-skel-with-end-points.in:
+ New tests.
+ * apps/generic-skel/Makefile.am: New.
+ * apps/Makefile.am (SUBDIRS): Add generic-skel.
+
+ 2011-04-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ apps/graph-morpho: Catch up with current mln::topo::is_n_face.
+
+ * apps/graph-morpho/morpho.hh
+ (trait::graph< mln::complex_image<1, G, V> >::is_vertex)
+ (trait::graph< mln::complex_image<1, G, V> >::is_edge):
+ Fix the return type.
+
+ 2011-03-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use priority-driven thinning in collapse-based thinnings apps.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc:
+ Here.
+
+ 2011-03-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Simplify curvature-based thinnings using 2- and 1-collapses apps.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc:
+ Here.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Miscellaneous changes in mesh-related operations.
+
+ * mln/topo/is_simple_cell.hh: Add static preconditions.
+ Reduce the number of pointer manipulations.
+ Aesthetic changes.
+ * mln/topo/detach_cell.hh: Move a static precondition.
+ Aesthetic changes.
+ * mln/io/vtk/save.hh: Cosmetic changes.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New apps: max curvature-based thinnings using 2- and 1-collapses.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc:
+ New.
+ * apps/mesh-segm-skel/test-mesh-complex-max-curv-2-collapse.in,
+ * apps/mesh-segm-skel/test-mesh-complex-max-curv-1-collapse.in:
+ New.
+ * apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
+ Add mesh-complex-max-curv-2-collapse.
+ And mesh-complex-max-curv-1-collapse
+ (mesh_complex_max_curve_2_collapse_SOURCES)
+ (mesh_complex_max_curve_1_collapse_SOURCES):
+ New.
+ (edit): New.
+ (test-mesh-complex-max-curv-2-collapse)
+ (test-mesh-complex-max-curv-1-collapse):
+ New target.
+ (TESTS, CLEANFILES): Add test-mesh-complex-max-curv-2-collapse
+ and test-mesh-complex-max-curv-1-collapse.
+ (MOSTLYCLEANFILES): Add teapot-max-curv-2-collapse.vtk,
+ bunny-holefilled-max-curv-2-collapse.vtk,
+ teapot-max-curv-1-collapse.vtk and
+ bunny-holefilled-max-curv-1-collapse.vtk.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add VTK versions of some OFF meshes.
+
+ * mesh/bunny-holefilled.vtk,
+ * mesh/teapot.vtk:
+ New.
+ Generated from mesh/bunny-holefilled.off and mesh/teapot.off using
+ apps/mesh-segm-skel/off-to-vtk-bin.
+ * mesh/Makefile.am (dist_mesh_DATA): Add bunny-holefilled.vtk and
+ teapot.vtk.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New app: binary OFF to VTK mesh conversion.
+
+ * apps/mesh-segm-skel/off-to-vtk-bin.cc: New.
+ * apps/mesh-segm-skel/Makefile.am
+ (bin_PROGRAMS): Add off-to-vtk-bin.
+ (off_to_vtk_bin_SOURCES): New.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New app performing a 2-collapse on a mesh.
+
+ * apps/mesh-segm-skel/mesh-complex-2-collapse.cc: New.
+ * apps/mesh-segm-skel/test-mesh-complex-2-collapse.in: New.
+ * apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
+ Add mesh-complex-2-collapse.
+ (mesh_complex_2_collapse_SOURCES): New.
+ (edit): New.
+ (test-mesh-complex-2-collapse): New target.
+ (TESTS, CLEANFILES): Add test-mesh-complex-2-collapse.
+ (MOSTLYCLEANFILES): Add pseudo-manifold-2-collapse.vtk.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Prevent a site from being introduced twice in thinning's queues.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh,
+ * mln/topo/skeleton/priority_driven_thinning.hh:
+ Use an image `in_queue' to tag sites inserted in the queue.
+
+ 2011-03-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add routines to identify and detach (collapse) simple pairs.
+
+ * mln/topo/is_simple_pair.hh,
+ * mln/topo/detach_pair.hh:
+ New.
+ * tests/topo/is_simple_pair.cc,
+ * tests/topo/detach_pair.cc:
+ New tests.
+ * tests/topo/Makefile.am (check_PROGRAMS): Add is_simple_pair and
+ detach_pair.
+ (detach_pair_SOURCES, is_simple_pair_SOURCES): New.
+ (MOSTLYCLEANFILES): New. Add detach_pair-out.vtk.
+
+ 2011-03-01 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add preliminary VTK input for binary images.
+
+ * mln/io/vtk/load.hh: New file.
+ Include it...
+ * mln/io/vtk/all.hh: ...here.
+ * tests/io/vtk/load_bin.cc,
+ * tests/io/vtk/load_save_bin.cc:
+ New.
+ * tests/io/vtk/Makefile.am (check_PROGRAMS): Add load_bin and
+ load_save_bin.
+ (load_bin_SOURCES, load_save_bin_SOURCES): New.
+ (MOSTLYCLEANFILES): Add load_save_bin-out.vtk.
+
+ 2011-03-01 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add VTK-format meshes.
+
+ * mesh/tetrahedron.vtk,
+ * mesh/pseudo-manifold.vtk:
+ New.
+ * mesh/Makefile.am (dist_mesh_DATA): Add tetrahedron.vtk and
+ pseudo-manifold.vtk.
+
+ 2011-03-01 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a pre-allocation routine to mln::geom::complex_geometry.
+
+ * mln/geom/complex_geometry.hh
+ (mln::geom::complex_geometry<D, P>::reserve): New.
+ Use it...
+ * mln/io/off/load.hh: ...here.
+ Aesthetic changes.
+
+ 2011-02-25 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Small corrections in apps/mesh-segm-skel.
+
+ * apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in:
+ Add a missing copyright header.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Exercise topology-related routines.
+
+ * tests/core/image/complex_image.hh
+ (make_test_bin_2complex_image2d): New function.
+ * tests/topo/is_facet.cc,
+ * tests/make/detachment.cc,
+ * tests/make/attachment.cc:
+ New.
+ * tests/topo/Makefile.am (check_PROGRAMS): Add is_facet.
+ (is_facet_SOURCES): New.
+ * tests/make/Makefile.am (check_PROGRAMS): Add attachment and
+ detachment.
+ (attachment_SOURCES, detachment_SOURCES): New.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New complex image alias: mln::bin_2complex_image2d.
+
+ * mln/core/alias/complex_image.hh (mln::bin_2complex_image2d):
+ New typedef.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Revamp mln::topo::is_simple_cell.
+
+ * mln/topo/is_simple_cell.hh
+ (mln::topo::is_simple_cell<I, N, NL, NH>::operator()):
+ Replace ad hoc code by a call to is_facet.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Have is_facet take into account the values of a (complex) image.
+
+ * mln/topo/is_facet.hh (mln::topo::is_facet): Take a binary image
+ and a neighborhood as arguments and take the image's values into
+ account.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Revamp topology-related routines.
+
+ * mln/make/attachment.hh,
+ * mln/make/cell.hh,
+ * mln/make/detachment.hh,
+ * mln/topo/detach_cell.hh:
+ Do not require the face passed as argument to be a facet.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Make the interface of thinning algorithms uniform w.r.t. functors.
+
+ * mln/topo/skeleton/priority_driven_thinning.hh
+ (mln::topo::skeleton::priority_driven_thinning): Catch up
+ with mln::topo::skeleton::breadth_first_thinning.
+ * mln/topo/detach_point.hh: Turn into a functor to match the new
+ interface of thinning algorithms.
+ * tests/topo/skeleton/breadth_first_thinning.cc
+ * tests/topo/skeleton/breadth_first_thinning_constrained.cc
+ * tests/topo/skeleton/priority_driven_thinning.cc
+ * tests/topo/skeleton/priority_driven_thinning_constrained.cc:
+ Adjust.
+
+ 2011-02-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ State a cell is not simple if it does not correspond to a facet.
+
+ * mln/topo/is_simple_cell.hh
+ (mln::topo::is_simple_cell<I, N, NL, NH>::operator()): Here.
+
+ 2010-09-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use mln::data::paste to simplify mesh skeleton applications.
+
+ * apps/mesh-segm-skel/mesh-complex-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc:
+ Here.
+
+ 2010-09-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Update mesh skeleton applications.
+
+ * apps/mesh-segm-skel/mesh-complex-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc:
+ Catch up with the new interface of breadth-first thinning and
+ auxiliary routines.
+
+ 2010-09-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ More generic breadth-first-thinning-based skeleton transformations.
+
+ * mln/topo/is_simple_cell.hh: Make this functor more generic.
+ * mln/topo/detach_cell.hh (detach): Turn this function into a
+ more generic functor.
+ * mln/make/attachment.hh (mln::make::attachment)
+ * mln/make/detachment.hh (mln::make::detachment):
+ Make these routines more generic.
+ * mln/topo/skeleton/breadth_first_thinning.hh
+ (mln::topo::skeleton::breadth_first_thinning):
+ Adjust.
+ * headers.mk: Regen.
+
+ 2010-09-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Introduce a helper to build an mln::mutable_extension_ima.
+
+ * mln/core/routine/mutable_extend.hh: New.
+ * headers.mk: Regen.
+
+ 2010-09-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Introduce an extension-by-mutable-image morpher.
+
+ * mln/core/image/dmorph/mutable_extension_ima.hh: New.
+ * headers.mk: Regen.
+
+ 2010-09-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Get the `detach' argument of thinning algorithms by reference.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh
+ (topo::skeleton::breadth_first_thinning)
+ * mln/topo/skeleton/priority_driven_thinning.hh
+ (topo::skeleton::priority_driven_thinning):
+ Here.
+
+ 2010-09-19 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Get rid of intermediate psites in thinning algorithms.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh,
+ * mln/topo/skeleton/priority_driven_thinning.hh:
+ Here.
+
+ 2010-09-19 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Have topo::is_n_face take a psite type as class parameter.
+
+ * mln/topo/is_n_face.hh: Here, so that the argument of this
+ functor (e.g., an iterator) is always converted to the psite
+ type.
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-skel.cc:
+ Adjust.
+
+ 2010-09-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Aesthetic changes in thinning algorithms.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh: Remove a comment.
+ * mln/topo/skeleton/priority_driven_thinning.hh: Likewise.
+ Rename p_queue to queue to avoid confusions with mln::p_queue and
+ improve uniformity w.r.t. topo::breadth_first_thinning.
+
+ 2010-09-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix the processing order in topo::breadth_first_thinning.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh: Use a p_queue_fast
+ site set instead of a pair of p_set's to ensure an actual
+ breadth-first processing of sites.
+
+ 2010-09-16 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Split interface and implementation of topo::is_not_end_point.
+
+ * mln/topo/is_not_end_point.hh: Here.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Catch up with the renaming to detach_cell.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-skel.cc:
+ s/detach/detach_cell/.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Rename topo::detach as topo::detach_cell.
+
+ * mln/topo/detach.hh (detach): Rename as...
+ * mln/topo/detach_cell.hh (detach_cell): ...this, to prevent
+ confusions with detach_point.
+ * headers.mk: Regen.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Exercise breadth-first and priority-driven thinnings.
+
+ * tests/topo/skeleton/breadth_first_thinning.cc,
+ * tests/topo/skeleton/breadth_first_thinning_constrained.cc,
+ * tests/topo/skeleton/priority_driven_thinning.cc,
+ * tests/topo/skeleton/priority_driven_thinning_constrained.cc:
+ New.
+ * tests/topo/skeleton/Makefile.am (check_PROGRAMS): Add
+ breadth_first_thinning, breadth_first_thinning_constrained,
+ priority_driven_thinning and priority_driven_thinning_constrained.
+ (breadth_first_thinning_SOURCES)
+ (breadth_first_thinning_constrained_SOURCES)
+ (priority_driven_thinning_SOURCES)
+ (priority_driven_thinning_constrained_SOURCES):
+ New.
+ (MOSTLYCLEANFILES): Add breadth_first_thinning-small.pbm,
+ breadth_first_thinning_constrained-small.pbm,
+ priority_driven_thinning-small.pbm and
+ priority_driven_thinning_constrained-small.pbm.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New skeletonization algorithm: priority-driven thinning.
+
+ * mln/topo/skeleton/priority_driven_thinning.hh: New.
+ * headers.mk: Regen.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add helpers to compute skeletons by thinning on regular 2D images.
+
+ * mln/topo/is_simple_point2d.hh,
+ * mln/topo/detach_point.hh,
+ * mln/topo/is_not_end_point.hh:
+ New.
+ * headers.mk: Regen.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add tracing mechanism to breadth-first thinning.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh: Here.
+ Typos and aesthetic changes.
+
+ 2010-09-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Small fix in breadth-first thinning.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh: Do not try to
+ detach an aldready processed site.
+
+ 2010-09-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Make the 5th argument of breadth_first_thinning truly optional.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh
+ (mln::topo::skeleton::breadth_first_thinning):
+ Disable the default value of the 5th argument, which cannot be
+ used in practice, since it depends on the parameter H.
+ Add a 4-argument overloading to make the `constraint' argument
+ optional.
+
+ 2010-09-01 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add more documentation on the detach procedure.
+
+ * mln/make/detachment.hh: Here.
+ Typo.
+ * mln/topo/detach.hh: Typo.
+
+ 2010-07-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Regen Milena's Makefile helpers.
+
+ * headers.mk, tests/unit_test/unit-tests.mk: Here.
+
+ 2010-07-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a VTK output for images of unsigned integers.
+
+ * mln/io/vtk/save.hh
+ (io::vtk::save(const unsigned_2complex_image3df&, const std::string&)):
+ New function.
+ (io::vtk::internal::unsigned_vtk_saver): New structure.
+ * tests/io/vtk/save.cc: Add a tests case for images of unsigneds.
+ * tests/io/vtk/Makefile.am (MOSTLYCLEANFILES):
+ Add save-tetrahedron-unsigned.vtk.
+
+ 2010-07-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/io/vtk/save.hh: Fix documentation.
+
+ 2010-07-27 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/io/vtk/all.hh: New.
+
+ 2010-06-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add a specific (temporary) VTK output routine for binary mesh images.
+
+ * apps/mesh-segm-skel/save_bin_alt.hh
+ (mln::io::vtk::save_bin_alt): New function.
+
+ 2010-06-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Exercise mln::io::vtk::save.
+
+ * tests/io/vtk/save.cc: New.
+ * tests/io/vtk/Makefile.am: New.
+ * tests/io/Makefile.am (SUBDIRS): Add vtk.
+
+ 2010-06-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Start a VTK output for complex-based images.
+
+ * mln/io/vtk/save.hh: New.
+
+ 2010-08-18 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/topo/skeleton/breadth_first_thinning.hh: Reindent.
+
+ 2010-08-18 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix two errors in mln::topo::skeleton::breadth_first_thinning.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh: Remove a stray
+ semicolon at the end of a `for' statement.
+ Create psite using the right iterator.
+
+ 2010-07-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Disable the last test case in test-mesh-complex-pinv-curv-skel.
+
+ * apps/mesh-segm-skel/test-mesh-complex-pinv-curv-skel.in: Here.
+
+ 2010-07-15 Roland Levillain <roland(a)lrde.epita.fr>
+
+ mesh-complex-pinv-curv-segm and mesh-complex-pinv-curv-skel apps.
+
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc:
+ New.
+ * apps/mesh-segm-skel/mesh-complex-max-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc:
+ Remove dead code.
+ * apps/mesh-segm-skel/test-mesh-complex-pinv-curv-segm.in,
+ * apps/mesh-segm-skel/test-mesh-complex-pinv-curv-skel.in:
+ New.
+ * apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS): Add
+ mesh-complex-pinv-curv-segm and mesh-complex-pinv-curv-skel.
+ (mesh_complex_pinv_curv_segm_SOURCES)
+ (mesh_complex_pinv_curv_skel_SOURCES):
+ New.
+ (TESTS): Add test-mesh-complex-pinv-curv-segm and
+ test-mesh-complex-pinv-curv-skel.
+ (MOSTLYCLEANFILES): Add socket-complex-pinv-curv-segm.off,
+ teapot-complex-pinv-curv-segm.off,
+ socket-complex-pinv-curv-skel.off and
+ teapot-complex-pinv-curv-skel.off.
+
+ 2010-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Actually use the maximal curvature in mesh-complex-max-curv-segm.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-segm.cc: Here.
+
+ 2010-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve the precision of some mesh-segm-skel apps.
+
+ * apps/mesh-segm-skel/mesh-complex-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-skel.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc:
+ Convert the floating point value input to an unsigned integer
+ image to avoid precision errors due to float comparisons.
+
+ 2010-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New application: mesh-complex-max-curv-skel.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc: New.
+ * apps/mesh-segm-skel/test-mesh-complex-max-curv-skel.in: New.
+ * apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS):
+ Add mesh-complex-max-curv-skel.
+ (mesh_complex_max_curv_skel_SOURCES): New.
+ (TESTS): Add test-mesh-complex-max-curv-skel.
+ (MOSTLYCLEANFILES): Add socket-complex-max-curv-skel.off and
+ teapot-complex-max-curv-skel.off.
+
+ 2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Clean up and new FIXMES in in apps/mesh-segm-skel.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv.cc: Remove dead code.
+ * apps/mesh-segm-skel/mesh-complex-skel.cc: Typo.
+ * apps/mesh-segm-skel/Makefile.am: Add titles and FIXMES.
+
+ 2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ New application: mesh-complex-max-curv-extrema.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-extrema.cc: New.
+ * apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in: New.
+ * apps/mesh-segm-skel/Makefile.am (bin_PROGRAMS): Add
+ mesh-complex-max-curv-extrema.
+ (mesh_complex_max_curv_extrema_SOURCES): New.
+ (TESTS): Add test-mesh-complex-max-curv-segm-extrema.
+ (MOSTLYCLEANFILES): Add socket-complex-max-curv-segm-extrema.off
+ and teapot-complex-max-curv-segm-extrema.off.
+
+ 2010-05-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix a bug in the reimplementation of Trimesh algorithms.
+
+ * apps/mesh-segm-skel/misc.hh (mln::geom::mesh_curvature):
+ Always call algebra::ldlt_decomp, even when NDEBUG is defined.
+ Typo.
+ Avoid a warning about an undefined variable when NDEBUG is not
+ defined.
+
+ 2010-05-04 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve topo::skeleton::breadth_first_thinning.
+
+ * mln/topo/skeleton/breadth_first_thinning.hh
+ (mln::topo::skeleton::breadth_first_thinning):
+ Fix a bias in the algorithm due to a buggy predicate.
+ Introduce a temporary psite to help the compiler.
+ Fix the type of `output'.
+
+ 2013-08-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Catch up with the new interface of the topological watershed.
+
+ * apps/constrained-connectivity/constrained-connectivity.cc: Here.
+
+ 2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Have the topological WST be more generic.
+
+ * mln/morpho/watershed/topological.hh: s/site/psite/g.
+ (morpho::watershed::min, morpho::watershed::max):
+ Abort when the set of components is empty.
+ * mln/core/site_set/p_set.hh (p_set<P>::is_empty): New method.
+
+ 2013-08-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix Pi usage in Milena's apps.
+
+ * apps/mesh-segm-skel/mesh-complex-max-curv-segm.cc,
+ * apps/mesh-segm-skel/mesh-complex-max-curv.cc:
+ Here.
+
+ 2013-08-27 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use mln::math::pi instead of a local definition in Milena.
+
+ * mln/algebra/quat.hh (mln::algebra::quat::set_unit): Here.
+
+ 2013-08-27 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Set mln::math::pi to 20 decimals.
+
+ * mln/math/pi.hh (mln::math::pi): Here.
+ Use the value of the M_PI macro from glibc's math.h header.
+
+ 2013-08-27 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Display Milena fatal errors on std::cerr, not std::cout.
+
+ * mln/io/pdf/load.hh,
+ * mln/io/tiff/load.hh:
+ Here.
+
+ 2013-08-27 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove Milena debug code making side effects on streams.
+
+ * mln/accu/stat/median_alt.hh,
+ * mln/canvas/browsing/dir_struct_elt_incr_update.hh,
+ * mln/core/image/image2d.hh,
+ * mln/core/internal/classical_window_base.hh,
+ * mln/core/internal/image_morpher.hh,
+ * mln/io/raw/load.hh,
+ * mln/morpho/tree/data.hh,
+ * mln/morpho/tree/impl/dual_hqueue.hh,
+ * mln/morpho/tree/impl/dual_union_find.hh,
+ * mln/morpho/watershed/topological.hh,
+ * mln/util/edge.hh,
+ * mln/util/timer.hh:
+ Here.
+
+ 2010-03-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove old tools from doc/.
+
+ * doc/Makefile.am (EXTRA_DIST): Remove generate_dist_files.sh and
+ tools/clearbanner.sh.
+ * doc/generate_dist_files.sh,
+ * doc/tools/clearbanner.sh:
+ Remove.
+
+ 2013-08-23 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve the generation of Doxyfiles in Milena.
+
+ * doc/Makefile.am (edit)
+ ($(srcdir)/user-refman.stamp)
+ ($(srcdir)/devel-refman.stamp):
+ Use `[@]' instead of `\@' for portability reasons.
+ (ID): New (empty).
+ (edit_devel): Prevent configure from expanding @builddir@.
+ Christen the product as ``Developer documentation''.
+ ($(DOXYFILE_USER), $(DOXYFILE_DEVEL)): Do not depend on $Id$ from
+ ChangeLog.
+ * doc/Doxyfile.in (PROJECT_NUMBER): Reintegrate @ID@ to the
+ project number, even if it is not yet set.
+
+ 2013-08-26 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Run FFT unit tests only when FFTW3 support is enabled.
+
+ * tests/unit_test/cond_tests_fftw3: New.
+ * tests/unit_test/Makefile.am (COND_TESTS): Add cond_tests_fftw3.
+ * tests/unit_test/unit-tests.mk: Regen.
+
+ 2012-10-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Split the interface of the FFT off from its implementation.
+
+ * mln/transform/fft.hh: Here.
+
+ 2012-10-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Stylistic changes in the Fast Fourier Transform.
+
+ * mln/transform/fft.hh: Here.
+
+ 2012-10-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove dead code in the Fast Fourier Transform.
+
+ * mln/transform/fft.hh: Here.
+
+ 2012-10-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Minor corrections in the Fast Fourier Transform.
+
+ * mln/transform/fft.hh
+ (internal::_fft<T>::transformed_image() const): Return a const
+ reference instead of a copy.
+ (internal::_fft<T>::transformed_image_clipped_magn(double, bool)):
+ Drop the const before the first argument.
+ Properly initialize `max'.
+ (internal::_fft<T>::transformed_image_log_magn(double, double, bool)):
+ Properly initialize `max'.
+
+ 2012-10-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve the test of the Fast Fourier Transform.
+
+ * tests/transform/fft.cc: Ensure the inverse transform of the
+ transform is pretty much the same as the input image.
+ Save the cropped transform.
+ Remove dead code.
+ * tests/transform/Makefile.am (MOSTLYCLEANFILES):
+ Add fft_trans_cropped.pgm.
+
+ 2012-10-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Update copyright headers.
+
+ * mln/transform/fft.hh,
+ * tests/transform/fft.cc:
+ Here.
+
+ 2012-10-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * headers.mk, tests/unit_test/unit-tests.mk: Regen.
+
+ 2012-10-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Exercise the Fast Fourier Transform.
+
+ * tests/transform/fft.cc: Fix the path to the input image.
+ * tests/transform/Makefile.am
+ (check_PROGRAMS) [HAVE_FFTW3]: Add fft.
+ (fft_SOURCES, fft_CPPFLAGS, fft_LDFLAGS) [HAVE_FFTW3]: New.
+ (MOSTLYCLEANFILES): New.
+
+ 2012-10-09 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix the Fast Fourier Transform.
+
+ * mln/transform/fft.hh
+ (mln::transform::fft<T, internal::fft_real>::fft):
+ Properly initialize the plan of the inverse transform using
+ fftw_plan_dft_c2r_2d.
+ (mln::transform::fft<T, internal::fft_real>::transform_inv):
+ Use the entire complex values (not just their real parts) to
+ compute the inverse transform.
+ (mln::transform::class fft<T, internal::fft_cplx>::fft):
+ Call the proper function (fftw_plan_dft_2d) to create the plan of
+ the inverse transform.
+ Switch the input and the output so that the inverse transform uses
+ the right images.
+
+ 2012-10-09 Alexandre Abraham <abraham(a)lrde.epita.fr>
+
+ Import the FFTW-based Fast Fourier Transform.
+
+ * mln/transform/fft.hh,
+ * tests/transform/fft.cc:
+ New.
+ Imported from the old directory sanbox/abraham/.
+
+ 2013-08-23 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix a couple of Milena tests.
+
+ * tests/accu/compute.cc: Correction the checked assertion.
+ * tests/value/scalar.cc: Remove this (non-relevant) test.
+
+ 2013-08-23 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/data/transform: Remove (empty) file.
+
+ 2013-08-23 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Distribute all Milena test images.
+
+ * tests/Makefile.am (EXTRA_DIST): Add img/example-0.ppm,
+ img/example-1.ppm, img/example-2.ppm and img/example-3.ppm.
+
+ 2013-08-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve Milena's mln/fun/v2v/rgb8_to_rgbn.hh.
+
+ * mln/fun/v2v/rgb8_to_rgbn.hh: Turn precondition into a static
+ assertion.
+ Remove (dead) debugging code.
+ Rewrite Doxygen comments.
+ Cosmetic changes.
+
+ 2013-08-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/core/image/dmorph/sub_image.hh: Fix indentation.
+
+ 2013-08-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Enable tests/fun/v2i.
+
+ * tests/fun/Makefile.am (SUBDIRS): Add v2i.
+
+ 2012-07-19 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Various aesthetic changes in Milena.
+
+ * mln/data/stretch.hh,
+ * mln/fun/x2x/rotation.hh,
+ * mln/tag/init.hh,
+ * mln/test/positive.hh,
+ * mln/test/predicate.hh:
+ Here.
+
+ 2012-07-19 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/core/point.hh: Fix documentation.
+
+ 2012-02-08 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/morpho/watershed/flooding.hh: Uniformity-related changes.
+
+ 2012-02-08 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/data/stretch.hh: Do not name unused arguments.
+
+ 2011-10-06 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * tests/util/line_graph.cc: Wrap long lines.
+
+ 2011-10-06 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use Doxygen grouping commands uniformly in Milena.
+
+ * mln/core/image/graph_elt_neighborhood_if.hh,
+ * mln/core/image/graph_elt_window_if.hh,
+ * mln/core/image/imorph/labeled_image.hh,
+ * mln/core/internal/labeled_image_base.hh,
+ * mln/core/site_set/p_edges.hh,
+ * mln/fun/i2v/array.hh,
+ * mln/util/adjacency_matrix.hh,
+ * mln/util/array.hh,
+ * mln/util/object_id.hh,
+ * mln/util/tracked_ptr.hh,
+ * mln/value/lut_vec.hh:
+ Here.
+
+ 2012-05-22 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * tests/data/transform.cc: Aesthetic changes.
+
+ 2011-07-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Improve the documentation of mln::util::set.
+
+ * mln/util/set.hh: Here.
+
+ 2011-07-12 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Various fixes related to image properties (traits).
+
+ * mln/core/image/vmorph/fun_image.hh,
+ * mln/trait/image/props.hh,
+ * mln/trait/images.hh:
+ Here.
+
+ 2010-11-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Clean up white space.
+
+ * mln/core/site_set/p_graph_piter.hh,
+ * mln/accu/transform_snake.hh:
+ Here.
+
+ 2010-10-19 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Typos and aesthetic changes in Milena apps.
+
+ * apps/graph-morpho/make.hh (make::complex1d_image)
+ * apps/graph-morpho/convert.hh (convert::to_complex_image)
+ Here.
+
+ 2010-09-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/canvas/all.hh: Sort #include directives.
+
+ 2010-08-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Aesthetic changes.
+
+ * mln/morpho/tree/data.hh,
+ * mln/registration/icp.hh,
+ * mln/util/fibonacci_heap.hh:
+ Wrap long lines, fix punctuation, etc.
+
+ 2010-07-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * mln/io/off/save.hh: Fix documentation.
+
+ 2010-07-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Enforce coding style w.r.t. function declarations.
+
+ * mln/io/magick/load.hh: Here.
+
+ 2010-04-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Add Doxygen documentation to a test.
+
+ * tests/topo/complex.cc: Here.
+
+ 2010-04-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix Doxygen comments.
+
+ * mln/value/int_u.hh,
+ * mln/value/rgb.hh:
+ Here.
+
+ 2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove a useless comment line.
+
+ * apps/Makefile.am: Here.
+
+ 2010-05-11 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Wrap long lines.
+
+ * mln/data/fill.hh: Here.
+
+ 2010-05-10 Roland Levillain <roland(a)lrde.epita.fr>
+
+ More conversions from C-style casts to C++-style casts.
+
+ * mln/core/contract.hh: Here.
+
+ 2010-02-08 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use Doxygen comments properly.
+
+ * mln/value/rgb.hh: Here.
+
+ 2010-02-08 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Typos in comments.
+
+ * mln/core/concept/function.hh: Here.
+
+ 2009-09-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Reformat a documentation header.
+
+ * mln/morpho/watershed/flooding.hh: Here.
+
+ 2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Re-wrap a long line.
+
+ * mln/labeling/flat_zones.hh: Here.
+
+ 2009-06-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove useless C casts.
+
+ * mln/fun/v2v/rgb_to_hsl.hh: Here.
+
+ 2013-07-29 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Clean up Milena's tests/draw/line.cc.
+
+ * tests/draw/line.cc: Remove a useless header inclusion.
+ Add a description.
+ Stylistic changes.
+
+ 2013-07-25 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Remove an inadvertently added file.
+
+ * mln/linear/#ch_convolve.hh#: Remove.
+
+ 2013-07-25 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix and improve mln::draw::dashed_line.
+
+ * mln/core/site_set/p_line2d.hh (mln::p_line2d::has(const psite&)):
+ Remove a too strict precondition.
+ * mln/draw/dashed_line.hh (mln::draw::dashed_line):
+ Rework implementation to make it more like mln::draw::line's.
+ Clean up a bit.
+ * tests/draw/dashed_line.cc: New test.
+ * tests/draw/Makefile.am (check_PROGRAMS): Add dashed_line.
+
+ 2013-07-04 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Work around a Clang 3.0 bug.
+
+ * tests/labeling/compute.cc,
+ * tests/labeling/pack.cc:
+ Here.
+
+ 2013-06-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Aesthetic changes in mln/world/binary_2d/subsample.hh.
+
+ * mln/world/binary_2d/subsample.hh: Here.
+
+ 2013-06-28 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix two bugs in mln/world/binary_2d/subsample.hh.
+
+ * mln/world/binary_2d/subsample.hh
+ (world::binary_2d::subsample(const image2d<bool>&, unsigned)):
+ Properly initialize (and deallocate) the sliding window (array of
+ pointers).
+ Fix the size of the output image.
+ Have the declaration of this function match its definition.
+ * tests/world/binary_2d/subsample.cc: New test.
+ * tests/world/binary_2d/Makefile.am
+ (check_PROGRAMS): Add subsample.
+ (MOSTLYCLEANFILES): Add subsample-small.pgm.
+
+ 2013-06-24 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Address compiler warnings about unused variables and arguments.
+
+ * mln/algebra/mat.hh (mln::algebra::impl::det)
+ * mln/linear/gaussian.hh (mln::linear::impl::generic_filter_)
+ * mln/registration/icp.hh
+ (mln::registration::remove_too_far_sites_debug)
+ (mln::registration::compute_distance_criteria)
+ * tests/io/magick/load.cc (main)
+ * tests/io/magick/save.cc (main):
+ Here.
+
+ 2013-06-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Avoid comparisons between signed and unsigned values.
+
+ * apps/morphers/iz.cc: Here.
+ Add a copyright notice and a Doxygen header.
+
+ 2013-06-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Aesthetic changes.
+
+ * mln/value/int_u.hh: Here.
+ * mln/value/internal/gray_f.hh: Typo in comment.
+
+ 2013-06-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Resolve ambiguous calls to operator* in value::qt::rgb32.
+
+ * mln/value/qt/rgb32.hh: Here.
+
+ 2013-06-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix mln::value::hsl_'s dependencies.
+
+ * mln/value/hsl.hh: Here.
+ [MLN_INCLUDE_ONLY]: Fix closing #endif statement.
+
+ 2013-06-20 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Fix mutual dependencies between value::int_u and value::qt::rgb32.
+
+ * mln/value/int_u.hh: Move definitions...
+ * mln/value/int_u.hxx: ...here (new file).
+ * mln/value/qt/rgb32.hh: Adjust.
+ * headers.mk (nobase_include_HEADERS): Regen.
+
+ 2013-06-19 Roland Levillain <roland(a)lrde.epita.fr>
+
+ * doc/Doxyfile.in: Help Emacs fontify this file.
+
+ 2013-06-18 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Make mln::util::timer copy-constructible and (copy-)assignable.
+
+ * mln/util/timer.hh: Rely on the default copy constructor and
+ the default (copy-)assignment operator.
+
+ 2013-06-14 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Shell-related portability fixes in Milena's Makefiles.
+
+ * doc/Makefile.am: Rewrite patterns ``perl X `find Y''' as
+ ``find Y -exec perl X {} \;'' to avoid long `perl' command lines and
+ please the shell.
+ Wrap some long lines.
+
+ 2013-06-17 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Use `perl -pi' instead of `sed -i' in Milena.
+
+ * doc/Makefile.am,
+ * doc/tools/clearbanner.sh,
+ * doc/tools/todoxygen.sh:
+ Here, as `sed -i' (with no backup file) behaves differently on
+ GNU/Linux and Mac OS X. For more information, see:
+ http://stackoverflow.com/questions/5694228/.
+
+ 2013-06-13 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Update the documentation of mln_trace.
+
+ * mln/debug/trace.hh: Here.
+ Aesthetic changes.
+
2013-04-17 Guillaume Lazzara <z(a)lrde.epita.fr>
* doc/mln/convert.dox: Fix from_to_ module name.
diff --cc milena/apps/morphers/iz.cc
index ae0d6d3,1603d38..5a39eac
--- a/milena/apps/morphers/iz.cc
+++ b/milena/apps/morphers/iz.cc
@@@ -119,8 -148,8 +148,8 @@@ int main(int argc, char* argv[]
io::ppm::save(labeling::colorize(value::rgb8(), ws), "tmp_ws.ppm");
{
- image2d<value::rgb8> ws_ = data::convert(value::rgb8(), input);
+ image2d<value::rgb8> ws_ = data::convert(input, value::rgb8());
- data::fill((ws_ | (pw::value(ws) == pw::cst(0))).rw(), literal::red);
+ data::fill((ws_ | (pw::value(ws) == pw::cst(0u))).rw(), literal::red);
io::ppm::save(ws_, "tmp_ws_superpose.ppm");
// test% g++ -I. main.cc -DNDEBUG -O2
diff --cc milena/mln/core/internal/labeled_image_base.hh
index 5d9b784,1da204a..b563781
--- a/milena/mln/core/internal/labeled_image_base.hh
+++ b/milena/mln/core/internal/labeled_image_base.hh
@@@ -177,8 -181,9 +181,9 @@@ namespace ml
void init_update_data_();
void prepare_update_data_(const mln_value(I)& lbl,
const mln_value(I)& new_lbl);
- void update_data_(const fun::i2v::array<mln_value(I)>& relabel_fun);
+
+ void update_data_(const fun::v2v::array<mln_value(I)>& relabel_fun);
- /// @}
+ /// \}
};
diff --cc milena/mln/debug/trace.hh
index 9352d7b,e3f3261..1025da8
--- a/milena/mln/debug/trace.hh
+++ b/milena/mln/debug/trace.hh
@@@ -28,22 -28,16 +28,24 @@@
/// \file
///
- /// Definition of the trace entering procedure.
+ /// Definition of the function entering/exiting tracing mechanism.
+
+ # include <ctime>
- # include <string>
# include <iostream>
+ # include <string>
# include <stack>
- # include <ctime>
+
# include <mln/core/contract.hh>
+/*!
+ \def mln_trace(S)
+ \brief Create a trace entry with S as name.
+
+ This macro must be called once at the beginning of a function.
+
+ \sa mln::debug::trace
+*/
# define mln_trace(S) \
mln::debug::trace mln_trace_(S); \
(void) mln_trace_;
@@@ -86,11 -73,9 +89,11 @@@ namespace ml
}
\endcode
- \warning mln_trace() declares a named local variable, so do not
- use mln_trace twice in the same scope in order to avoid
- duplicate declarations.
+ \warning mln_trace() declares a local variable (named
+ mln_trace_), so do not use mln_trace twice in the same scope to
+ avoid duplicate declarations.
+
+ \sa mln_trace mln_trace_warning
*/
class trace
{
diff --cc milena/mln/fun/v2v/array.hh
index 743afe4,0000000..b202f33
mode 100644,000000..100644
--- a/milena/mln/fun/v2v/array.hh
+++ b/milena/mln/fun/v2v/array.hh
@@@ -1,387 -1,0 +1,390 @@@
+// Copyright (C) 2008, 2009, 2012, 2013 EPITA Research and Development
+// Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_FUN_V2V_ARRAY_HH
+# define MLN_FUN_V2V_ARRAY_HH
+
+/// \file
+///
+/// Function mapping an Id i to a value v.
+
+# include <vector>
+# include <algorithm>
+# include <mln/core/concept/function.hh>
+# include <mln/util/array.hh>
+# include <mln/metal/equal.hh>
+# include <mln/tag/init.hh>
+# include <mln/convert/to.hh>
+
+# include <mln/fun/internal/selector.hh>
+
+namespace mln
+{
+
+ /// Forward declaration.
+ namespace fun {
+ namespace v2v {
+ template <typename T> class array;
+ } // end of namespace mln::fun::v2v
+ } // end of namespace mln::fun
+
+ namespace util {
+ template <typename T> class array;
+ }
+
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ /*! \brief Function mapping an id to a value.
+
+ \sa data::transform
+ \ingroup funv2v
+ */
+ template <typename T>
+ class array
+ : public fun::internal::selector_from_result_<T, array<T> >::ret
+ {
+ public:
+
- /// Returned value types
- /// @{
++ /// \name Returned value types
++ /// \{
++
+ typedef T result;
+ typedef typename std::vector<T>::reference mutable_result;
- /// @}
+
- /// Constructors
++ /// \}
++
++ /// \name Constructors
+ /// \{
+
+ /// Default.
+ array();
+ /// Constructs a function with \p nvalues.
+ array(unsigned n);
+ /// Constructs a function with \p nvalues and \p val as default value.
+ array(unsigned n, const T& val);
+
+ /// Used in from_to(). Constructs that function from an util::array.
+ /// Always prefer using from_to instead of this constructor.
+ array(const util::array<T>& from);
+ /// Used in from_to(). Constructs that function from an std::vector.
+ /// Always prefer using from_to instead of this constructor.
+ array(const std::vector<T>& from);
++
+ /// \}
+
+
+ /// Pre-allocate space.
+ void reserve(unsigned n);
+
+ /// Set the function size to \p n.
+ void resize(unsigned n);
+ /// Set the function size to \p n and initialize the value with
+ /// \p val.
+ void resize(unsigned n, const T& val);
+
+ /// Append a new value in the function.
+ void append(const T& val);
+
+ /// Return the number of values.
+ unsigned size() const;
+
+ /// Const access to the ith value.
+ result operator()(unsigned i) const;
+ /// Read-Write access to the ith value.
+ mutable_result operator()(unsigned i);
+
+ /// Initialize an empty function.
+ void init_(unsigned n);
+
+ /// Return the underlying std::vector.
+ const std::vector<T>& std_vector() const;
+
+ protected:
+ std::vector<T> v_;
+
+ };
+
+
+ /*!
+ \brief Operator<<.
+ \relates fun::v2v::array
+ */
+ template <typename T>
+ std::ostream& operator<<(std::ostream& ostr,
+ const array<T>& a);
+
+
+ /*!
+ \brief Conversion: fun::v2v::array -> util::array
+ \ingroup fromto
+ */
+ template <typename T1, typename T2>
+ void
+ from_to_(const fun::v2v::array<T1>& from, util::array<T2>& to);
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+} // end of namespace mln
+
+
+namespace std
+{
+
+ /*!
+ \brief Conversion: std::vectorfun::v2v::array<T> -> fun::v2v::array<T>
+ \ingroup fromto
+ */
+ template <typename T>
+ inline
+ void
+ from_to_(const vector<T>& from, mln::fun::v2v::array<T>& to);
+
+ /*!
+ \brief Conversion: std::vector<T> -> mln::fun::v2v::array<U>
+ \ingroup fromto
+ */
+ template <typename T, typename U>
+ inline
+ void
+ from_to_(const vector<T>& from, mln::fun::v2v::array<U>& to);
+
+} // end of namespace std
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+namespace mln
+{
+
+ // Init.
+
+ template <typename T1, typename T2>
+ void init_(tag::function_t,
+ fun::v2v::array<T1>& f,
+ const fun::v2v::array<T2>& model)
+ {
+ f.init_(model.size());
+ }
+
+
+ /// fun::v2v::array
+
+ namespace fun
+ {
+
+ namespace v2v
+ {
+
+ template <typename T>
+ inline
+ array<T>::array()
+ {
+ }
+
+ template <typename T>
+ inline
+ array<T>::array(unsigned n)
+ : v_(n)
+ {
+ }
+
+ template <typename T>
+ inline
+ array<T>::array(unsigned n, const T& val)
+ : v_(n, val)
+ {
+ }
+
+ template <typename T>
+ inline
+ array<T>::array(const util::array<T>& from)
+ : v_(from.std_vector())
+ {
+
+ }
+
+ template <typename T>
+ inline
+ array<T>::array(const std::vector<T>& from)
+ : v_(from)
+ {
+
+ }
+
+ template <typename T>
+ inline
+ void
+ array<T>::reserve(unsigned n)
+ {
+ v_.reserve(n);
+ }
+
+ template <typename T>
+ inline
+ void
+ array<T>::resize(unsigned n)
+ {
+ v_.resize(n);
+ }
+
+ template <typename T>
+ inline
+ void
+ array<T>::append(const T& val)
+ {
+ v_.push_back(val);
+ }
+
+ template <typename T>
+ inline
+ void
+ array<T>::resize(unsigned n, const T& val)
+ {
+ v_.resize(n, val);
+ }
+
+ template <typename T>
+ inline
+ unsigned
+ array<T>::size() const
+ {
+ return v_.size();
+ }
+
+ template <typename T>
+ inline
+ typename array<T>::result
+ array<T>::operator()(unsigned i) const
+ {
+ mln_precondition(i < v_.size());
+ return v_[i];
+ }
+
+ template <typename T>
+ inline
+ typename array<T>::mutable_result
+ array<T>::operator()(unsigned i)
+ {
+ mln_precondition(i < v_.size());
+ return v_[i];
+ }
+
+ template <typename T>
+ inline
+ void
+ array<T>::init_(unsigned n)
+ {
+ v_.resize(n);
+ }
+
+ template <typename T>
+ inline
+ const std::vector<T>&
+ array<T>::std_vector() const
+ {
+ return v_;
+ }
+
+
+ // Operator <<.
+
+ template <typename T>
+ std::ostream& operator<<(std::ostream& ostr,
+ const array<T>& a)
+ {
+ ostr << '(';
+ const unsigned n = a.size();
+ for (unsigned i = 0; i < n; ++i)
+ {
+ ostr << a(i);
+ if (i != n - 1)
+ ostr << ", ";
+ }
+ ostr << ')';
+ return ostr;
+ }
+
+
+ // Conversion
+
+ template <typename T1, typename T2>
+ void
+ from_to_(const array<T1>& from, util::array<T2>& to)
+ {
+ to.resize(from.size());
+
+ for (unsigned i = 0; i < from.size(); ++i)
+ to[i] = mln::convert::to<T2>(from(i));
+ }
+
+ } // end of namespace mln::fun::v2v
+
+ } // end of namespace mln::fun
+
+
+ template <typename T>
+ inline
+ fun::v2v::array<T> array(unsigned n, const T& t)
+ {
+ fun::v2v::array<T> tmp(n, t);
+ return tmp;
+ }
+
+} // end of namespace mln
+
+namespace std
+{
+
+ template <typename T>
+ inline
+ void
+ from_to_(const vector<T>& from, mln::fun::v2v::array<T>& to)
+ {
+ to = mln::fun::v2v::array<T>(from);
+ }
+
+ template <typename T, typename U>
+ inline
+ void
+ from_to_(const vector<T>& from, mln::fun::v2v::array<U>& to)
+ {
+ to.resize(from.nelements());
+ for (unsigned i = 0; i < from.size(); ++i)
+ to(i) = mln::convert::to<U>(from[i]);
+ }
+
+} // end of namespace std
+
+# endif // ! MLN_INCLUDE_ONLY
+
+#endif // ! MLN_FUN_V2V_ARRAY_HH
diff --cc milena/mln/fun/v2v/rgb8_to_rgbn.hh
index 236c95b,29d0d9c..d48112b
--- a/milena/mln/fun/v2v/rgb8_to_rgbn.hh
+++ b/milena/mln/fun/v2v/rgb8_to_rgbn.hh
@@@ -47,16 -46,11 +46,14 @@@ namespace ml
{
- /*! \brief Convert a rgb8 value to a rgn, n < 8.
-
- \tparam n defines the output quantification used for the
- transformation.
-
- How to use this function is detailed in section \ref convert.
-
- \sa data::convert data::transform
- \ingroup funv2v convert
- */
+ /// \brief Convert an mln::value::rgb8 to an mln::value::rgbn.
+ ///
+ /// \tparam n The quantification of the output value (where n < 8).
+ ///
- /// \ingroup modfunv2v
++ /// How to use this function is detailed in section \ref convert.
++ ///
++ /// \sa data::convert data::transform
++ /// \ingroup funv2v convert
template <unsigned n>
struct rgb8_to_rgbn : Function_v2v< rgb8_to_rgbn<n> >
{
diff --cc milena/mln/io/magick/load.hh
index 0962303,603f40a..0c285a0
--- a/milena/mln/io/magick/load.hh
+++ b/milena/mln/io/magick/load.hh
@@@ -72,9 -61,23 +72,10 @@@ namespace ml
\ingroup iomagick
*/
template <typename I>
- void load(Image<I>& ima, const std::string& filename);
+ void
+ load(Image<I>& ima, const std::string& filename);
- // FIXME: Unfinished?
-#if 0
- /** Load data from a file into a Milena tiled image using
- Magick++.
-
- \param[out] ima The image data are loaded into.
- \param[in] filename The name of the input file. */
- template <typename T>
- void
- load(Image<tiled2d<T> >& ima, const std::string& filename);
-#endif
-
-
# ifndef MLN_INCLUDE_ONLY
namespace impl
diff --cc milena/mln/value/int_u.hh
index cfe2252,18f1c81..6bdb411
--- a/milena/mln/value/int_u.hh
+++ b/milena/mln/value/int_u.hh
@@@ -211,19 -209,11 +220,18 @@@ namespace ml
template <unsigned n>
void from_to_(const int_u<n>& from, float& to_);
- /// \internal Conversion: int_u -> double.
+
+ /*!
+ \brief Conversion: int_u -> double.
+ \ingroup fromto
+ */
template <unsigned n>
- void
- from_to_(const int_u<n>& from, double& to_);
+ void from_to_(const int_u<n>& from, double& to_);
- /// \internal Conversion: Conversion: int_u -> rgb.
+ /*!
+ \brief Conversion: Conversion: int_u -> rgb.
+ \ingroup fromto
+ */
template <unsigned m>
void from_to_(const int_u<m>& from, qt::rgb32& to);
diff --cc milena/mln/world/binary_2d/subsample.hh
index 5e94016,3ea041a..7115e56
--- a/milena/mln/world/binary_2d/subsample.hh
+++ b/milena/mln/world/binary_2d/subsample.hh
@@@ -73,21 -73,14 +73,14 @@@ namespace ml
using value::int_u8;
if (n == 0)
- {
- image2d<value::int_u8>
- output = data::convert(input, int_u8());
- return data::convert(int_u8(), input);
++ return data::convert(input, int_u8());
- return output;
- }
-
- const bool** ptr;
+ const bool** ptr = new const bool*[n];
const unsigned nrows = input.nrows() / n;
const unsigned ncols = input.ncols() / n;
- image2d<int_u8> output;
- initialize(output, input);
+ image2d<int_u8> output(nrows, ncols);
const unsigned delta_row = input.delta_offset(down);
- unsigned count = 0;
for (unsigned row = 0; row < nrows; ++row)
{
diff --cc milena/tests/unit_test/unit-tests.mk
index a98b5cf,72ca7eb..6142ab5
--- a/milena/tests/unit_test/unit-tests.mk
+++ b/milena/tests/unit_test/unit-tests.mk
@@@ -188,6 -197,6 +197,8 @@@ mln_binarization_binarization
mln_binarization_essential \
mln_binarization_includes \
mln_binarization_threshold \
++mln_binarization_tmms \
++mln_binarization_tmms_hysteresis \
mln_border_adjust \
mln_border_all \
mln_border_duplicate \
@@@ -368,6 -378,6 +380,7 @@@ mln_core_image_graph_window_if_piter
mln_core_image_graph_window_piter \
mln_core_image_image1d \
mln_core_image_image2d \
++mln_core_image_image2d_ffmpeg \
mln_core_image_image3d \
mln_core_image_imorph_all \
mln_core_image_imorph_decorated_image \
@@@ -504,6 -515,6 +518,7 @@@ mln_data_fast_median
mln_data_fill \
mln_data_fill_with_image \
mln_data_fill_with_value \
++mln_data_fill_without_localization \
mln_data_median \
mln_data_memcpy_ \
mln_data_memset_ \
@@@ -518,6 -529,6 +533,7 @@@ mln_data_sort_offsets
mln_data_sort_psites \
mln_data_split \
mln_data_stretch \
++mln_data_stretch_inplace \
mln_data_to_enc \
mln_data_transform \
mln_data_transform_inplace \
@@@ -738,6 -753,6 +754,7 @@@ mln_io_fld_load_header
mln_io_fld_max_components \
mln_io_fld_save \
mln_io_fld_write_header \
++mln_io_magick_get_header \
mln_io_off_all \
mln_io_off_load \
mln_io_off_save \
@@@ -797,6 -815,6 +817,7 @@@ mln_labeling_relabel
mln_labeling_superpose \
mln_labeling_value \
mln_labeling_value_and_compute \
++mln_labeling_values \
mln_labeling_wrap \
mln_linear_all \
mln_linear_ch_convolve \
@@@ -1189,6 -1218,6 +1221,7 @@@ mln_transform_internal_distance_functo
mln_transform_internal_influence_zone_functor \
mln_upscaling_art_scale2x \
mln_upscaling_art_scale3x \
++mln_upscaling_upscaling_bicubic_2x \
mln_util_adjacency_matrix \
mln_util_all \
mln_util_array \
diff --cc scribo/scribo/filter/object_groups_with_holes.hh
index 64c16f2,d2347bb..1caf251
--- a/scribo/scribo/filter/object_groups_with_holes.hh
+++ b/scribo/scribo/filter/object_groups_with_holes.hh
@@@ -185,7 -185,7 +185,7 @@@ namespace scrib
// Will 'True' if a group has at least two background
// components.
- fun::v2v::array<bool>
- mln::fun::i2v::array<bool>
++ mln::fun::v2v::array<bool>
to_keep(value::next(components.nelements()), false);
const L& lbl = components.labeled_image();
diff --cc scribo/scribo/primitive/extract/separators_nonvisible.hh
index 9781cad,565bb7e..02e7602
--- a/scribo/scribo/primitive/extract/separators_nonvisible.hh
+++ b/scribo/scribo/primitive/extract/separators_nonvisible.hh
@@@ -160,13 -147,10 +147,10 @@@ namespace scrib
component_set<L>
components = scribo::primitive::extract::components(input_clo, c8(),
ncomponents);
- // t_ = t;
- // std::cout << "extract::components - " << t_ << std::endl;
-
// Debug
logger().log_image(AuxiliaryResults,
- data::convert(value::int_u8(),
- components.labeled_image()),
+ data::convert(components.labeled_image(),
+ value::int_u8()),
"lbl");
unsigned dmax = 5;
@@@ -453,15 -400,9 +400,9 @@@
}
- // t_ = t;
- // std::cout << "* reading data - " << t_ << std::endl;
-
- // t.restart();
labeling::relabel_inplace(sep_lbl, nlabels, relbl);
- // t_ = t;
- // std::cout << "* relabel_inplace - " << t_ << std::endl;
- mln_concrete(I) output = data::convert(bool(), sep_lbl);
+ mln_concrete(I) output = data::convert(sep_lbl, bool());
if (_debug_)
{
diff --cc scribo/scribo/primitive/regroup/from_single_left_link.hh
index 42d7486,0712182..c39b8b5
--- a/scribo/scribo/primitive/regroup/from_single_left_link.hh
+++ b/scribo/scribo/primitive/regroup/from_single_left_link.hh
@@@ -106,7 -106,7 +106,7 @@@ namespace scrib
object_groups<L> output = groups.duplicate();
- fun::v2v::array<mln_value(L)> relabel_fun;
- mln::fun::i2v::array<mln_value(L)> relabel_fun;
++ mln::fun::v2v::array<mln_value(L)> relabel_fun;
component_set<L>
components = primitive::group::apply(groups, relabel_fun);
diff --cc scribo/tests/primitive/extract/alignments.cc
index f767a8e,5c6a10a..6e8cb0f
--- a/scribo/tests/primitive/extract/alignments.cc
+++ b/scribo/tests/primitive/extract/alignments.cc
@@@ -52,16 -52,15 +53,15 @@@ int main(
document<L> doc(os.str().c_str());
doc.open();
- doc.set_binary_image(data::convert(bool(), doc.image()));
+ doc.set_binary_image(data::convert(doc.image(), bool()));
- // Extract lines
- line_set<L>
- lines = scribo::text::extract_lines_wo_merge(doc, c8());
+ // Extract lines.
+ line_set<L> lines = scribo::text::extract_lines_wo_merge(doc, c8());
doc.set_paragraphs(scribo::make::paragraph(lines));
- // Find alignments
- mln::util::couple<component_set<L>, mln_ch_value_(L,bool)>
- res = primitive::extract::alignments(doc, 3, 3);
+ // Find alignments.
+ mln::util::couple<component_set<L>, mln_ch_value_(L,bool)> res =
+ primitive::extract::alignments(doc, 3.f, 3);
std::ostringstream os_out;
image2d<bool> ref;
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0
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 exp/TL has been updated
via 4b106a5db5bd01a204ed7cdaa39281d293575abf (commit)
from 5058422e45eabd6bc3dae891921d3b3ee81f8c51 (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 -----------------------------------------------------------------
4b106a5 milena/mln/core/concept/iterator.hh: Add for_all_5 macro.
-----------------------------------------------------------------------
Summary of changes:
milena/mln/core/concept/iterator.hh | 5 +++++
1 file changed, 5 insertions(+)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

olena: olena-2.0-897-g4b106a5 milena/mln/core/concept/iterator.hh: Add for_all_5 macro.
by myriam robert-seidowsky 18 Apr '14
by myriam robert-seidowsky 18 Apr '14
18 Apr '14
---
milena/mln/core/concept/iterator.hh | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/milena/mln/core/concept/iterator.hh b/milena/mln/core/concept/iterator.hh
index 2a82402..8e4d2f0 100644
--- a/milena/mln/core/concept/iterator.hh
+++ b/milena/mln/core/concept/iterator.hh
@@ -78,6 +78,11 @@
x1.is_valid(); \
x1.next(), x2.next(), x3.next())
+# define for_all_5(x1, x2, x3, x4, x5) \
+ for(x1.start(), x2.start(), x3.start(), x4.start(), x5.start(); \
+ x1.is_valid(); \
+ x1.next(), x2.next(), x3.next(), x4.next(), x5.next())
+
/*
\def for_all_remaining(x)
--
1.7.10.4
1
0
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 exp/TL has been updated
via 5058422e45eabd6bc3dae891921d3b3ee81f8c51 (commit)
via 0a79e3b79850ebae206aaf28932c1b1b38200d7a (commit)
via bb6ddb7e8f323fa072b903b81b87d81f410734b3 (commit)
via abdd5eb7842021c807fe66dd46e4d6aca9911d5b (commit)
via 010f8aa5fa3a09d58bb4a872f199384e18b51974 (commit)
via 6b18b5041243d56e03da45a779f1a50446785276 (commit)
via 71717ea0aa2e527ef9cf6b6667b026d101e54fc7 (commit)
via e6fe7d359db0a18c8f37dd29f06bfa1d9fead977 (commit)
via 450410e982d7c9abbd5d0b4c3d834284a504d138 (commit)
via 4998bf92ef1bd4a382768a9b9abcb925fc1bfe7b (commit)
via 0774f862907bf1f3b751cbd8e8124daa6ab58cea (commit)
via 346ed701130cb8bf46386ce95ac35b15d65fa3d7 (commit)
via a40ac76c172a4cedfaa305baa9776408a060d481 (commit)
via f8090ed81ed6a495faff8ce918139ce05d8c38a4 (commit)
via 32fe23ae1923b358cac3a9e1ab1b82ce7bc49f8c (commit)
via 917fa3dc9d19267535b783c4e5fd834542ce175a (commit)
via 7c470abe909031667f8fb466958aa3f189ef3086 (commit)
via 2cbfa7dcb92861252795028c0c8fc366757dbf72 (commit)
via e20e410934110ac86fe6d2590657a25a29c0034c (commit)
via c01c17406ae476e0e89407dc6db013110a4121da (commit)
via 314a240db85747e9822ed9494a497d312a0bdbde (commit)
via bdade6e5643b8c974e1b6c7e99db070600c6259a (commit)
via 1cbfcbe8bcaa34925f7a0d24ffaab0ddaedf293d (commit)
via d05185f51003f72f0d3d530b97adca245fadc998 (commit)
via 8caa6a0fbb8fbcf1acfc55712abf1b0ddfa9a7e3 (commit)
via 5028921e3633fa750f78434344b4a7c76d443582 (commit)
via 5d8a12598439482ccd53c596bb7e0690bf960ab8 (commit)
via e9bf0a68327ee187aad6616038d5661e8bf440a6 (commit)
via b77aca0a9a5c5c514ce258c853ee55ad6678d0a9 (commit)
via fe72eddb49c039d57bd3c778937e97c867c2530e (commit)
via 91582ecbeb5ce3a6885aada08a09f445dea9651d (commit)
via fea1bdb0b38b2f265838f332137c9e4f22711801 (commit)
via d06e84f05872eb7ba686f43384a68fb014c4af8c (commit)
via 66dc444e5b61893ef6ed78dcad9c2178228b4c7d (commit)
via 4b84c24f6bf2641a82d6eff062f55eab0cd06443 (commit)
via 5d26c00af6003c608a1c04be40851ca34ac38a63 (commit)
via d3965a63e8470b121892146ced02946aa1a3c068 (commit)
via dadfbf8950ef83c64755eaa15a9b469cb2d70ae3 (commit)
via b8c5c642918812a1b8b9b2c09d65fb4bef2d41cb (commit)
via a97476569ceb8f6ed597a87fb27bafd412970efa (commit)
via 7044058ab5a375b2e582ebad82621228e8030d48 (commit)
via c7b2885c2aaefecda885eabd0a3e8491aa373925 (commit)
via 8c2373f81c5660b119c96fecbddae0abbbc5d29d (commit)
via b815f9e2faf5ce7fe0deda0f4a7b9d07713f9b90 (commit)
via c54ade0529937a4d66187dea311a67dd49527597 (commit)
via e3d31288ebed111747116932b6056550f7229b72 (commit)
via 989f64c914db17c4381adbff449f799b46e981f7 (commit)
via caafe2757aa4412f8e61bc6528feb88d35129141 (commit)
via fd81df408806ec032d613c91f6aced2eab5e239d (commit)
via 2a45daf1baa56780ee68c4d42c4e575e8ad693c2 (commit)
via adbe79b77bfb5daef430d2a003891458ab27f5f4 (commit)
via 92370252d966b05de95b4f4e1ba8cdefbd589513 (commit)
via d31555ad4cc07979b43873987b3cf7ec10d4c1e0 (commit)
via a746768a222aa1b3ec885099818b6d6efc824dea (commit)
via 1692704a4e5905ac03d7c96f21d2ba10c7bd704c (commit)
via 8c6f47af691c0616259a54ca1710c98c6826731c (commit)
via 176f3fd8be2f5eb18d832c4cf19d8f3efa8abaa7 (commit)
via 5f10622a1e4e2ebd6c611be95802cad42ab6f7aa (commit)
via 8a48d8079b603e627237f7ca8524528e9ccdd714 (commit)
via 8f6e58708365263bf6198bc567994fea7879a6e7 (commit)
via dcb65af6925d22936a721ddd17ce91c834f1dcbb (commit)
via 26d28a507403bced81ccbbfb8cfc1d008f33f648 (commit)
via b40c467c3953682c550a820510252473cb9bbade (commit)
via 0feab07fa0cc4de58a9aa36aa63031416dea49f5 (commit)
via e3b70ab14ce95e19449395a38f037c902e3cf9d7 (commit)
via 0d75e39af1931bb05c1621a0b51861a73f8c97eb (commit)
via cd1d4e984a9b56e21f6b1f67a34487254ba0b40c (commit)
via 064910dbb2f8d70b87c1d78836386b32928dff68 (commit)
via d56e10be0cef21a014909aedc73f4409ee3c3402 (commit)
via ac04251919bfb607b5da55d91b505c387c945e6c (commit)
via c8994ac388a94521fb1cd0eb95baf73c6a79bdbf (commit)
via ae5b2f2067ba6a8a389acd3bd6c063315905af44 (commit)
via aa7f3d1c34dd90c3c1c968fbad9517156a11940a (commit)
via 887a3fe17b396633af4611076e69bb5c76c3413f (commit)
via 2ab706df5d8edb964d6fcae88148f6f105027aed (commit)
via 050eff13f8b5c8bbd8406b6dab922d1b8574c561 (commit)
via b97c12aee11a2e516237b02412914e5f4bfc2e17 (commit)
via 6cb33ef7ca56427fa323fe11ff40bda0be9b163f (commit)
via 2bc617f494e7c5bb8e2a93b6778fca1a085456d0 (commit)
via 5f4400b17bbaf4ee0dbfc0ed4e80bf2a376b76d0 (commit)
via e52aac02b156fd06b7de45959c8bf55024d98959 (commit)
via 8f71dbf3fb8f07798274336ef38ed4ec452e8cfc (commit)
via ed99a96992fcb4ebc2f2a416bae04c97b074a8b7 (commit)
via e3799361c833404830f88ac40091998bab1340d3 (commit)
via de6c91cef4c10e3dbb66f63092d3c1a983d39cc2 (commit)
via 8ea78356187b68e314e2e6bf915c2c1e652edcd5 (commit)
via d06dc7960770317f00270ea1db8066fbbab14358 (commit)
via e56dcf932acc99554acf6a57325c9b5f4de331dd (commit)
via d95b8eb4bca61df6982e7b738ee3b5f689334c2e (commit)
via c607b2b473ea041164765d74761665f7cd16679f (commit)
via 8da07c1ba16fd7e2f3efc0da7c24cf6892cabea4 (commit)
via f6c0e86048ab35abf56eec1d8dc16332fc3bdf03 (commit)
via b4795e30ef8c1cdfe67c8d7ec3591aec9da5eb16 (commit)
via 0abd35d7c909bef44614fea9483b0a7c8e65a76a (commit)
via 178d9766cf611cba88150f776cd0487af9af8d06 (commit)
via 9b0c072e6285ab9b3a7ad98db3c7bd311d7339dc (commit)
via 468f30937f07f5516e36220248bb50f549f3013a (commit)
via 26697559f82f078325ddaa979176ffec509726ae (commit)
via 095d4d83c7ae469708f1da8e0df191b96c5195e4 (commit)
via 306940e5bcac4ab11a2ecf04b35e171b23212367 (commit)
via aec0b06e61c989df7ba3a3c89fece4c10d4c035a (commit)
via e0308f46eeb95a3d133b81ae21ecfc3e85561e73 (commit)
via df7ee00617e417f3e3782f296317180aab397c68 (commit)
via 359105b5373ba839805b1198597e3049fae509f5 (commit)
via 3f55de7920b3b6ca92e4d6b7f80c7a69f48060f5 (commit)
via 94167940366c76ce3d8fa8fc71bcef6366336f5c (commit)
via 9a84a00e71be26f15a4cb026563b83b058f191fc (commit)
via faeffbfac0157771d8afbb181ddf1aa6ce62bd64 (commit)
via 848be92889506f3522e0063d19b942e9e26e1429 (commit)
via 65e27d4f181270bdf32ccd70623b02f8c6515d7b (commit)
via 75d014789ef295f49c144e41b3388d1965f3b003 (commit)
via 5f6cc931ac246ce107794adb0812dfcadab90c65 (commit)
via 5da629f7d9ab5cea4acf78daae3f4ec46f710111 (commit)
via 641fb1845b4afaf3d7be707b9eab9757ebd9848e (commit)
via 10886bb0bd1026a72b13212602008d34a1e6a26c (commit)
via 5c51ffe52ba4551362ab8a77be720b5afc856cc6 (commit)
via 1af4682ac3441c1e45c1e0c192b0991e2ba8e563 (commit)
via 202bac27de2b47341f76e44bef7cb1ddf671a79a (commit)
via e9c085e05f15fdd3e30287c26db7cf3d659baff7 (commit)
via 959b10e6917b071d17bfa765e715cefa47a94c0e (commit)
via 958cb5799166a785a8db956a20f44547c0c8e022 (commit)
via 4b83d9c6b4e22789c1069e5f147ac9f674995a8c (commit)
via 29bf3b02e00c4d7e65586f935fda3849f2067d27 (commit)
via 7c649ab73e632b9399b2824a75529f95b530f168 (commit)
via 9faa94823c7a7bae018f944ab17e79f5d0774ac3 (commit)
via 279c33718e3dcaba50a6efc29c45ff63a0713cda (commit)
via 81f0006071a6fda8295c75c48dd7df0c3f5d8c19 (commit)
via afa46ab741c9b611d0817ab18e04c8c658c83ddf (commit)
via 955984a153a407f807549bc2b147e9a149861c05 (commit)
via a412a54529f79027659b8c3fd723556b77cfd2ed (commit)
via 4ebb5d640799b7ce299d4a573a42d0eb48b1c9df (commit)
via 7e43020f1b94958d6287965abf4cb4cab901895b (commit)
via 0a1c7ac3b44b539d21e4b3f50738291b2f79e093 (commit)
via 26d31484856f050052cfed5122507ad24926e81a (commit)
via c1215ffb093c6e4b0bfbb8d6d0c522e4591c9979 (commit)
via 6e6baf62c3b15ccd846760b5cd5c0ca8401d7afe (commit)
via 42bdd44352ec055008afc581b4a61ed892f1ef5f (commit)
via b3754d8eda282e0a83afaf8bf5dbe42ffb0193c9 (commit)
via 88e9e68e5ee86ef83b4d6ed2fcc926ae4497ecc2 (commit)
via 6b9bc50e45224d17f9ac617fc36b9baa8807ffb2 (commit)
via a2d5c260202c5cd2d2f536aab7f03370d5c39aaa (commit)
via 8c828c81c57a819e5eaf88ffc47fc354948e9d05 (commit)
via 3124478b0522c2fda5b4b2d6b903f3c66e8532ea (commit)
via 3e32b86e95ee68eaa69bd188a3cfb9a084dd3c64 (commit)
via b1efc3e8713ad04f14e4e65645342927b33fbfe1 (commit)
via f15b2c0e82fb846615c755590564955e56b163fc (commit)
via 8f094c6dbc3e7a53004f25a6b4268c5fa88e0f47 (commit)
via 02c4ea9fa1d28f8f6fd8161f5464e713e6c1c540 (commit)
via 0a078938b8f3fdc10d234fe663ff74a4b6a44284 (commit)
via 8b31df65d090f1ac9965f0feb4d3bb68a17948f1 (commit)
via 588a6d4df5b2260df18ea39cd73dfdb2218120f6 (commit)
via 089d5ff91de9d30939ecb783a161ff542b0240ca (commit)
via 6919bfe815821aadac688e68ad2cc9c044786592 (commit)
via 870ac7ad52b84c32ffd4ec4b1dd0ba8d3e03760f (commit)
via 1e9b9bdc30b97729412d43c28c213461e52ed5eb (commit)
via 3f5d9e560d0d128aafa28be5fea3f1e8f8dad9d6 (commit)
via 02720ffe0da87af83572f465b4a5360e1a84ade8 (commit)
via bee3fa8b6c21739dafb6e3aabe059940a00f8ed3 (commit)
via 31f1d7085fcd358ae06d7bef523df048b38c7132 (commit)
via 5f1d602d3115879c4fdddf26e5c4ac68f043b671 (commit)
via 95ac14a3201bedb36199d8771972f8a48dddd5be (commit)
via ce1802a50dd9a614798477d6b4f015f899c34ebb (commit)
via a38f790273e1804c8d2fe766812e20f2ae705411 (commit)
via 545073676d2330a155341cb135ef1f2862be1a6c (commit)
via 3da3ce793613f82361927877232eb18a829d26e5 (commit)
via 49883e6190d8c80cee1c2bdff9dda3a597e88b22 (commit)
via 733069faaf7cf86244aa968532e8aa6556a41b69 (commit)
via 30dbf823348cbde134c54e1cd978fa778084be79 (commit)
via cde905dfde6c1d8d96017d4bd5efa5fc7b35cf9c (commit)
via b3cec6181a8b38f07d8bb47b991a4a5d5e4d051a (commit)
via 1df691cde9b5613124bbb250b2296f8f535ae21c (commit)
via 7da64b4b783b432d3e307274a66ba4f21be464e5 (commit)
via 1a9410e2b25e21bb4e0231de36b755368d9bd71c (commit)
via 8ac04a5a9d19c3a53448a102dbbb057860fd1ae8 (commit)
via 253f29ebc867914d23b08255ea09ad47656473fb (commit)
via 6b9da0eaaa1911f74920bd5a1445a9edb5c03a94 (commit)
via 41c1f03a47ff9c04e3e3f98c8e9121c652753b2f (commit)
via da7289c0974d6220caa6ecc77ec55c8375a3b190 (commit)
via 3aa0e8eb1734c046a3bed4d5d86416ac7b21276a (commit)
via a989777556aabcb86ace2177ee610822326b6c2b (commit)
via 6331ba74dc0221afdae5e0cc95ae8a9dc5ad5439 (commit)
via 335d3dcec46d9d9f001d2c3fe9bd8c603ab4be30 (commit)
via 2c561736c9b2e26090dbb73b78dbfb4ce1beafe7 (commit)
via db25d0669c0597d20c907744c7abcfc9a0cc9c96 (commit)
via 4eb89f2d84c662355e8374428e488983043bda32 (commit)
via 399b4c968d16649900d3ea735c7ff572e21850c0 (commit)
via ad86da5f45c64e29b0625f5e51a31a987eae0a8d (commit)
via ba73bc637d964e1dd7907b9aee1fd8619ca42c07 (commit)
via 30d4a4fa9a12c6b2b269965b5850bed5372ebd45 (commit)
via fb6a6ed1200502ec269eaf48bdc40103d73c0762 (commit)
via 30163b57415d1ff544d3407fb7c6a03ec74d17ea (commit)
via 038b74b7c8a8a3afa4b62697fa7b9401d1b5eeca (commit)
via 3d35b1c89df177d8021919ded069156e7414e42d (commit)
via 058a6199e196bbe92c146b261dd355af0edd7167 (commit)
via 661523fee217858abd5552847f2400a48285b7fe (commit)
via b7e939ccdc1f7351c7ac6fba02dbff742008d660 (commit)
via 3a573b8e140dc092b83e348251083cb68b4604a2 (commit)
via 19cf0bfdd73f029d2e92843a587d3d9148c62f6c (commit)
via 215777f7213dc458fc16299b95a05a777a023e48 (commit)
via 28582ba9109d77a6979472f95e6797308e55674f (commit)
via 77cc306a85e350e52ec09390e237e1ff6601760c (commit)
via 45b2fd98e041d1988cbf3112ba96bb1a285ee4fb (commit)
via 04278118bbd05933ebc1c7df432051ff1360836f (commit)
via 9bb391b78fcf0bb54e1c5d6ff1387021698a5db7 (commit)
via dfc378d90e022510767e81dfa75a5833239982c9 (commit)
via 90d7601e315c41aad406f50784cff6a392cf6c00 (commit)
via 669186fc274e07ce16851922c744d5c7e15a84ea (commit)
via 96e67f6256e215729bba53609b2cc3c057b09dbb (commit)
via c2c03cdaebcc00a452fbf8c36fabf877caab3767 (commit)
via 074b98c01a843927c4598b9133a4a10c8f6448cf (commit)
via 056a7da3c8daf34dd9c82702f71852271849144d (commit)
via a594568ba144ed50c21effddeb18704c8b3fa446 (commit)
via 508408f7dff9e322755e4cf4cc1f758a77afb4b6 (commit)
via 26bb7741e04430e26581eae579fb2fdd83a2a2d0 (commit)
via d3418e806a546d54fc8b2d48e8993278d12a28e4 (commit)
via 4cdfb68adba71179d1928ce78897cd901f4e400f (commit)
via cd5f19d46dfb82024482d669074983c844493991 (commit)
via cf8f392486675fa382e4b2dd72c1a501882e01dd (commit)
via 129176c3000e67c707a7ed0f858a7d17a3a3a754 (commit)
via fbed673b4e5f2dca40b75ab862de5bc8b7db8a24 (commit)
via 0da19ecf5b9969fbdcd82b9d2cb90ddbc51ac6c5 (commit)
via 96efae2cbedf68ef4239f362a7ecb76ce4aaaa91 (commit)
via 20559be00fdfd2fbdbdd98f076b876657e5bc6a8 (commit)
via 9085e4b7e9e6fe2d0be12bc63d51aa8f25bcdc4f (commit)
via d9a6f25af67108cee925ce72374aff349434837d (commit)
via 017deaf9e4529abc349e058bce98666e1e432966 (commit)
via 808ccde7dce1f632e13c6a6a5165d2fc09bdee84 (commit)
via 2e5b2fb984eb222f5b47a1d104ebdf8d56f2321a (commit)
via 173a8033a3feee06081e104dba21607f9a521be2 (commit)
via f7d160738f1c853ce9533c1bd72ce77b950d81c0 (commit)
via f00d513a3c97cba2b5f0a641e0e41f6e05e36b4e (commit)
via 0119758928ae548160814ddcd9b2316b0bceac95 (commit)
via 480f7d1fa43b0690d4fedc21bf8bab2326c86cb4 (commit)
via edc8943687604585b3c202a1a65456ca471f0c1a (commit)
from fcf3eb50062fa7db5a54db97b7eed0a5b0ac9f9a (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 -----------------------------------------------------------------
5058422 milena/mln/binarization/tmms_hysteresis.hh: Optimization of functions tmms_hysteresis.
0a79e3b Merge branch 'master' into exp/TL
-----------------------------------------------------------------------
Summary of changes:
.dir-locals.el | 5 +
AUTHORS | 108 +-
COPYING | 14 +-
ChangeLog | 135 +-
HACKING | 7 +-
INSTALL | 9 +-
bootstrap | 4 +-
build-aux/.gitignore | 1 +
build-aux/mln_add_file | 8 +-
configure.ac | 64 +-
doc/Doxyfile.in | 4 +-
doc/Makefile.am | 92 +-
lrde-scmstats.sh | 4 +-
milena/ChangeLog | 1827 +-
milena/Makefile.am | 1 +
milena/apps/Makefile.am | 6 +-
.../constrained-connectivity.cc | 10 +-
milena/apps/generic-skel/Makefile.am | 115 +
.../generic-skel/image2d-skel-unconstrained.cc | 92 +
.../generic-skel/image2d-skel-with-end-points.cc | 94 +
.../generic-skel/image3d-skel-unconstrained.cc | 109 +
.../generic-skel/image3d-skel-with-1d-isthmuses.cc | 114 +
.../generic-skel/image3d-skel-with-end-points.cc | 114 +
milena/apps/generic-skel/image3d-skel.hh | 399 +
.../test-image2d-skel-unconstrained.in} | 15 +-
.../test-image2d-skel-with-end-points.in} | 15 +-
.../generic-skel/test-mixed.in} | 16 +-
milena/apps/graph-morpho/convert.hh | 4 +-
milena/apps/graph-morpho/make.hh | 6 +-
milena/apps/graph-morpho/morpho.hh | 8 +-
milena/apps/mesh-segm-skel/Makefile.am | 187 +-
.../apps/mesh-segm-skel/mesh-complex-2-collapse.cc | 153 +
.../mesh-complex-max-curv-1-collapse.cc | 386 +
.../mesh-complex-max-curv-2-collapse.cc | 328 +
...ax-curv.cc => mesh-complex-max-curv-extrema.cc} | 109 +-
.../mesh-segm-skel/mesh-complex-max-curv-segm.cc | 56 +-
.../mesh-segm-skel/mesh-complex-max-curv-skel.cc | 328 +
.../apps/mesh-segm-skel/mesh-complex-max-curv.cc | 17 +-
...curv-segm.cc => mesh-complex-pinv-curv-segm.cc} | 63 +-
.../mesh-segm-skel/mesh-complex-pinv-curv-skel.cc | 344 +
milena/apps/mesh-segm-skel/mesh-complex-segm.cc | 26 +-
milena/apps/mesh-segm-skel/mesh-complex-skel.cc | 126 +-
milena/apps/mesh-segm-skel/misc.hh | 15 +-
.../mesh-segm-skel/off-to-vtk-bin.cc} | 52 +-
milena/apps/mesh-segm-skel/save_bin_alt.hh | 310 +-
.../test-mesh-complex-2-collapse.in} | 14 +-
.../test-mesh-complex-max-curv-1-collapse.in} | 15 +-
.../test-mesh-complex-max-curv-2-collapse.in} | 15 +-
.../test-mesh-complex-max-curv-extrema.in} | 17 +-
.../test-mesh-complex-max-curv-skel.in} | 17 +-
.../test-mesh-complex-pinv-curv-segm.in} | 17 +-
.../test-mesh-complex-pinv-curv-skel.in} | 17 +-
.../mesh-segm-skel/test-mixed.in} | 12 +-
milena/apps/morphers/iz.cc | 35 +-
milena/apps/morphers/recorder-bft.cc | 9 +-
milena/doc/Doxyfile.in | 6 +-
milena/doc/Makefile.am | 77 +-
milena/doc/examples/devel/facade.cc.raw | 4 +-
milena/doc/examples/devel/impl.cc.raw | 7 +-
milena/doc/figures/extend-1.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/extend-2.ppm | Bin 16546 -> 16547 bytes
milena/doc/figures/extend-3.ppm | Bin 16546 -> 16547 bytes
milena/doc/figures/extend-4.ppm | 2 +-
milena/doc/figures/extend-5.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/fill-1.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/fill-2.ppm | Bin 12406 -> 12407 bytes
milena/doc/figures/fill-imageif-cfun-1.ppm | Bin 206 -> 207 bytes
milena/doc/figures/fill-subdomain-1.pbm | 2 +-
milena/doc/figures/fill-subdomain-2.ppm | Bin 206 -> 207 bytes
milena/doc/figures/fill-subdomain-3.ppm | Bin 206 -> 207 bytes
milena/doc/figures/fill-subdomain-4.ppm | Bin 206 -> 207 bytes
milena/doc/figures/ima2d-rot-1.ppm | Bin 235320 -> 235321 bytes
milena/doc/figures/ima2d-rot-2.ppm | Bin 235320 -> 235321 bytes
milena/doc/figures/ima_save.pbm | 2 +-
milena/doc/figures/labeling-compute-1.pbm | 2 +-
milena/doc/figures/labeling-compute-2.ppm | Bin 206 -> 207 bytes
milena/doc/figures/logical-not-1.pbm | 2 +-
milena/doc/figures/logical-not-2.pbm | 2 +-
milena/doc/figures/logical-not-3.pbm | 2 +-
milena/doc/figures/tuto2_first_image-1.pbm | 2 +-
milena/doc/figures/tuto3_colorize-1.pgm | Bin 141 -> 142 bytes
milena/doc/figures/tuto3_colorize-2.ppm | Bin 191 -> 192 bytes
milena/doc/figures/tuto3_rw_image-1.ppm | Bin 4918 -> 4919 bytes
milena/doc/figures/tuto3_rw_image-2.ppm | 2 +-
milena/doc/figures/tuto3_rw_image-3.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-1.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-2.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-3.pbm | 2 +-
.../figures/tuto4_genericity_and_algorithms-4.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-5.ppm | Bin 12406 -> 12407 bytes
.../figures/tuto4_genericity_and_algorithms-6.ppm | Bin 12406 -> 12407 bytes
milena/doc/generate_dist_files.sh | 47 -
milena/doc/tools/todoxygen.sh | 23 +-
milena/headers.mk | 20 +-
milena/img/README | 6 +
milena/img/bunny.pgm | Bin 0 -> 27000043 bytes
milena/mesh/Makefile.am | 26 +-
milena/mesh/bunny-holefilled.vtk |458714 ++++++++++++++++++++
milena/mesh/pseudo-manifold.vtk | 188 +
milena/mesh/teapot.vtk |25008 ++
milena/mesh/tetrahedron.vtk | 48 +
milena/mln/accu/stat/median_alt.hh | 14 +-
milena/mln/accu/transform_snake.hh | 2 +-
milena/mln/algebra/mat.hh | 4 +-
milena/mln/algebra/quat.hh | 7 +-
milena/mln/binarization/tmms_hysteresis.hh | 740 +-
milena/mln/canvas/all.hh | 2 +-
.../canvas/browsing/dir_struct_elt_incr_update.hh | 31 +-
milena/mln/core/alias/complex_image.hh | 18 +-
milena/mln/core/concept/function.hh | 12 +-
milena/mln/core/contract.hh | 11 +-
.../mln/core/image/dmorph/mutable_extension_ima.hh | 272 +
milena/mln/core/image/graph_elt_neighborhood_if.hh | 8 +-
milena/mln/core/image/graph_elt_window_if.hh | 10 +-
milena/mln/core/image/image2d.hh | 5 -
milena/mln/core/image/imorph/labeled_image.hh | 8 +-
milena/mln/core/image/vmorph/fun_image.hh | 24 +-
milena/mln/core/internal/classical_window_base.hh | 1 -
milena/mln/core/internal/image_morpher.hh | 1 -
milena/mln/core/internal/labeled_image_base.hh | 35 +-
milena/mln/core/point.hh | 2 +-
.../{math/pi.hh => core/routine/mutable_extend.hh} | 47 +-
milena/mln/core/site_set/p_edges.hh | 16 +-
milena/mln/core/site_set/p_graph_piter.hh | 4 +-
milena/mln/core/site_set/p_line2d.hh | 1 -
milena/mln/core/site_set/p_set.hh | 14 +-
milena/mln/data/fill.hh | 3 +-
milena/mln/data/stretch.hh | 12 +-
milena/mln/debug/trace.hh | 40 +-
milena/mln/draw/dashed_line.hh | 18 +-
milena/mln/fun/p2b/antilogy.hh | 1 -
milena/mln/fun/p2b/tautology.hh | 1 -
milena/mln/fun/v2v/array.hh | 11 +-
milena/mln/fun/v2v/rgb8_to_rgbn.hh | 61 +-
milena/mln/fun/v2v/rgb_to_hsl.hh | 2 +-
milena/mln/fun/x2x/rotation.hh | 7 +-
milena/mln/geom/complex_geometry.hh | 16 +-
milena/mln/io/fld/write_header.hh | 9 +-
milena/mln/io/magick/load.hh | 6 +-
milena/mln/io/off/load.hh | 27 +-
milena/mln/io/off/save.hh | 10 +-
milena/mln/io/pdf/load.hh | 8 +-
milena/mln/io/pnm/save_header.hh | 10 +-
milena/mln/io/raw/load.hh | 3 +-
milena/mln/io/tiff/load.hh | 10 +-
.../{tests/accu/compute.cc => mln/io/vtk/all.hh} | 29 +-
milena/mln/io/vtk/load.hh | 615 +
milena/mln/io/vtk/save.hh | 649 +
milena/mln/labeling/flat_zones.hh | 4 +-
milena/mln/linear/#ch_convolve.hh# | 103 -
milena/mln/linear/gaussian.hh | 3 +-
milena/mln/make/attachment.hh | 53 +-
milena/mln/make/cell.hh | 11 +-
milena/mln/make/detachment.hh | 56 +-
milena/mln/math/pi.hh | 10 +-
milena/mln/morpho/tree/data.hh | 32 +-
milena/mln/morpho/tree/impl/dual_hqueue.hh | 5 +-
milena/mln/morpho/tree/impl/dual_union_find.hh | 13 +-
milena/mln/morpho/watershed/flooding.hh | 25 +-
milena/mln/morpho/watershed/topological.hh | 198 +-
milena/mln/registration/icp.hh | 15 +-
milena/mln/tag/init.hh | 1 -
milena/mln/test/positive.hh | 11 +-
milena/mln/test/predicate.hh | 8 +-
milena/mln/topo/connectivity_number_2d.hh | 130 +
milena/mln/topo/connectivity_number_3d.hh | 309 +
milena/mln/topo/detach.hh | 83 -
milena/mln/topo/detach_cell.hh | 154 +
milena/mln/topo/detach_pair.hh | 191 +
milena/mln/topo/detach_point.hh | 114 +
milena/mln/topo/is_facet.hh | 52 +-
milena/mln/topo/is_n_face.hh | 16 +-
milena/mln/topo/is_not_1d_isthmus.hh | 208 +
milena/mln/topo/is_not_end_point.hh | 121 +
milena/mln/topo/is_simple_2d.hh | 135 +-
milena/mln/topo/is_simple_cell.hh | 114 +-
milena/mln/topo/is_simple_pair.hh | 225 +
milena/mln/topo/is_simple_point2d.hh | 142 +
milena/mln/topo/is_simple_point3d.hh | 191 +
milena/mln/topo/{is_n_face.hh => no_constraint.hh} | 46 +-
milena/mln/topo/skeleton/breadth_first_thinning.hh | 171 +-
.../mln/topo/skeleton/priority_driven_thinning.hh | 215 +
milena/mln/trait/image/props.hh | 2 +-
milena/mln/trait/images.hh | 7 +-
milena/mln/transform/fft.hh | 705 +
milena/mln/util/adjacency_matrix.hh | 13 +-
milena/mln/util/array.hh | 43 +-
milena/mln/util/edge.hh | 3 +-
milena/mln/util/fibonacci_heap.hh | 93 +-
milena/mln/util/object_id.hh | 8 +-
milena/mln/util/set.hh | 4 +-
milena/mln/util/timer.hh | 24 -
milena/mln/util/tracked_ptr.hh | 8 +-
milena/mln/value/hsl.hh | 9 +-
milena/mln/value/int_u.hh | 194 +-
milena/mln/value/int_u.hxx | 198 +
milena/mln/value/internal/gray_f.hh | 2 +-
milena/mln/value/lut_vec.hh | 8 +-
milena/mln/value/qt/rgb32.hh | 78 +-
milena/mln/value/rgb.hh | 38 +-
milena/mln/version.hh.in | 19 +-
milena/mln/world/binary_2d/subsample.hh | 27 +-
milena/new-header | 4 +-
milena/tests/Makefile.am | 10 +-
milena/tests/accu/compute.cc | 5 +-
milena/tests/core/alias/Makefile.am | 3 +-
milena/tests/core/alias/dpoint2d.cc | 4 +-
.../tests/core/alias/{dpoint2d.cc => neighb2d.cc} | 33 +-
milena/tests/core/image/complex_image.hh | 20 +-
milena/tests/data/transform.cc | 18 +-
milena/tests/draw/Makefile.am | 4 +-
.../deskew.cc => milena/tests/draw/dashed_line.cc | 33 +-
milena/tests/draw/line.cc | 17 +-
milena/tests/io/Makefile.am | 5 +-
milena/tests/io/dump/Makefile.am | 4 +-
milena/tests/io/dump/dump.cc | 32 +
milena/tests/io/magick/load.cc | 2 +-
milena/tests/io/{dump => vtk}/Makefile.am | 18 +-
.../deskew.cc => milena/tests/io/vtk/load_bin.cc | 44 +-
.../alias/dpoint2d.cc => io/vtk/load_save_bin.cc} | 33 +-
milena/tests/io/vtk/save.cc | 106 +
milena/tests/labeling/compute.cc | 14 +-
milena/tests/labeling/pack.cc | 13 +-
milena/tests/make/Makefile.am | 4 +-
milena/tests/make/attachment.cc | 77 +
milena/tests/make/detachment.cc | 98 +
milena/tests/topo/Makefile.am | 13 +-
milena/tests/topo/complex.cc | 3 +
milena/tests/topo/connectivity_numbers_2d.cc | 87 +
milena/tests/topo/detach_pair.cc | 73 +
milena/tests/topo/is_facet.cc | 80 +
milena/tests/topo/is_simple_pair.cc | 73 +
milena/tests/topo/skeleton/Makefile.am | 12 +-
.../tests/topo/skeleton/breadth_first_thinning.cc | 64 +-
.../skeleton/breadth_first_thinning_constrained.cc | 78 +
.../topo/skeleton/priority_driven_thinning.cc | 92 +
.../priority_driven_thinning_constrained.cc | 96 +
milena/tests/transform/Makefile.am | 22 +-
milena/tests/transform/fft.cc | 105 +
milena/tests/unit_test/Makefile.am | 3 +-
milena/tests/unit_test/cond_tests_fftw3 | 1 +
milena/tests/unit_test/unit-tests.mk | 35 +-
milena/tests/util/line_graph.cc | 22 +-
milena/tests/value/Makefile.am | 8 +-
milena/tests/{accu/compute.cc => value/int_u32.cc} | 21 +-
milena/tests/value/scalar.cc | 90 -
milena/tests/world/binary_2d/Makefile.am | 11 +-
.../tests/world/binary_2d/subsample.cc | 28 +-
milena/tools/Makefile.am | 66 +-
milena/tools/compute_local_configurations.cc | 109 +
.../pi.hh => tools/connectivity_numbers_3d.cc} | 48 +-
milena/tools/connectivity_numbers_3d.hh | 407 +
.../tools/connectivity_numbers_3d_tbb.cc | 50 +-
milena/tools/connectivity_numbers_3d_tbb.hh | 163 +
milena/tools/gen_cxx_lut | 103 +
.../tools/simple_point3d_lut.cc | 51 +-
milena/tools/simple_point3d_lut.hh | 190 +
.../simple_point3d_lut_26_6.cc} | 22 +-
.../all.hh => tools/simple_point3d_lut_tbb.cc} | 49 +-
milena/tools/simple_point3d_lut_tbb.hh | 185 +
milena/tools/test_simple_point3d_lut_26_6.cc | 136 +
milena/tools/tools.mk | 7 +-
milena/trash/display_color_pretty.hh | 15 +-
milena/trash/display_remove.hh | 13 +-
milena/trash/display_save.hh | 14 +-
milena/trash/display_save_and_show.hh | 10 +-
milena/trash/display_show.hh | 10 +-
milena/trash/neighb_get.hh | 6 +-
scribo/ChangeLog | 220 +-
scribo/demo/viewer/Makefile.am | 3 +-
scribo/doc/Doxyfile.in | 2 +-
scribo/doc/Makefile.am | 77 +-
scribo/doc/tools/todoxygen.sh | 23 +-
scribo/headers.mk | 3 +
scribo/{src => scribo}/afp/components.hh | 20 +-
scribo/{src => scribo}/afp/link.hh | 11 +-
scribo/{src => scribo}/afp/regroup.hh | 9 +-
.../binarization/internal/local_threshold_core.hh | 3 +-
scribo/scribo/core/document.hh | 13 +-
scribo/scribo/core/internal/doc_serializer.hh | 18 +-
scribo/scribo/core/line_info.hh | 6 +-
scribo/scribo/core/line_set.hh | 2 -
scribo/scribo/core/object_groups.hh | 5 +-
scribo/scribo/core/paragraph_set.hh | 3 +-
scribo/scribo/estim/components_features.hh | 24 +-
scribo/scribo/filter/internal/component_aligned.hh | 4 +-
scribo/scribo/filter/internal/compute.hh | 4 +-
scribo/scribo/filter/object_groups_with_holes.hh | 2 +-
scribo/scribo/filter/objects_with_holes.hh | 33 +-
scribo/scribo/filter/separators_in_borders.hh | 14 -
scribo/scribo/io/xml/load.hh | 15 +-
scribo/scribo/postprocessing/fill_object_holes.hh | 9 -
scribo/scribo/preprocessing/deskew.hh | 7 +-
scribo/scribo/preprocessing/deskew_crop.hh | 3 +-
scribo/scribo/primitive/extract/alignments.hh | 8 +-
.../primitive/extract/lines_h_thick_and_thin.hh | 3 +-
scribo/scribo/primitive/extract/non_text.hh | 4 -
scribo/scribo/primitive/extract/non_text_kmean.hh | 5 +-
.../primitive/extract/separators_nonvisible.hh | 63 -
.../primitive/link/internal/link_functor_base.hh | 4 +-
.../primitive/regroup/from_single_left_link.hh | 4 +-
scribo/scribo/text/clean_inplace.hh | 15 +-
scribo/scribo/text/extract_paragraphs_hdoc.hh | 44 -
scribo/scribo/text/merging.hh | 55 +-
scribo/scribo/text/recognition.hh | 216 +-
.../toolchain/internal/text_in_picture_functor.hh | 42 +-
scribo/scribo/util/init_integral_image.hh | 5 +-
scribo/src/Makefile.am | 9 +-
scribo/src/binarization/Makefile.am | 5 -
scribo/src/text_recognition_in_picture.cc | 4 +-
scribo/tests/preprocessing/crop.cc | 6 +-
.../preprocessing/crop_without_localization.cc | 6 +-
scribo/tests/preprocessing/deskew.cc | 6 +-
scribo/tests/preprocessing/rotate_90.cc | 6 +-
scribo/tests/primitive/extract/alignments.cc | 19 +-
scribo/tests/unit_test/unit-tests.mk | 3 +
swilena/ChangeLog | 10 +-
swilena/python/Makefile.am | 2 +-
318 files changed, 499006 insertions(+), 3090 deletions(-)
create mode 100644 .dir-locals.el
create mode 100644 milena/apps/generic-skel/Makefile.am
create mode 100644 milena/apps/generic-skel/image2d-skel-unconstrained.cc
create mode 100644 milena/apps/generic-skel/image2d-skel-with-end-points.cc
create mode 100644 milena/apps/generic-skel/image3d-skel-unconstrained.cc
create mode 100644 milena/apps/generic-skel/image3d-skel-with-1d-isthmuses.cc
create mode 100644 milena/apps/generic-skel/image3d-skel-with-end-points.cc
create mode 100644 milena/apps/generic-skel/image3d-skel.hh
copy milena/{tests/draw/Makefile.am => apps/generic-skel/test-image2d-skel-unconstrained.in} (68%)
copy milena/{tests/draw/Makefile.am => apps/generic-skel/test-image2d-skel-with-end-points.in} (67%)
copy milena/{tests/draw/Makefile.am => apps/generic-skel/test-mixed.in} (63%)
create mode 100644 milena/apps/mesh-segm-skel/mesh-complex-2-collapse.cc
create mode 100644 milena/apps/mesh-segm-skel/mesh-complex-max-curv-1-collapse.cc
create mode 100644 milena/apps/mesh-segm-skel/mesh-complex-max-curv-2-collapse.cc
copy milena/apps/mesh-segm-skel/{mesh-complex-max-curv.cc => mesh-complex-max-curv-extrema.cc} (63%)
create mode 100644 milena/apps/mesh-segm-skel/mesh-complex-max-curv-skel.cc
copy milena/apps/mesh-segm-skel/{mesh-complex-max-curv-segm.cc => mesh-complex-pinv-curv-segm.cc} (72%)
create mode 100644 milena/apps/mesh-segm-skel/mesh-complex-pinv-curv-skel.cc
copy milena/{mln/canvas/all.hh => apps/mesh-segm-skel/off-to-vtk-bin.cc} (59%)
copy milena/{tests/draw/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-2-collapse.in} (73%)
copy milena/{tests/draw/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-max-curv-1-collapse.in} (64%)
copy milena/{tests/draw/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-max-curv-2-collapse.in} (64%)
copy milena/{tests/draw/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-max-curv-extrema.in} (54%)
copy milena/{tests/draw/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-max-curv-skel.in} (55%)
copy milena/{tests/topo/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-pinv-curv-segm.in} (60%)
copy milena/{tests/draw/Makefile.am => apps/mesh-segm-skel/test-mesh-complex-pinv-curv-skel.in} (55%)
rename milena/{doc/tools/clearbanner.sh => apps/mesh-segm-skel/test-mixed.in} (56%)
mode change 100755 => 100644
delete mode 100755 milena/doc/generate_dist_files.sh
create mode 100755 milena/img/bunny.pgm
create mode 100644 milena/mesh/bunny-holefilled.vtk
create mode 100644 milena/mesh/pseudo-manifold.vtk
create mode 100644 milena/mesh/teapot.vtk
create mode 100644 milena/mesh/tetrahedron.vtk
create mode 100644 milena/mln/core/image/dmorph/mutable_extension_ima.hh
copy milena/mln/{math/pi.hh => core/routine/mutable_extend.hh} (59%)
delete mode 100644 milena/mln/data/transform
copy milena/{tests/accu/compute.cc => mln/io/vtk/all.hh} (74%)
create mode 100644 milena/mln/io/vtk/load.hh
create mode 100644 milena/mln/io/vtk/save.hh
delete mode 100644 milena/mln/linear/#ch_convolve.hh#
create mode 100644 milena/mln/topo/connectivity_number_2d.hh
create mode 100644 milena/mln/topo/connectivity_number_3d.hh
delete mode 100644 milena/mln/topo/detach.hh
create mode 100644 milena/mln/topo/detach_cell.hh
create mode 100644 milena/mln/topo/detach_pair.hh
create mode 100644 milena/mln/topo/detach_point.hh
create mode 100644 milena/mln/topo/is_not_1d_isthmus.hh
create mode 100644 milena/mln/topo/is_not_end_point.hh
create mode 100644 milena/mln/topo/is_simple_pair.hh
create mode 100644 milena/mln/topo/is_simple_point2d.hh
create mode 100644 milena/mln/topo/is_simple_point3d.hh
copy milena/mln/topo/{is_n_face.hh => no_constraint.hh} (64%)
create mode 100644 milena/mln/topo/skeleton/priority_driven_thinning.hh
create mode 100644 milena/mln/transform/fft.hh
create mode 100644 milena/mln/value/int_u.hxx
copy milena/tests/core/alias/{dpoint2d.cc => neighb2d.cc} (68%)
copy scribo/tests/preprocessing/deskew.cc => milena/tests/draw/dashed_line.cc (72%)
copy milena/tests/io/{dump => vtk}/Makefile.am (70%)
copy scribo/tests/preprocessing/deskew.cc => milena/tests/io/vtk/load_bin.cc (62%)
copy milena/tests/{core/alias/dpoint2d.cc => io/vtk/load_save_bin.cc} (72%)
create mode 100644 milena/tests/io/vtk/save.cc
create mode 100644 milena/tests/make/attachment.cc
create mode 100644 milena/tests/make/detachment.cc
create mode 100644 milena/tests/topo/connectivity_numbers_2d.cc
create mode 100644 milena/tests/topo/detach_pair.cc
create mode 100644 milena/tests/topo/is_facet.cc
create mode 100644 milena/tests/topo/is_simple_pair.cc
copy scribo/tests/primitive/extract/alignments.cc => milena/tests/topo/skeleton/breadth_first_thinning.cc (52%)
create mode 100644 milena/tests/topo/skeleton/breadth_first_thinning_constrained.cc
create mode 100644 milena/tests/topo/skeleton/priority_driven_thinning.cc
create mode 100644 milena/tests/topo/skeleton/priority_driven_thinning_constrained.cc
create mode 100644 milena/tests/transform/fft.cc
create mode 100644 milena/tests/unit_test/cond_tests_fftw3
copy milena/tests/{accu/compute.cc => value/int_u32.cc} (74%)
delete mode 100644 milena/tests/value/scalar.cc
copy scribo/tests/preprocessing/deskew.cc => milena/tests/world/binary_2d/subsample.cc (74%)
create mode 100644 milena/tools/compute_local_configurations.cc
copy milena/{mln/math/pi.hh => tools/connectivity_numbers_3d.cc} (64%)
create mode 100644 milena/tools/connectivity_numbers_3d.hh
copy scribo/tests/preprocessing/rotate_90.cc => milena/tools/connectivity_numbers_3d_tbb.cc (61%)
create mode 100644 milena/tools/connectivity_numbers_3d_tbb.hh
create mode 100755 milena/tools/gen_cxx_lut
copy scribo/tests/preprocessing/rotate_90.cc => milena/tools/simple_point3d_lut.cc (60%)
create mode 100644 milena/tools/simple_point3d_lut.hh
copy milena/{tests/accu/compute.cc => tools/simple_point3d_lut_26_6.cc} (73%)
copy milena/{mln/canvas/all.hh => tools/simple_point3d_lut_tbb.cc} (58%)
create mode 100644 milena/tools/simple_point3d_lut_tbb.hh
create mode 100644 milena/tools/test_simple_point3d_lut_26_6.cc
rename scribo/{src => scribo}/afp/components.hh (92%)
rename scribo/{src => scribo}/afp/link.hh (94%)
rename scribo/{src => scribo}/afp/regroup.hh (94%)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

olena: olena-2.0-896-g5058422 milena/mln/binarization/tmms_hysteresis.hh: Optimization of functions tmms_hysteresis.
by myriam robert-seidowsky 18 Apr '14
by myriam robert-seidowsky 18 Apr '14
18 Apr '14
---
milena/mln/binarization/tmms_hysteresis.hh | 740 ++++++++++++++++------------
1 file changed, 413 insertions(+), 327 deletions(-)
diff --git a/milena/mln/binarization/tmms_hysteresis.hh b/milena/mln/binarization/tmms_hysteresis.hh
index f80caf5..36a7cf9 100644
--- a/milena/mln/binarization/tmms_hysteresis.hh
+++ b/milena/mln/binarization/tmms_hysteresis.hh
@@ -24,355 +24,441 @@
// executable file might be covered by the GNU General Public License.
#ifndef MLN_BINARIZATION_TMMS_HYSTERESIS_HH
-# define MLN_BINARIZATION_TMMS_HYSTERESIS_HH
+#define MLN_BINARIZATION_TMMS_HYSTERESIS_HH
/// \file
///
/// \brief Binarization using TMMS algorithm combined with hysteresis.
-# include <mln/core/concept/image.hh>
-# include <mln/core/concept/window.hh>
-# include <mln/core/alias/neighb2d.hh>
-# include <mln/morpho/dilation.hh>
-# include <mln/morpho/erosion.hh>
-# include <mln/labeling/blobs.hh>
+#include <mln/core/concept/image.hh>
+#include <mln/core/concept/window.hh>
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/morpho/dilation.hh>
+#include <mln/morpho/erosion.hh>
+#include <mln/labeling/blobs.hh>
-namespace mln
-{
+namespace mln {
- namespace binarization
- {
+ namespace binarization {
- /*!
- Binarize \p input by the use of TMMS algorithm (see "Text
- Segmentation in Natural Scenes Using Toggle-Mapping" from
- icip09 for more details \cite fabrizio2009icip). This version
- is combined with hysteresis.
+ /*!
+ Binarize \p input by the use of TMMS algorithm (see "Text
+ Segmentation in Natural Scenes Using Toggle-Mapping" from
+ icip09 for more details \cite fabrizio2009icip). This version
+ is combined with hysteresis.
- \param[in] input the input image.
+ \param[in] input the input image.
- \param[in] win the structuring element used to compute erosion
- and dilation of input image (During TMMS algorithm, input image
- is mapped over two fuctions: an erosion and a dilation of the
- input image).
+ \param[in] win the structuring element used to compute erosion
+ and dilation of input image (During TMMS algorithm, input image
+ is mapped over two fuctions: an erosion and a dilation of the
+ input image).
- \param[in] c_min the min contrast allowed to extract feature.
+ \param[in] c_min the min contrast allowed to extract feature.
- \return an image with "foreground" marked with the highest
- possible color (hc), the "background" marked with the lowest
- possible color (lc) and homogeneous regions of the image marked
- with the color (hc+lc)/2. (This will fail with two colors
- images, but it seems to be a bit stupid to try to binarize two
- color images?)
+ \return an image with "foreground" marked with the highest
+ possible color (hc), the "background" marked with the lowest
+ possible color (lc) and homogeneous regions of the image marked
+ with the color (hc+lc)/2. (This will fail with two colors
+ images, but it seems to be a bit stupid to try to binarize two
+ color images?)
- \author J. Fabrizio
+ \author J. Fabrizio
- \ingroup modroutines
- */
- template<typename I, typename W>
- mln_concrete(I)
- tmms_hysteresis(const Image<I>& input_, const Window<W>& win,
- const mln_value(I)& c_min_low,
- const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent);
-
-
-# ifndef MLN_INCLUDE_ONLY
-
- // Implementations
-
- namespace impl
- {
-
- namespace generic
- {
+ \ingroup modroutines
+ */
+ template<typename I, typename W>
+ mln_concrete(I)
+ tmms_hysteresis(const Image<I>& input_, const Window<W>& win,
+ const mln_value(I) & c_min_low,
+ const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent);
+
+
+#ifndef MLN_INCLUDE_ONLY
+
+ // Implementations
+
+ namespace impl {
+
+ namespace generic {
+
+ template<typename I, typename W>
+ mln_concrete(I)
+ tmms_hysteresis(const Image<I>& input_, const Window<W>& win_,
+ const mln_value(I) & c_min_low,
+ const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent) {
+ mln_trace("mln::binarization::impl::generic::tmms_hysteresis");
+
+ const I& input = exact(input_);
+ const W& win = exact(win_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(win.is_valid());
+
+ typedef mln_value(I) V;
+
+ mln_concrete(I) dilation = mln::morpho::dilation(input, win);
+ mln_concrete(I) erosion = mln::morpho::erosion(input, win);
+
+ mln_concrete(I) low_image;
+ initialize(low_image, input);
+ mln_concrete(I) high_image;
+ initialize(high_image, input);
+
+ // mln_piter(I) p(input.domain());
+ //
+ // for_all(p) {
+ // V dil = dilation(p); // by def : dil>=ima>=ero
+ // V ero = erosion(p);
+ // V ima = input(p);
+ //
+ // if ((V) (dil - ero) < c_min_low) {
+ // low_image(p) = med_level;
+ // high_image(p) = med_level;
+ // } else if ((V) (dil - ero) < c_min_high) {
+ // low_image(p) = med_level;
+ // if ((V) (dil - ima) < pourcent * ((V) (dil - ero)) / 100)
+ // high_image(p) = max_level;
+ // else
+ // high_image(p) = min_level;
+ // } else {
+ // if ((V) (dil - ima) < pourcent * ((V) (dil - ero)) / 100) {
+ // low_image(p) = max_level;
+ // high_image(p) = max_level;
+ // } else {
+ // low_image(p) = min_level;
+ // high_image(p) = min_level;
+ // }
+ // }
+ //
+ // }
+ //
+ // unsigned nlabels;
+ // mln_ch_value(I, unsigned)
+ // labels_high_images = mln::labeling::blobs(high_image, mln::c4(), nlabels);
+ //
+ // std::vector<V> values(nlabels + 1);
+ //
+ // for (unsigned i = 0; i <= nlabels; i++)
+ // values[i] = med_level;
+ //
+ // for_all(p)
+ // if (low_image(p) != med_level)
+ // values[labels_high_images(p)] = low_image(p);
+ //
+ // for_all(p)
+ // if (low_image(p) == med_level)
+ // low_image(p) = values[labels_high_images(p)];
+ //
+ // return low_image;
+
+ //OPTIM MYRIAM
+
+ mln_pixter(I) px_in(input);
+ mln_pixter(I) px_dil(dilation);
+ mln_pixter(I) px_ero(erosion);
+ mln_pixter(I) px_low(low_image);
+ mln_pixter(I) px_hig(high_image);
+
+ for_all_5(px_in, px_dil, px_ero, px_low, px_hig) {
+
+ V dil = px_dil.val(); // by def : dil>=ima>=ero
+ V ero = px_ero.val();
+ V ima = px_in.val();
+
+ if ((V) (dil - ero) < c_min_low) {
+ px_low.val() = med_level;
+ px_hig.val() = med_level;
+ } else if ((V) (dil - ero) < c_min_high) {
+ px_low.val() = med_level;
+ if ((V) (dil - ima) < pourcent * ((V) (dil - ero)) / 100)
+ px_hig.val() = max_level;
+ else
+ px_hig.val() = min_level;
+ } else {
+ if ((V) (dil - ima) < pourcent * ((V) (dil - ero)) / 100) {
+ px_low.val() = max_level;
+ px_hig.val() = max_level;
+ } else {
+ px_low.val() = min_level;
+ px_hig.val() = min_level;
+ }
+ }
+ }
+
+ unsigned nlabels;
+ mln_ch_value(I, unsigned)
+ labels_high_images = mln::labeling::blobs(high_image, mln::c4(), nlabels);
+ mln_pixter(I) px_lab(labels_high_images);
+
+ std::vector<V> values(nlabels + 1);
+
+ for (unsigned i = 0; i <= nlabels; i++)
+ values[i] = med_level;
+
+ for_all_2(px_low, px_lab)
+ if (px_low.val() != med_level)
+ values[px_lab.val()] = px_low.val();
+
+ for_all_2(px_low, px_lab)
+ if (px_low.val() == med_level)
+ px_low.val() = values[px_lab.val()];
+
+ return low_image;
+ }
+
+ } // end of namespace mln::binarization::impl::generic
+
+ template<typename I, typename W>
+ mln_concrete(I)
+ tmms_hysteresis_fastest(const Image<I>& input_, const Window<W>& win_,
+ const mln_value(I) & c_min_low, const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent) {
+ mln_trace("mln::binarization::impl::tmms_hysteresis_fastest");
+
+ const I& input = exact(input_);
+ const W& win = exact(win_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(win.is_valid());
+
+ typedef mln_value(I) V;
+
+ mln_concrete(I) dilation = mln::morpho::dilation(input, win);
+ mln_concrete(I) erosion = mln::morpho::erosion(input, win);
+
+ // Checking border sizes.
+ if (dilation.border() != input.border())
+ border::resize(dilation, input.border());
+ if (erosion.border() != input.border())
+ border::resize(erosion, input.border());
+ mln_assertion(input.border() == dilation.border());
+ mln_assertion(input.border() == erosion.border());
+
+ mln_concrete(I) low_image;
+ initialize(low_image, input);
+ mln_concrete(I) high_image;
+ initialize(high_image, input);
+
+// unsigned nrows = geom::nrows(input);
+// unsigned ncols = geom::ncols(input);
+// for (unsigned row = 0; row < nrows; ++row) {
+// const V *p_input = &(input.at_(row, 0));
+// const V *p_dilation = &(dilation.at_(row, 0));
+// const V *p_erosion = &(erosion.at_(row, 0));
+// V *p_low_image = &(low_image.at_(row, 0));
+// V *p_high_image = &(high_image.at_(row, 0));
+//
+// for (unsigned col = 0; col < ncols; ++col) {
+// V dil = *p_dilation; // by def : dil>=ima>=ero
+// V ero = *p_erosion;
+// V ima = *p_input;
+//
+// if ((V) (dil - ero) < c_min_low) {
+// *p_low_image = med_level;
+// *p_high_image = med_level;
+// } else if ((V) (dil - ero) < c_min_high) {
+// *p_low_image = med_level;
+//
+// if ((V) (dil - ima) < (V) (pourcent * (dil - ero) / 100))
+// *p_high_image = max_level;
+// else
+// *p_high_image = min_level;
+// } else {
+// if ((V) (dil - ima) < (V) (pourcent * (dil - ero) / 100)) {
+// *p_low_image = max_level;
+// *p_high_image = max_level;
+// } else {
+// *p_low_image = min_level;
+// *p_high_image = min_level;
+// }
+// }
+//
+// ++p_input;
+// ++p_dilation;
+// ++p_erosion;
+// ++p_low_image;
+// ++p_high_image;
+// }
+// }
+// unsigned nlabels;
+// mln_ch_value(I, unsigned)
+// labels_high_images = mln::labeling::blobs(high_image, c4(), nlabels);
+
+ // OPTIM MYRIAM
+ mln_pixter(I) px_low(low_image);
+ mln_pixter(I) px_hig(high_image);
+
+ unsigned nrows = geom::nrows(input);
+ unsigned ncols = geom::ncols(input);
+ for (unsigned row = 0; row < nrows; ++row) {
+ const V *p_input = &(input.at_(row, 0));
+ const V *p_dilation = &(dilation.at_(row, 0));
+ const V *p_erosion = &(erosion.at_(row, 0));
+ V *p_low_image = &(low_image.at_(row, 0));
+ V *p_high_image = &(high_image.at_(row, 0));
+
+ for (unsigned col = 0; col < ncols; ++col) {
+ V dil = *p_dilation; // by def : dil>=ima>=ero
+ V ero = *p_erosion;
+ V ima = *p_input;
+
+ if ((V) (dil - ero) < c_min_low) {
+ *p_low_image = med_level;
+ *p_high_image = med_level;
+ } else if ((V) (dil - ero) < c_min_high) {
+ *p_low_image = med_level;
+
+ if ((V) (dil - ima) < (V) (pourcent * (dil - ero) / 100))
+ *p_high_image = max_level;
+ else
+ *p_high_image = min_level;
+ } else {
+ if ((V) (dil - ima) < (V) (pourcent * (dil - ero) / 100)) {
+ *p_low_image = max_level;
+ *p_high_image = max_level;
+ } else {
+ *p_low_image = min_level;
+ *p_high_image = min_level;
+ }
+ }
+
+ ++p_input;
+ ++p_dilation;
+ ++p_erosion;
+ ++p_low_image;
+ ++p_high_image;
+ }
+ }
+
+ unsigned nlabels;
+ mln_ch_value(I, unsigned)
+ labels_high_images = mln::labeling::blobs(high_image, c4(), nlabels);
+ mln_pixter(image2d<unsigned int>) px_lab(labels_high_images);
+
+ std::vector<V> values(nlabels + 1);
+
+ for (unsigned i = 0; i <= nlabels; ++i)
+ values[i] = med_level;
+
+// mln_piter(I) p(input.domain());
+// for_all(p)
+// if (low_image(p) != med_level)
+// values[labels_high_images(p)] = low_image(p);
+//
+// for_all(p)
+// if (low_image(p) == med_level)
+// low_image(p) = values[labels_high_images(p)];
+
+ //OPTIM MYRIAM
+
+ for_all_2(px_low, px_lab)
+ if (px_low.val() != med_level)
+ values[px_lab.val()] = px_low.val();
+
+ for_all_2(px_low, px_lab)
+ if (px_low.val() == med_level)
+ px_low.val() = values[px_lab.val()];
+
+ return low_image;
+ }
+
+ }// end of namespace mln::binarization::impl
+
+
+ // Dispatch
+
+ namespace internal {
+
+ template<typename I, typename W>
+ mln_concrete(I)
+ tmms_hysteresis_dispatch(const I& ima, const W& win,
+ const mln_value(I) & c_min_low,
+ const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent, mln::trait::image::speed::any) {
+ return impl::generic::tmms_hysteresis(ima, win,
+ c_min_low, c_min_high,
+ min_level, med_level,
+ max_level, pourcent);
+ }
+
+ template<typename I, typename W>
+ mln_concrete(I)
+ tmms_hysteresis_dispatch(const I& ima, const W& win,
+ const mln_value(I) & c_min_low,
+ const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent, mln::trait::image::speed::fastest) {
+ return impl::tmms_hysteresis_fastest(ima, win,
+ c_min_low, c_min_high,
+ min_level, med_level,
+ max_level, pourcent);
+ }
+
+ template<typename I, typename W>
+ mln_concrete(I)
+ tmms_hysteresis_dispatch(const I& ima, const W& win,
+ const mln_value(I) & c_min_low,
+ const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent) {
+ return tmms_hysteresis_dispatch(ima, win,
+ c_min_low, c_min_high,
+ min_level, med_level,
+ max_level, pourcent,
+ mln_trait_image_speed(I)());
+ }
+
+ } //end of namespace namespace mln::binarization::internal
+
+
+ // Facade
template<typename I, typename W>
mln_concrete(I)
tmms_hysteresis(const Image<I>& input_, const Window<W>& win_,
- const mln_value(I)& c_min_low,
- const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent)
- {
- mln_trace("mln::binarization::impl::generic::tmms_hysteresis");
-
- const I& input = exact(input_);
- const W& win = exact(win_);
-
- mln_precondition(input.is_valid());
- mln_precondition(win.is_valid());
-
- typedef mln_value(I) V;
-
- mln_concrete(I) dilation = mln::morpho::dilation(input, win);
- mln_concrete(I) erosion = mln::morpho::erosion(input, win);
-
- mln_concrete(I) low_image;
- initialize(low_image, input);
- mln_concrete(I) high_image;
- initialize(high_image, input);
-
- mln_piter(I) p(input.domain());
- for_all(p)
- {
- V dil = dilation(p); // by def : dil>=ima>=ero
- V ero = erosion(p);
- V ima = input(p);
-
- if ((V)(dil - ero) < c_min_low)
- {
- low_image(p) = med_level;
- high_image(p) = med_level;
- }
- else if ((V)(dil - ero) < c_min_high)
- {
- low_image(p) = med_level;
- if ((V)(dil - ima) < pourcent * ((V) (dil - ero)) / 100)
- high_image(p) = max_level;
- else
- high_image(p) = min_level;
- }
- else
- {
- if ((V)(dil - ima) < pourcent * ((V)(dil - ero)) / 100)
- {
- low_image(p) = max_level;
- high_image(p) = max_level;
- }
- else
- {
- low_image(p) = min_level;
- high_image(p) = min_level;
- }
- }
-
- }
-
- unsigned nlabels;
- mln_ch_value(I, unsigned)
- labels_high_images = mln::labeling::blobs(high_image, mln::c4(), nlabels);
-
- std::vector<V> values(nlabels + 1);
-
- for (unsigned i = 0; i <= nlabels ; i++)
- values[i] = med_level;
-
- for_all(p)
- if (low_image(p) != med_level)
- values[labels_high_images(p)] = low_image(p);
-
- for_all(p)
- if (low_image(p) == med_level)
- low_image(p) = values[labels_high_images(p)];
-
- return low_image;
+ const mln_value(I) & c_min_low, const mln_value(I) & c_min_high,
+ const mln_value(I) & min_level,
+ const mln_value(I) & med_level,
+ const mln_value(I) & max_level,
+ const int pourcent) {
+ mln_trace("mln::binarization::tmms_hysteresis");
+
+ const I& input = exact(input_);
+ const W& win = exact(win_);
+
+ mln_precondition(input.is_valid());
+ mln_precondition(win.is_valid());
+
+ return internal::tmms_hysteresis_dispatch(input, win,
+ c_min_low, c_min_high,
+ min_level, med_level,
+ max_level, pourcent);
}
- } // end of namespace mln::binarization::impl::generic
-
-
- template<typename I, typename W>
- mln_concrete(I)
- tmms_hysteresis_fastest(const Image<I>& input_, const Window<W>& win_,
- const mln_value(I)& c_min_low, const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent)
- {
- mln_trace("mln::binarization::impl::tmms_hysteresis_fastest");
-
- const I& input = exact(input_);
- const W& win = exact(win_);
-
- mln_precondition(input.is_valid());
- mln_precondition(win.is_valid());
-
- typedef mln_value(I) V;
-
- mln_concrete(I) dilation = mln::morpho::dilation(input, win);
- mln_concrete(I) erosion = mln::morpho::erosion(input, win);
-
- // Checking border sizes.
- border::resize(dilation, input.border());
- border::resize(erosion, input.border());
- mln_assertion(input.border() == dilation.border());
- mln_assertion(input.border() == erosion.border());
-
- mln_concrete(I) low_image;
- initialize(low_image, input);
- mln_concrete(I) high_image;
- initialize(high_image, input);
-
- unsigned nrows = geom::nrows(input);
- unsigned ncols = geom::ncols(input);
- for (unsigned row = 0; row < nrows; ++row)
- {
- const V *p_input = &(input.at_(row, 0));
- const V *p_dilation = &(dilation.at_(row, 0));
- const V *p_erosion = &(erosion.at_(row, 0));
- V *p_low_image = &(low_image.at_(row, 0));
- V *p_high_image = &(high_image.at_(row, 0));
-
- for (unsigned col = 0; col < ncols; ++col)
- {
- V dil = *p_dilation; // by def : dil>=ima>=ero
- V ero = *p_erosion;
- V ima = *p_input;
-
- if ((V)(dil - ero) < c_min_low)
- {
- *p_low_image = med_level;
- *p_high_image = med_level;
- }
- else if ((V)(dil - ero) < c_min_high)
- {
- *p_low_image = med_level;
-
- if ((V)(dil - ima) < (V)(pourcent * (dil - ero) / 100))
- *p_high_image = max_level;
- else
- *p_high_image = min_level;
- }
- else
- {
- if ((V)(dil - ima) < (V)(pourcent * (dil - ero) / 100))
- {
- *p_low_image = max_level;
- *p_high_image = max_level;
- }
- else
- {
- *p_low_image = min_level;
- *p_high_image = min_level;
- }
- }
-
- ++p_input;
- ++p_dilation;
- ++p_erosion;
- ++p_low_image;
- ++p_high_image;
- }
- }
-
- unsigned nlabels;
- mln_ch_value(I, unsigned)
- labels_high_images = mln::labeling::blobs(high_image, c4(), nlabels);
-
- std::vector<V> values(nlabels + 1);
-
- for(unsigned i = 0; i <= nlabels; ++i)
- values[i] = med_level;
-
- mln_piter(I) p(input.domain());
- for_all(p)
- if (low_image(p) != med_level)
- values[labels_high_images(p)] = low_image(p);
-
- for_all(p)
- if (low_image(p) == med_level)
- low_image(p) = values[labels_high_images(p)];
-
- return low_image;
- }
-
- }// end of namespace mln::binarization::impl
-
-
- // Dispatch
-
- namespace internal
- {
-
- template<typename I, typename W>
- mln_concrete(I)
- tmms_hysteresis_dispatch(const I& ima, const W& win,
- const mln_value(I)& c_min_low,
- const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent, mln::trait::image::speed::any)
- {
- return impl::generic::tmms_hysteresis(ima, win,
- c_min_low, c_min_high,
- min_level, med_level,
- max_level, pourcent);
- }
-
- template<typename I, typename W>
- mln_concrete(I)
- tmms_hysteresis_dispatch(const I& ima, const W& win,
- const mln_value(I)& c_min_low,
- const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent, mln::trait::image::speed::fastest)
- {
- return impl::tmms_hysteresis_fastest(ima, win,
- c_min_low, c_min_high,
- min_level, med_level,
- max_level, pourcent);
- }
-
- template<typename I, typename W>
- mln_concrete(I)
- tmms_hysteresis_dispatch(const I& ima, const W& win,
- const mln_value(I)& c_min_low,
- const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent)
- {
- return tmms_hysteresis_dispatch(ima, win,
- c_min_low, c_min_high,
- min_level, med_level,
- max_level, pourcent,
- mln_trait_image_speed(I)());
- }
-
- } //end of namespace namespace mln::binarization::internal
-
-
- // Facade
-
- template<typename I, typename W>
- mln_concrete(I)
- tmms_hysteresis(const Image<I>& input_, const Window<W>& win_,
- const mln_value(I)& c_min_low, const mln_value(I)& c_min_high,
- const mln_value(I)& min_level,
- const mln_value(I)& med_level,
- const mln_value(I)& max_level,
- const int pourcent)
- {
- mln_trace("mln::binarization::tmms_hysteresis");
-
- const I& input = exact(input_);
- const W& win = exact(win_);
-
- mln_precondition(input.is_valid());
- mln_precondition(win.is_valid());
-
- return internal::tmms_hysteresis_dispatch(input, win,
- c_min_low, c_min_high,
- min_level, med_level,
- max_level, pourcent);
- }
-
-# endif // ! MLN_INCLUDE_ONLY
-
- } // end of namespace mln::binarization
+#endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::binarization
} // end of namespace mln
--
1.7.10.4
1
0
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 next has been updated
via be96bce6673467409255e03efc46fe870dc440ec (commit)
via 9abe0474fce19a1d4485f4a15013a75233a91224 (commit)
via 119d678787063be2c907fbd4a3db977d5616d091 (commit)
from c75b4cfe1b9b94b2adbdd948964e37c341d9be65 (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 -----------------------------------------------------------------
No new revisions were added by this update.
-----------------------------------------------------------------------
Summary of changes:
milena/ChangeLog | 18 +++++++++++++++
milena/mln/test/positive.hh | 15 +++++++++----
milena/tests/pw/value.cc | 17 +++++---------
milena/tests/test/positive.cc | 49 +++++++++++++++++++++--------------------
4 files changed, 60 insertions(+), 39 deletions(-)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0