Commit a3170d32 authored by Nicolas Ballas's avatar Nicolas Ballas
Browse files

value_enc_image: Add a value encode procedure.

	* tests/core/value_enc_image.cc: Update tests.
	* mln/core/pset_array.hh: Add a missing methods.
	* mln/core/value_encode.hh: New, encode an image into a value_enc ima.
	* mln/core/value_enc_image.hh: Add range insertion method.
	* mln/core/rle_encode.hh: Update the Copyright.


git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@1938 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent e5ac7a5e
2008-05-07 Nicolas Ballas <ballas@lrde.epita.fr>
value_enc_image: Add a value encode procedure.
* tests/core/value_enc_image.cc: Update tests.
* mln/core/pset_array.hh: Add a missing methods.
* mln/core/value_encode.hh: New, encode an image into a value_enc ima.
* mln/core/value_enc_image.hh: Add range insertion method.
* mln/core/rle_encode.hh: Update the Copyright.
2008-05-07 Nicolas Ballas <ballas@lrde.epita.fr>
Update the quick image tours.
......
......@@ -181,6 +181,14 @@ namespace mln
return con_[i];
}
template <typename Pset>
inline
Pset&
pset_array<Pset>::operator[](unsigned i)
{
return con_[i];
}
# endif // ! MLN_INCLUDE_ONLY
......@@ -236,7 +244,6 @@ namespace mln
typedef typename Pset::fwd_piter pset_fwd_piter_;
const pset_array<Pset>* pset_;
pset_fwd_piter_ piter_;
unsigned pos_;
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 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
......
......@@ -30,7 +30,7 @@
/*! \file mln/core/value_enc_image.hh
*
* \brief FIXME
* \brief Define the class value_enc_image.
*/
# include <mln/core/internal/image_primary.hh>
......@@ -40,6 +40,7 @@
# include <mln/core/p_runs.hh>
# include <vector>
# include <mln/util/tracked_ptr.hh>
namespace mln
{
......@@ -51,7 +52,7 @@ namespace mln
namespace internal
{
/// \internal Data structure for \c mln::rle_image<P,T>.
/// \internal Data structure for \c mln::value_enc_image<P,T>.
template <typename P, typename T>
struct data_< value_enc_image<P, T> >
{
......@@ -94,7 +95,7 @@ namespace mln
/*! \brief Value encoded image.
* FIXME
* Associate a value to set of runs.
*/
template <typename P, typename T>
class value_enc_image :
......@@ -107,7 +108,7 @@ namespace mln
typedef T value;
typedef T& lvalue;
typedef const T rvalue;
typedef mln::value::set<T> vset;
typedef typename std::vector<T> vset;
/// Domain related typedefs
typedef pset_array_psite< runs_psite<P> > psite;
......@@ -118,13 +119,13 @@ namespace mln
value_enc_image();
/// Add a new range to the image.
void insert(const p_runs_<P>& pr, T value);
/// Add a new set of ranges to the image.
void insert(const p_runs_<P>& ps, T value);
/*! \brief Tell if the image has the given point site.
*
* \return True if the image has the point site, else false.
*/
/// Add a new range to the image
void insert(const p_run<P>& pr, T value);
/// Tell if the image has the given point site.
bool has(const psite& ps) const;
/// Read-only access to the image value located at the site \site.
......@@ -141,7 +142,6 @@ namespace mln
/// Give the definition domain.
const pset& domain() const;
};
......@@ -181,25 +181,50 @@ namespace mln
const typename value_enc_image<P, T>::vset&
value_enc_image<P, T>::values() const
{
return vset::the();
return this->data_->values_;
}
template <typename P, typename T>
inline
void
value_enc_image<P, T>::insert(const p_runs_<P>& pr, T value)
value_enc_image<P, T>::insert(const p_runs_<P>& ps, T value)
{
if (!this->has_data())
this->data_ = new internal::data_< value_enc_image<P,T> >();
this->data_->domain_.insert(pr);
this->data_->domain_.insert(ps);
this->data_->values_.push_back(value);
}
template <typename P, typename T>
inline
void
value_enc_image<P, T>::insert(const p_run<P>& pr, T value)
{
unsigned i = 0;
typename std::vector<T>::iterator it;
for (it = this->data_->values_.begin();
it != this->data_->values_.end() && *it != value;
++it)
++i;
if (it != this->data_->values_.end())
this->data_->domain_[i].insert(pr);
else
{
p_runs_<P> ps = p_runs_<P> ();
ps.insert(pr);
this->data_->domain_.insert(ps);
this->data_->values_.push_back(value);
}
}
template <typename P, typename T>
inline
bool
value_enc_image<P, T>::has(const typename value_enc_image<P, T>::psite& site) const
value_enc_image<P, T>::has(const typename value_enc_image<P, T>::psite& site)
const
{
return this->data_->domain_.has(site);
}
......@@ -207,7 +232,8 @@ namespace mln
template <typename P, typename T>
inline
typename value_enc_image<P, T>::rvalue
value_enc_image<P, T>::operator() (const typename value_enc_image<P, T>::psite& site)
value_enc_image<P, T>::operator() (const typename
value_enc_image<P, T>::psite& site)
const
{
mln_precondition(this->has(site));
......@@ -218,7 +244,8 @@ namespace mln
template <typename P, typename T>
inline
typename value_enc_image<P, T>::lvalue
value_enc_image<P, T>::operator() (const typename value_enc_image<P, T>::psite& site)
value_enc_image<P, T>::operator() (const typename
value_enc_image<P, T>::psite& site)
{
mln_precondition(this->has(site));
......@@ -240,3 +267,4 @@ namespace mln
#endif // ! MLN_CORE_VALUE_ENC_IMAGE_CC_
// Copyright (C) 2007, 2008 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_CORE_VALUE_ENCODE_HH_
# define MLN_CORE_VALUE_ENCODE_HH_
/*! \file mln/core/value_encode.hh
*
* \brief Definition of function which encodes an image in value_enc_image.
*/
# include <mln/core/value_enc_image.hh>
namespace mln
{
/*!
** encode an image class to a value_enc_image
**
** @param input has to respect the Image concept.
** The input image must be based on a regular grid.
** @param ignore_zero says if zero has to be considered as a valid value
**
** @return value_enc_image
*/
template <typename I>
value_enc_image<mln_point(I), mln_value(I)>
value_encode(const Image<I>& input, bool ignore_zero = true);
# ifndef MLN_INCLUDE_ONLY
/*!
** test if Point p1 and p2 are on the same line
*/
template <typename P>
inline
bool
on_the_same_line(const P& p1, const P& p2)
{
const unsigned dim = P::dim;
bool same_line = true;
for (unsigned n = 0; same_line && n < dim - 1; ++n)
same_line = (p1[n] == p2[n]);
return same_line;
}
template <typename I>
inline
value_enc_image<mln_point(I), mln_value(I)>
value_encode(const Image<I>& input, bool ignore_zero)
{
value_enc_image<mln_point(I), mln_value(I)> output;
const I& ima = exact(input);
mln_piter(I) p (exact(input).domain());
unsigned len = 0;
mln_point(I) rstart;
mln_value(I) rvalue;
for_all(p)
if (!ignore_zero || ima(p) != literal::zero || len)
{
if (len == 0)
{
++len;
rstart = p;
rvalue = ima(p);
}
else
if (rvalue == ima(p)
&& on_the_same_line(rstart, mln_point(I)(p)))
++len;
else
{
//FIXME is it right??
output.insert(p_run<mln_point(I)>(rstart, len), rvalue);
if ((len = (!ignore_zero || ima(p) != literal::zero)))
{
rstart = p;
rvalue = ima(p);
}
}
}
return output;
}
#endif // ! MLN_INCLUDE_ONLY
}
#endif // ! MLN_CORE_VALUE_ENCODE_HH_
......@@ -32,8 +32,32 @@
#include <mln/core/image2d.hh>
#include <mln/core/value_enc_image.hh>
#include <iostream>
#include <mln/value/int_u8.hh>
#include <mln/io/pgm/load.hh>
#include <mln/pw/all.hh>
#include <mln/core/neighb2d.hh>
#include <mln/labeling/blobs.hh>
#include <mln/level/transform.hh>
#include <mln/level/paste.hh>
#include <mln/level/compare.hh>
#include <mln/io/pgm/save.hh>
#include "tests/data.hh"
#include <mln/core/value_encode.hh>
struct fold_t : public mln::Function_v2v< fold_t >
{
typedef mln::value::int_u8 result;
result operator()(unsigned i) const
{
return i == 0 ? 0 : (i - 1) % 255 + 1;
}
};
int main()
{
......@@ -49,10 +73,12 @@ int main()
p_runs_<point2d> pruns2;
pruns0.insert(p_run<point2d>(make::point2d(0, 0), 2));
pruns1.insert(p_run<point2d>(make::point2d(2, 4), 7));
pruns1.insert(p_run<point2d>(make::point2d(18, 42), 5));
pruns1.insert(p_run<point2d>(make::point2d(50, 76), 2));
pruns1.insert(p_run<point2d>(make::point2d(17,40), 6));
pruns2.insert(p_run<point2d>(make::point2d(10,10), 5));
ima_type ima;
......@@ -74,4 +100,58 @@ int main()
i = 1;
}
}
/// Basic test two
{
typedef value_enc_image<point2d, int> ima_type;
ima_type ima;
ima.insert(p_run<point2d>(make::point2d(0, 0), 2), 0);
ima.insert(p_run<point2d>(make::point2d(10,10), 5), 2);
ima.insert(p_run<point2d>(make::point2d(2, 4), 7), 1);
ima.insert(p_run<point2d>(make::point2d(18, 42), 5), 1);
ima.insert(p_run<point2d>(make::point2d(50, 76), 2), 1);
ima.insert(p_run<point2d>(make::point2d(17,40), 6), 1);
mln_piter_(ima_type) piter (ima.domain());
int i = 0;
int nb = 0;
for_all(piter)
{
assert(ima(piter) == i);
++nb;
if (nb == 2)
i = 2;
if (nb == 7)
i = 1;
}
}
/// A third test
{
using value::int_u8;
image2d<int_u8> lena;
io::pgm::load(lena, MLN_IMG_DIR "/lena.pgm");
image2d<int_u8> cmp(lena.domain());
unsigned n;
image2d<unsigned> labels =
labeling::blobs((pw::value(lena) > pw::cst(172u)) | lena.domain(),
c4(), n);
value_enc_image<point2d, int_u8> val_enc =
value_encode(level::transform(labels, fold_t()));
level::fill(cmp, literal::zero);
level::paste(val_enc, cmp);
std::cout << val_enc.values().size() << std::endl;
mln_assertion(cmp == level::transform(labels, fold_t()));
//io::pgm::save(cmp, "output.pgm");
//io::pgm::save(level::transform(labels, fold_t()), "output2.pgm");
}
}
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