00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00029
00030 #include <mln/core/image/image2d.hh>
00031 #include <mln/labeling/blobs.hh>
00032 #include <mln/labeling/colorize.hh>
00033 #include <mln/value/rgb8.hh>
00034 #include <mln/io/ppm/save.hh>
00035
00036 #include <mln/io/pbm/load.hh>
00037 #include <mln/make/neighb2d.hh>
00038 #include <mln/make/double_neighb2d.hh>
00039
00040
00041
00042 template <typename N>
00043 void labelize(const mln::image2d<bool>& pic,
00044 const N& nbh,
00045 const std::string& filename)
00046 {
00047 using namespace mln;
00048 using value::rgb8;
00049 unsigned n;
00050 image2d<unsigned> lab = labeling::blobs(pic, nbh, n);
00051 image2d<rgb8> out = labeling::colorize(rgb8(), lab, n);
00052 io::ppm::save(out, filename);
00053 }
00054
00055
00056 bool chess(const mln::point2d& p)
00057 {
00058 return (p.row() + p.col()) % 2 == 0;
00059 }
00060
00061 bool top_right(const mln::point2d& p)
00062 {
00063 return p.col() >= p.row();
00064 }
00065
00066
00067 int main()
00068 {
00069 using namespace mln;
00070
00071 image2d<bool> pic = io::pbm::load("drawing.pbm");
00072
00073
00074
00075
00076 labelize(pic, c4(), "c4.ppm");
00077 labelize(pic, c8(), "c8.ppm");
00078
00079
00080
00081
00082 bool horiz[] = { 0, 0, 0,
00083 1, 0, 1,
00084 0, 0, 0 };
00085 labelize(pic, make::neighb2d(horiz), "c2.ppm");
00086
00087
00088
00089
00090 bool tilt[] = { 1, 1, 0,
00091 0, 0, 0,
00092 0, 1, 1 };
00093 labelize(pic, make::neighb2d(tilt), "cZ.ppm");
00094
00095
00096
00097
00098 bool nbh1[] = { 1, 1, 0,
00099 1, 0, 1,
00100 0, 1, 1 };
00101
00102 bool nbh2[] = { 0, 1, 1,
00103 1, 0, 1,
00104 1, 1, 0 };
00105 labelize(pic, make::double_neighb2d(chess, nbh1, nbh2), "c6.ppm");
00106
00107
00108
00109
00110 labelize(pic, make::double_neighb2d(top_right, nbh1, nbh2), "cX.ppm");
00111 }