* src/Makefile.am: Add debug as subdir.
* src/debug/Makefile.am,
* src/debug/show_left_right_links_validation.cc,
* src/debug/show_link_single_left.cc,
* src/debug/show_link_single_right.cc,
* src/debug/show_objects_large.cc,
* src/debug/show_objects_small.cc,
* src/debug/show_objects_thin.cc: New.
---
scribo/ChangeLog | 14 +++
scribo/src/Makefile.am | 1 +
scribo/src/debug/Makefile.am | 36 ++++++
.../src/debug/show_left_right_links_validation.cc | 122 ++++++++++++++++++++
scribo/src/debug/show_link_single_left.cc | 117 +++++++++++++++++++
scribo/src/debug/show_link_single_right.cc | 117 +++++++++++++++++++
scribo/src/debug/show_objects_large.cc | 84 ++++++++++++++
scribo/src/debug/show_objects_small.cc | 84 ++++++++++++++
8 files changed, 575 insertions(+), 0 deletions(-)
create mode 100644 scribo/src/debug/Makefile.am
create mode 100644 scribo/src/debug/show_left_right_links_validation.cc
create mode 100644 scribo/src/debug/show_link_single_left.cc
create mode 100644 scribo/src/debug/show_link_single_right.cc
create mode 100644 scribo/src/debug/show_objects_large.cc
create mode 100644 scribo/src/debug/show_objects_small.cc
create mode 100644 scribo/src/debug/show_objects_thin.cc
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 6a97f58..2668fd4 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,5 +1,19 @@
2009-10-01 Guillaume Lazzara <z(a)lrde.epita.fr>
+ New debugging tools for Scribo.
+
+ * src/Makefile.am: Add debug as subdir.
+
+ * src/debug/Makefile.am,
+ * src/debug/show_left_right_links_validation.cc,
+ * src/debug/show_link_single_left.cc,
+ * src/debug/show_link_single_right.cc,
+ * src/debug/show_objects_large.cc,
+ * src/debug/show_objects_small.cc,
+ * src/debug/show_objects_thin.cc: New.
+
+2009-10-01 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Few improvements in Scribo.
* debug/usage.hh: Improve output.
diff --git a/scribo/src/Makefile.am b/scribo/src/Makefile.am
index aa82499..6cc4229 100644
--- a/scribo/src/Makefile.am
+++ b/scribo/src/Makefile.am
@@ -21,6 +21,7 @@ include $(top_srcdir)/scribo/scribo.mk
SUBDIRS = \
binarization \
+ debug \
primitive \
filter \
misc \
diff --git a/scribo/src/debug/Makefile.am b/scribo/src/debug/Makefile.am
new file mode 100644
index 0000000..1d396a5
--- /dev/null
+++ b/scribo/src/debug/Makefile.am
@@ -0,0 +1,36 @@
+# Copyright (C) 2009 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/>.
+#
+
+## Process this file through Automake to create Makefile.in.
+
+include $(top_srcdir)/scribo/scribo.mk
+
+bin_PROGRAMS = \
+ show_objects_large \
+ show_left_right_links_validation \
+ show_link_single_left \
+ show_link_single_right \
+ show_objects_small \
+ show_objects_thin
+
+
+show_objects_large_SOURCES = show_objects_large.cc
+show_left_right_links_validation_SOURCES = show_left_right_links_validation.cc
+show_link_single_left_SOURCES = show_link_single_left.cc
+show_link_single_right_SOURCES = show_link_single_right.cc
+show_objects_small_SOURCES = show_objects_small.cc
+show_objects_thin_SOURCES = show_objects_thin.cc
diff --git a/scribo/src/debug/show_left_right_links_validation.cc
b/scribo/src/debug/show_left_right_links_validation.cc
new file mode 100644
index 0000000..bb23dd5
--- /dev/null
+++ b/scribo/src/debug/show_left_right_links_validation.cc
@@ -0,0 +1,122 @@
+// Copyright (C) 2009 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.
+
+#include <iostream>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/labeling/colorize.hh>
+#include <mln/debug/println.hh>
+#include <mln/data/convert.hh>
+#include <mln/util/array.hh>
+#include <mln/literal/colors.hh>
+#include <mln/io/pbm/load.hh>
+#include <mln/io/ppm/save.hh>
+#include <mln/core/alias/neighb2d.hh>
+#include <mln/value/label_16.hh>
+
+#include <scribo/core/object_links.hh>
+#include <scribo/core/object_image.hh>
+
+#include <scribo/primitive/extract/objects.hh>
+
+#include <scribo/primitive/link/with_single_left_link.hh>
+#include <scribo/primitive/link/with_single_right_link.hh>
+#include <scribo/primitive/link/merge_double_link.hh>
+
+#include <scribo/draw/bounding_boxes.hh>
+#include <scribo/draw/bounding_box_links.hh>
+
+#include <scribo/debug/usage.hh>
+
+
+
+const char *args_desc[][2] =
+{
+ { "input.pbm", "A binary image. 'True' for objects,
'False'\
+for the background." },
+ { "hlmax", "Maximum distance between two grouped objects while browsing
on the left." },
+ { "hrmax", "Maximum distance between two grouped objects while browsing
on the right." },
+ {0, 0}
+};
+
+int main(int argc, char *argv[])
+{
+ using namespace scribo;
+ using namespace mln;
+
+ if (argc != 5)
+ return scribo::debug::usage(argv,
+ "Display double validated (left and right) links between objects",
+ "<input.pbm> <hlmax> <hrmax> <output.ppm>",
+ args_desc,
+ "A color image. Validated links are drawn in green.");
+
+ image2d<bool> input;
+ io::pbm::load(input, argv[1]);
+
+ // Finding objects.
+ value::label_16 nbboxes;
+ typedef image2d<value::label_16> L;
+ object_image(L) objects = primitive::extract::objects(input, c8(), nbboxes);
+
+ // Left links.
+ object_links<L> left_link
+ = primitive::link::with_single_left_link(objects, atoi(argv[2]));
+
+ // Right links.
+ object_links<L> right_link
+ = primitive::link::with_single_right_link(objects, atoi(argv[3]));
+
+ // Validation.
+ object_links<L>
+ links = primitive::link::merge_double_link(objects, left_link, right_link);
+
+
+ // Saving result.
+ image2d<value::rgb8> output = data::convert(value::rgb8(), input);
+
+// scribo::draw::bounding_boxes(output, objects, literal::blue);
+ scribo::draw::bounding_box_links(output,
+ objects.bboxes(),
+ links,
+ literal::green);
+
+ util::array<bool> drawn(objects.nlabels(), 0);
+ for_all_components(i, objects.bboxes())
+ if (links[i] == i && ! drawn(i))
+ {
+ mln::draw::box(output, objects.bbox(i), literal::orange);
+ drawn[i] = true;
+ }
+ else
+ {
+ mln::draw::box(output, objects.bbox(i), literal::blue);
+ mln::draw::box(output, objects.bbox(links[i]), literal::blue);
+ drawn[i] = true;
+ drawn[links[i]] = true;
+ }
+
+ io::ppm::save(output, argv[4]);
+}
diff --git a/scribo/src/debug/show_link_single_left.cc
b/scribo/src/debug/show_link_single_left.cc
new file mode 100644
index 0000000..a8b42f2
--- /dev/null
+++ b/scribo/src/debug/show_link_single_left.cc
@@ -0,0 +1,117 @@
+// Copyright (C) 2009 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.
+
+#include <iostream>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/neighb2d.hh>
+
+#include <mln/data/convert.hh>
+
+#include <mln/value/rgb8.hh>
+#include <mln/value/label_16.hh>
+#include <mln/literal/colors.hh>
+
+#include <mln/io/pbm/load.hh>
+#include <mln/io/ppm/save.hh>
+
+#include <scribo/primitive/extract/objects.hh>
+#include <scribo/primitive/link/with_single_left_link.hh>
+
+#include <scribo/draw/bounding_boxes.hh>
+
+#include <scribo/debug/save_linked_bboxes_image.hh>
+#include <scribo/debug/usage.hh>
+
+
+
+const char *args_desc[][2] =
+{
+ { "input.pbm", "A binary image. True for objects and False for the
background." },
+ { "max_nbh_dist", " Maximum distance for neighborhood search. (common
value : 30)" },
+ {0, 0}
+};
+
+
+int main(int argc, char* argv[])
+{
+ using namespace scribo;
+ using namespace scribo::primitive::internal;
+ using namespace mln;
+
+ if (argc != 4)
+ return scribo::debug::usage(argv,
+ "Show sucessful/unsuccessful left links between components.",
+ "input.pbm max_nbh_dist output.ppm",
+ args_desc,
+ "A color image. Valid links are drawn in green, invalid ones in red.");
+
+ image2d<bool> input;
+ io::pbm::load(input, argv[1]);
+
+ // Finding objects.
+ value::label_16 nbboxes;
+ typedef image2d<value::label_16> L;
+ object_image(L) objects
+ = scribo::primitive::extract::objects(input, c8(), nbboxes);
+
+ // Finding left links.
+ object_links<L> left_link
+ = primitive::link::with_single_left_link(objects, atoi(argv[2]));
+
+
+
+ // Preparing output image.
+ image2d<value::rgb8> output = data::convert(value::rgb8(), input);
+ scribo::draw::bounding_boxes(output, objects, literal::blue);
+
+
+ // Drawing links.
+ mln::util::array<mln_result_(accu::center<mln_psite_(L)>)>
+ mass_centers = labeling::compute(accu::meta::center(),
+ objects, objects.nlabels());
+
+ for_all_ncomponents(i, objects.nlabels())
+ {
+ unsigned midcol = (objects.bbox(i).pmax().col()
+ - objects.bbox(i).pmin().col()) / 2;
+ int dmax = midcol + atoi(argv[2]);
+ mln_site_(L) c = mass_centers(i);
+
+ mln_site_(L) p = c + mln::left;
+
+ while (is_invalid_link(objects, left_link, p, i, c, dmax))
+ {
+ if (left_link[i] != i)
+ output(p) = literal::green;
+ else
+ output(p) = literal::red;
+ --p.col();
+ }
+
+ }
+
+ io::ppm::save(output, argv[3]);
+}
diff --git a/scribo/src/debug/show_link_single_right.cc
b/scribo/src/debug/show_link_single_right.cc
new file mode 100644
index 0000000..5f1001a
--- /dev/null
+++ b/scribo/src/debug/show_link_single_right.cc
@@ -0,0 +1,117 @@
+// Copyright (C) 2009 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.
+
+#include <iostream>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/neighb2d.hh>
+
+#include <mln/data/convert.hh>
+
+#include <mln/value/rgb8.hh>
+#include <mln/value/label_16.hh>
+#include <mln/literal/colors.hh>
+
+#include <mln/io/pbm/load.hh>
+#include <mln/io/ppm/save.hh>
+
+#include <scribo/primitive/extract/objects.hh>
+#include <scribo/primitive/link/with_single_right_link.hh>
+
+#include <scribo/draw/bounding_boxes.hh>
+
+#include <scribo/debug/save_linked_bboxes_image.hh>
+#include <scribo/debug/usage.hh>
+
+
+
+const char *args_desc[][2] =
+{
+ { "input.pbm", "A binary image. True for objects and False for the
background." },
+ { "max_nbh_dist", " Maximum distance for neighborhood search. (common
value : 30)" },
+ {0, 0}
+};
+
+
+int main(int argc, char* argv[])
+{
+ using namespace scribo;
+ using namespace scribo::primitive::internal;
+ using namespace mln;
+
+ if (argc != 4)
+ return scribo::debug::usage(argv,
+ "Show sucessful/unsuccessful right links between components.",
+ "input.pbm max_nbh_dist output.ppm",
+ args_desc,
+ "A color image. Valid links are drawn in green, invalid ones in red.");
+
+ image2d<bool> input;
+ io::pbm::load(input, argv[1]);
+
+ // Finding objects.
+ value::label_16 nbboxes;
+ typedef image2d<value::label_16> L;
+ object_image(L) objects
+ = scribo::primitive::extract::objects(input, c8(), nbboxes);
+
+ // Finding right links.
+ object_links<L> right_link
+ = primitive::link::with_single_right_link(objects, atoi(argv[2]));
+
+
+
+ // Preparing output image.
+ image2d<value::rgb8> output = data::convert(value::rgb8(), input);
+ scribo::draw::bounding_boxes(output, objects, literal::blue);
+
+
+ // Drawing links.
+ mln::util::array<mln_result_(accu::center<mln_psite_(L)>)>
+ mass_centers = labeling::compute(accu::meta::center(),
+ objects, objects.nlabels());
+
+ for_all_ncomponents(i, objects.nlabels())
+ {
+ unsigned midcol = (objects.bbox(i).pmax().col()
+ - objects.bbox(i).pmin().col()) / 2;
+ int dmax = midcol + atoi(argv[2]);
+ mln_site_(L) c = mass_centers(i);
+
+ mln_site_(L) p = c + mln::right;
+
+ while (is_invalid_link(objects, right_link, p, i, c, dmax))
+ {
+ if (right_link[i] != i)
+ output(p) = literal::green;
+ else
+ output(p) = literal::red;
+ ++p.col();
+ }
+
+ }
+
+ io::ppm::save(output, argv[3]);
+}
diff --git a/scribo/src/debug/show_objects_large.cc
b/scribo/src/debug/show_objects_large.cc
new file mode 100644
index 0000000..aac7a9f
--- /dev/null
+++ b/scribo/src/debug/show_objects_large.cc
@@ -0,0 +1,84 @@
+// Copyright (C) 2009 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.
+
+#include <iostream>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/neighb2d.hh>
+
+#include <mln/data/convert.hh>
+
+#include <mln/value/label_16.hh>
+#include <mln/value/rgb8.hh>
+#include <mln/literal/colors.hh>
+
+#include <mln/io/pbm/load.hh>
+#include <mln/io/ppm/save.hh>
+
+#include <scribo/primitive/extract/objects.hh>
+#include <scribo/filter/objects_large.hh>
+#include <scribo/draw/bounding_boxes.hh>
+#include <scribo/debug/usage.hh>
+
+
+const char *args_desc[][2] =
+{
+ { "input.pbm", "A binary image. True for objects and False for the
background." },
+ { "max_card", " Maximum cardinality in a component." },
+ {0, 0}
+};
+
+
+int main(int argc, char *argv[])
+{
+ using namespace mln;
+
+ if (argc != 4)
+ return scribo::debug::usage(argv,
+ "Show components having a too high cardinality.",
+ "input.pbm min_card output.ppm",
+ args_desc,
+ "A color image. Components with high cardinality have their bounding boxes drawn
in red, others in green.");
+
+ trace::entering("main");
+
+ image2d<bool> input;
+ io::pbm::load(input, argv[1]);
+
+ value::label_16 nbboxes;
+ typedef image2d<value::label_16> L;
+ object_image(L) objects
+ = scribo::primitive::extract::objects(input, c8(), nbboxes);
+
+
+ image2d<value::rgb8> output = data::convert(value::rgb8(), input);
+ scribo::draw::bounding_boxes(output, objects, literal::red);
+
+ object_image(L) filtered_objects
+ = scribo::filter::objects_large(objects, atoi(argv[2]));
+ scribo::draw::bounding_boxes(output, filtered_objects, literal::green);
+
+ io::ppm::save(output, argv[3]);
+}
diff --git a/scribo/src/debug/show_objects_small.cc
b/scribo/src/debug/show_objects_small.cc
new file mode 100644
index 0000000..a5afb26
--- /dev/null
+++ b/scribo/src/debug/show_objects_small.cc
@@ -0,0 +1,84 @@
+// Copyright (C) 2009 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.
+
+#include <iostream>
+
+#include <mln/core/image/image2d.hh>
+#include <mln/core/alias/neighb2d.hh>
+
+#include <mln/data/convert.hh>
+
+#include <mln/value/label_16.hh>
+#include <mln/value/rgb8.hh>
+#include <mln/literal/colors.hh>
+
+#include <mln/io/pbm/load.hh>
+#include <mln/io/ppm/save.hh>
+
+#include <scribo/primitive/extract/objects.hh>
+#include <scribo/filter/objects_small.hh>
+#include <scribo/draw/bounding_boxes.hh>
+#include <scribo/debug/usage.hh>
+
+
+const char *args_desc[][2] =
+{
+ { "input.pbm", "A binary image. True for objects and False for the
background." },
+ { "min_card", " Minimum cardinality in a component.. (Common value :
6)" },
+ {0, 0}
+};
+
+
+int main(int argc, char *argv[])
+{
+ using namespace mln;
+
+ if (argc != 4)
+ return scribo::debug::usage(argv,
+ "Show components having a too low cardinality.",
+ "input.pbm min_card output.ppm",
+ args_desc,
+ "A color image. Components with low cardinality have their bounding boxes drawn
in red, others in green.");
+
+ trace::entering("main");
+
+ image2d<bool> input;
+ io::pbm::load(input, argv[1]);
+
+ value::label_16 nbboxes;
+ typedef image2d<value::label_16> L;
+ object_image(L) objects
+ = scribo::primitive::extract::objects(input, c8(), nbboxes);
+
+
+ image2d<value::rgb8> output = data::convert(value::rgb8(), input);
+ scribo::draw::bounding_boxes(output, objects, literal::red);
+
+ object_image(L) filtered_objects
+ = scribo::filter::objects_small(objects, atoi(argv[2]));
+ scribo::draw::bounding_boxes(output, filtered_objects, literal::green);
+
+ io::ppm::save(output, argv[3]);
+}
diff --git a/scribo/src/debug/show_objects_thin.cc
b/scribo/src/debug/show_objects_thin.cc
new file mode 100644
index 0000000..e69de29
--
1.5.6.5