Commit 8fe3e89f authored by Thierry Geraud's avatar Thierry Geraud
Browse files

Add a canvas to milena.

	* mln/level/median.hh (impl::median): Rename as...
	(impl::median_as_procedure): ...this.
	(impl::median_functor, impl::median): New.
	* mln/canvas: New.
	* mln/canvas/sbrowsing.hh: New.


git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@1012 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent 990bbc6a
2007-07-13 Thierry Geraud <thierry.geraud@lrde.epita.fr>
Add a canvas to milena.
* mln/level/median.hh (impl::median): Rename as...
(impl::median_as_procedure): ...this.
(impl::median_functor, impl::median): New.
* mln/canvas: New.
* mln/canvas/sbrowsing.hh: New.
2007-07-13 Thierry Geraud <thierry.geraud@lrde.epita.fr>
Add pixel in milena.
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License version 2 as published by the
// Free Software Foundation.
//
// This library 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 this library; see the file COPYING. If not, write to
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
// Boston, MA 02111-1307, USA.
//
// As a special exception, you may use this file as part of a free
// software library 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_CANVAS_SBROWSING_HH
# define MLN_CANVAS_SBROWSING_HH
/*! \file mln/canvas/sbrowsing.hh
*
* \brief Sbrowsing of an image.
*/
# include <mln/core/dpoint2d.hh> // for "up"
namespace mln
{
namespace canvas
{
/*! FIXME: Doc!
*
*
* F should be
* {
* input; p; --- attributes
* void init();
* void down(); void fwd(); void bkd(); --- methods
* }
*/
template <typename F>
void sbrowsing(F& f);
# ifndef MLN_INCLUDE_ONLY
template <typename F>
void sbrowsing(F& f)
{
mln_precondition(f.input.has_data());
int
min_row = f.input.min_row(), max_row = f.input.max_row(),
min_col = f.input.min_col(), max_col = f.input.max_col();
// p
f.p = f.input.domain().pmin() + up;
int& row = f.p.row();
int& col = f.p.col();
// initialization
f.init();
bool fwd = true;
for (row = min_row; row <= max_row; ++row)
{
// go down
f.down();
if (fwd)
// browse line fwd
while (col < max_col)
{
++col;
f.fwd();
}
else
// browse line bkd
while (col > min_col)
{
--col;
f.bkd();
}
// change browsing
fwd = ! fwd;
}
}
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::canvas
} // end of namespace mln
#endif // ! MLN_CANVAS_SBROWSING_HH
......@@ -37,6 +37,8 @@
# include <mln/core/window2d.hh>
# include <mln/accu/median.hh>
# include <mln/canvas/sbrowsing.hh>
namespace mln
{
......@@ -65,9 +67,9 @@ namespace mln
{
template <typename I, typename W, typename O>
void median(const I& input,
const W& win,
O& output)
void median_as_procedure(const I& input,
const W& win,
O& output)
{
mln_precondition(input.has_data());
mln_precondition(output.has_data());
......@@ -146,6 +148,91 @@ namespace mln
}
}
template <typename I, typename W, typename O>
struct median_functor
{
// i/o
const I& input;
const W& win;
O& output;
// aux data
mln_point(I) p;
window2d win_fp, win_fm, win_bp, win_bm, win_dp, win_dm;
mln_qiter(W) q_fp, q_fm, q_bp, q_bm, q_dp, q_dm;
accu::median_on<mln_value(I)> med;
// ctor
median_functor(I& input_, const W& win_, O& output_)
:
// i/o
input(exact(input_)),
win(exact(win_)),
output(exact(output_)),
// aux data
p(),
win_fp(win - (win + left)), win_fm((win + left) - win),
win_bp(win - (win + right)), win_bm((win + right) - win),
win_dp(win - (win + up)), win_dm((win + up) - win),
q_fp(win_fp, p), q_fm(win_fm, p),
q_bp(win_bp, p), q_bm(win_bm, p),
q_dp(win_dp, p), q_dm(win_dm, p)
{
}
// parts
void init()
{
med.init();
mln_qiter(W) q(win, p);
for_all(q) if (input.has(q))
med.take(input(q));
}
void down()
{
for_all(q_dm) if (input.has(q_dm))
med.untake(input(q_dm));
for_all(q_dp) if (input.has(q_dp))
med.take(input(q_dp));
output(p) = med;
}
void fwd()
{
for_all(q_fm) if (input.has(q_fm))
med.untake(input(q_fm));
for_all(q_fp) if (input.has(q_fp))
med.take(input(q_fp));
output(p) = med;
}
void bkd()
{
for_all(q_bm) if (input.has(q_bm))
med.untake(input(q_bm));
for_all(q_bp) if (input.has(q_bp))
med.take(input(q_bp));
output(p) = med;
}
}; // end of median_functor
template <typename I, typename W, typename O>
void median(I& input, const W& win, O& output)
{
// FIXME: resize border!
impl::median_functor<I,W,O> f(input, win, output);
canvas::sbrowsing(f);
}
} // end of namespace mln::level::impl
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment