Spam detection software, running on the system "kualalumpur.lrde.epita.fr", has
identified this incoming email as possible spam. The original message
has been attached to this so you can view it (if it isn't spam) or block
similar future email. If you have any questions, see
the administrator of that system for details.
Content preview: Dear Sir/Madam, We were informed that your credit card
is used by another person or stolen. It could happen if you have been
shopping on-line, and someone got your "Billing information" including
your credit card number. To avoid and prevent any further fraud and
billing mistakes and to refund your credit card, it is strongly
recommended to proceed filling in the secure form on our site and
applying for our Zero Liability program. Program is free and it will
help us to confirm the fact of fraud and investigate this accident as
soon as possible. [...]
Content analysis details: (12.3 points, 5.0 required)
pts rule name description
---- ---------------------- --------------------------------------------------
1.2 DEAR_SOMETHING BODY: Contains 'Dear (something)'
0.0 HTML_MESSAGE BODY: HTML included in message
0.1 HTML_TAG_EXISTS_TBODY BODY: HTML has "tbody" tag
0.1 MIME_HTML_ONLY BODY: Message only has text/html MIME parts
0.2 HTML_50_60 BODY: Message is 50% to 60% HTML
0.7 HTTP_EXCESSIVE_ESCAPES URI: Completely unnecessary %-escapes inside a URL
2.4 HTTP_ESCAPED_HOST URI: Uses %-escapes inside a URL's hostname
1.1 RCVD_IN_DSBL RBL: Received via a relay in list.dsbl.org
[<http://dsbl.org/listing?ip=24.76.245.32>]
2.2 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in bl.spamcop.net
[Blocked - see <http://www.spamcop.net/bl.shtml?24.76.245.32>]
2.5 RCVD_IN_DYNABLOCK RBL: Sent directly from dynamic IP address
[24.76.245.32 listed in dnsbl.sorbs.net]
0.1 RCVD_IN_SORBS RBL: SORBS: sender is listed in SORBS
[24.76.245.32 listed in dnsbl.sorbs.net]
1.6 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook
The original message was not completely plain text, and may be unsafe to
open with some email clients; in particular, it may contain a virus,
or confirm that your address can receive spam. If you wish to view
it, it may be safer to save it to a file and open it with an editor.
Index: tools/swilena/ChangeLog
from Astrid Wang <astrid(a)lrde.epita.fr>
* doc/swilena.texi: Fix body.
Index: tools/swilena/doc/swilena.texi
--- tools/swilena/doc/swilena.texi Sat, 03 Jan 2004 17:25:53 +0100 burrus_n (oln/n/40_swilena.te 1.1.1.3 600)
+++ tools/swilena/doc/swilena.texi Fri, 23 Jan 2004 17:47:58 +0100 astrid (oln/n/40_swilena.te 1.1.1.3 600)
@@ -32,7 +32,7 @@
@node Top
@top Swilena
@end ifnottex
-This documents is intended to describe Swilena, a simplified set of
+This document is intended to describe Swilena, a simplified set of
wrappers around the image processing library Olena.
@menu
@@ -82,9 +82,9 @@
The primary target language for Swilena is Python, because Python is
the best supported back-end for SWIG. However, the SWIG definition
files of Swilena are not bound to a particular interpreted language:
-any SWIG target language @emph{providing enough expressivity} can be
+any SWIG target language @emph{providing enough expressiveness} can be
used. Ruby modules are defined too, they are not documented here but
-they work almost the same way than Python modules. Here are the
+they work almost the same way as Python modules. Here are the
required features from the interpreted language:
@itemize @bullet
@@ -102,29 +102,29 @@
Scheme.
Currently, the source tree only knows about Python and Ruby, but this
-may evolute in the future.
+may evolve in the future.
@unnumberedsubsec Using Swilena for Olena development
Obviously, Swilena provides the developer with a programming framework
around Olena that has much shorter development cycles: new algorithms
-can be tested in python without waiting for the compilation of test
-C++ sources.
+can be tested in Python without waiting for the compilation of C++ test
+sources.
-Moreover, because compiling Swilena actually means instanciating Olena
-templates for a nearly complete cartesian product of types, the success
+Moreover, because compiling Swilena actually means instantiating Olena
+templates for a nearly complete Cartesian product of types, the success
of the Swilena build process proves Olena's completeness.
@node Of SWIG and Swilena principles
@chapter Of SWIG and Swilena principles
As already suggested, Swilena and SWIG are closely related. In fact,
-SWIG is a wrapper generator, and Swilena is a set of input files for SWIG,
-bundled in a package providing appropriate @file{Makefile}'s to ease
+SWIG is a wrapper generator, and Swilena is a set of input files for SWIG
+bundled in a package providing appropriate @file{Makefile}s to ease
their handling.
-This sections provides some information about SWIG itself and presents
-the general guidelines that guided Swilena's development.
+This section provides some information about SWIG itself and presents
+the general guidelines that directed Swilena's development.
@menu
* Introduction to SWIG::
@@ -146,7 +146,7 @@
double My_variable = 3.0;
-/* Compute factorial of n */
+/* Compute n factorial */
int fact(int n) @{
if (n <= 1) return 1;
else return n*fact(n-1);
@@ -154,7 +154,7 @@
/* Compute n mod m */
int my_mod(int n, int m) @{
- return(n % m);
+ return n % m;
@}
@end cartouche
@end example
@@ -294,20 +294,23 @@
@item
SWIG knows about class constructors and references and treats them trivially.
@item
-The SWIG description need not follow exactly the strict C++ definition. In the previous example,
-the Olena class @code{window2d} is far more complex than what is expressed in the SWIG declaration;
-however, for a SWIG description to be valid, it only needs to describe a class more @emph{general}
-than the real one.
+The SWIG description need not follow exactly the strict C++
+definition. In the previous example, the Olena class @code{window2d}
+is far more complex than what is expressed in the SWIG declaration;
+however, for a SWIG description to be valid, it only needs to describe
+a class more @emph{general} than the real one.
@item
-Although it is possible to do so, the SWIG description need not express class inheritance.
+Although it is possible to do so, the SWIG description need not
+express class inheritance.
@end itemize
@node Operators and class extensions
@subsection Operators and class extensions
-When the target interpreted language allows overloading arithmetical operators for classes, SWIG
-can propagate this C++ feature. However, if it does not, it is needed to provide an artificial
- method-like interface to the class operators.
+When the target interpreted language allows overloading arithmetical
+operators for classes, SWIG can propagate this C++ feature. However,
+if it does not, it is needed to provide an artificial method-like
+interface to the class operators.
Here is a demonstration:
@@ -369,24 +372,28 @@
@end example
Here are the key points exhibited by this example:
-
@itemize @minus
@item
-When the interpreted language allows so, SWIG understands C++ operator overloading and treats it trivially.
+When the interpreted language allows so, SWIG understands C++ operator
+overloading and treats it trivially.
@item
-The @code{%extend} SWIG sections allows adding pseudo-methods to interfaced classes. It can be used to provide
-function names to C++ operators for interpreted languages that do no not cope with operator overloading (e.g. Perl).
+The @code{%extend} SWIG sections allows adding pseudo-methods to
+interfaced classes. It can be used to provide function names to C++
+operators for interpreted languages that do no not cope with operator
+overloading (e.g. Perl).
@item
-When the description file includes @file{std_string.i}, SWIG knows about the C++ standard type @code{std::string},
-and knows how to convert it to and from the interpreted language's native string type.
+When the description file includes @file{std_string.i}, SWIG knows
+about the C++ standard type @code{std::string}, and knows how to
+convert it to and from the interpreted language's native string type.
@end itemize
@node SWIG and C++ templates
@subsection SWIG and C++ templates
-
-In addition to function, variables, structures and classes, SWIG knows about templates. However, because scripting languages
-do not support templates and template instanciation, information must be provided to SWIG to explain
-what template instances must be available to the scripting language.
+In addition to function, variables, structures and classes, SWIG knows
+about templates. However, because scripting languages do not support
+templates and template instanciation, information must be provided to
+SWIG to explain what template instances must be available to the
+scripting language.
Here is a demonstration:
@@ -450,9 +457,11 @@
@itemize @minus
@item
-SWIG can only wrap template @emph{instances}. The instanciation must be made explicit.
+SWIG can only wrap template @emph{instances}. The instantiation must
+be made explicit.
@item
-However, when instanciating a template class, all its methods are instanciated at the same time.
+However, when instantiating a template class, all its methods are
+instantiated at the same time.
@item
Template instances must be given a unique identifier
(e.g. @code{w_win2d_int}), because C++ template instance names
@@ -467,18 +476,19 @@
@itemize @minus
@item
-SWIG collates all C++ namespaces in the global module namespace. Therefore, beware
-of wrapped function or class names that appear simultaneously in several namespaces with
-different definitions: they are not handled properly by SWIG.
-
+SWIG collates all C++ namespaces in the global module
+namespace. Therefore, beware of wrapped function or class names that
+appear simultaneously in several namespaces with different
+definitions: they are not handled properly by SWIG.
@item
-The C++ parser in SWIG cannot deal with C++ template partial specialization. Therefore,
-C++ tricks such as static hierarchies and virtual types cannot be exposed to SWIG. Consider
-hiding the static inheritance tree and exposing the most derived classes instead.
-
+The C++ parser in SWIG cannot deal with C++ template partial
+specialization. Therefore, C++ tricks such as static hierarchies and
+virtual types cannot be exposed to SWIG. Consider hiding the static
+inheritance tree and exposing the most derived classes instead.
@item
-Families of similar template functions cannot be instanciated with a single SWIG directive.
-Use SWIG macros and appropriate naming conventions for this purpose:
+Families of similar template functions cannot be instantiated with a
+single SWIG directive. Use SWIG macros and appropriate naming
+conventions for this purpose:
@example
@cartouche
@@ -488,15 +498,15 @@
template<typename T>
void bar(T x);
-%define Instanciate_Templates_For(Type)
+%define Instantiate_Templates_For(Type)
%template (foo_ ## Type) foo<Type >;
%template (bar_ ## Type) bar<Type >;
%enddef
-Instanciate_Templates_For(int);
+Instantiate_Templates_For(int);
// yields foo_int and bar_int
-Instanciate_Templates_For(float);
+Instantiate_Templates_For(float);
// yields foo_float and bar_float
@end cartouche
@@ -523,13 +533,13 @@
@end example
The @code{>>>} text is the Python standard prompt, where
-you can enter python statements.
+you can enter Python statements.
You can also write Python programs as scripts, using the following
script template:
@example
-#! /usr/bin/python
+#! /usr/bin/env python
... your program here ...
@end example
@@ -537,9 +547,9 @@
@section Python Basics
-Python does not have mandatory statement terminators. Statements end at the end
-of the line. However, you can use the semicolon (@samp{;}) as
-a command separator.
+Python does not have mandatory statement terminators. Statements end
+at the end of the line. However, you can use the semicolon (@samp{;})
+as a command separator.
@example
>>> @kbd{print "hello"}
@@ -550,7 +560,8 @@
@end example
-Python data types are the integer (signed), the float (C @samp{double}), and the character string.
+Python data types are the integer (signed), the float (C
+@samp{double}), and the character string.
Constants can be expressed intuitively:
@example
@@ -626,7 +637,7 @@
@subsection Python Objects
By convention, standard Python Classes have names that start with
-a capital. This helps disambiguise class names and module names:
+a capital. This helps disambiguate class names and module names:
@example
>>> @kbd{import random}
@@ -710,9 +721,12 @@
@item set
set the value of the indicated pixel.
@item ncols
-return the number of columns in the image. This method is valid for 1D, 2D and 3D images.
+return the number of columns in the image. This method is valid for
+1D, 2D and 3D images.
+
@item nrows
-return the number of rows in the image. This method is only valid for 2D and 3D images.
+return the number of rows in the image. This method is only valid for
+2D and 3D images.
@item nslices
return the number of slices of a 3D image.
@end table
--
astrid
Index: integre/ChangeLog
from Giovanni Palma <giovanni(a)lrde.epita.fr>
* ntg/color/yuv.hh: Change the working interval.
* ntg/color/yiq.hh: Change the working interval.
* ntg/color/xyz.hh: Change the Z upperbound value.
* ntg/color/nrgb.hh: Change the working interval.
* ntg/color/hsi.hh: Change the Saturation upper bound value.
Index: metalic/ChangeLog
from Astrid Wang <astrid(a)lrde.epita.fr>
* mlc/array/1d.hh: Add member function name(). Fix types in member
function normalize(). Add basic arithmetic operators.
* mlc/array/2d.hh: Likewise.
* mlc/array/3d.hh: Likewise.
Index: olena/ChangeLog
from Giovanni Palma <giovanni(a)lrde.epita.fr>
* oln/convert/nrgbhsi.hh: Remove file.
* oln/convert/nrgbhsl.hh: Remove file.
* oln/convert/nrgbhsv.h: Remove file.
* oln/convert/nrgbyiq.hh: Remove file.
* oln/convert/nrgbyuv.hh: Remove file.
* oln/convert/rgbyiq.hh: Add file. Add RGB to YIQ conversion code.
* oln/convert/rgbyuv.hh: Add file. Add RGB to YUV conversion code.
* oln/convert/rgbhsi.hh: Add file. Add RGB to HSI conversion code.
* oln/convert/rgbhsl.hh: Add file. Add RGB to HSL conversion code.
* oln/convert/rgbhsv.hh: Add file. Add RGB to HSV conversion code.
* Makefile.am: Make new file Referenced.
* tests/convert/Makefile.am: Remove tests on obsolete
functions. Add test on new functions.
* oln/convert/rgbxyz.hh: Correct the RGB to XYZ conversion.
* oln/convert/nrgbxyz.hh: Make it obsolete.
+2004-01-21 Astrid Wang <astrid(a)lrde.epita.fr>
+
+ * oln/snakes/snakes_base.hh,
+ * oln/snakes/snakes_base.hxx,
+ * oln/snakes/segment.hh,
+ * oln/snakes/segment.hxx,
+ * oln/snakes/node.hh,
+ * oln/snakes/node.hxx,
+ * oln/snakes/energies.hh,
+ * oln/snakes/energies.hxx,
+ * oln/snakes/greedy.hh,
+ * oln/snakes/greedy.hxx: New.
+
+2004-01-19 Astrid Wang <astrid(a)lrde.epita.fr>
+
+ * oln/core/point2d.hxx: Fix member function minus().
+ * oln/core/abstract/dpoint.hh: Add member function norm2().
+
2003-12-09 Nicolas Burrus <burrus_n(a)lrde.epita.fr>
* tests/core/Makefile.am: Put fftw libraries in LDADD instead of
Index: olena/oln/convert/nrgbxyz.hh
--- olena/oln/convert/nrgbxyz.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/16_nrgbxyz.hh 1.11 640)
+++ olena/oln/convert/nrgbxyz.hh Thu, 22 Jan 2004 15:54:07 +0100 palma_g (oln/16_nrgbxyz.hh 1.11 640)
@@ -48,6 +48,9 @@
namespace convert {
+ /*!
+ ** obsolete a composition should be performed with nrgb->rgb and rgb->xyz
+ */
template <unsigned inbits, unsigned outbits>
struct f_nrgb_to_xyz
: public abstract::color_conversion<3, inbits, nrgb_traits,
@@ -88,6 +91,9 @@
return f(v);
}
+ /*!
+ ** obsolete a composition should be performed with xyz->rgb and rgb->nrgb
+ */
template<unsigned inbits, unsigned outbits>
struct f_xyz_to_nrgb
: public abstract::color_conversion<3, inbits, xyz_traits,
Index: olena/oln/convert/rgbxyz.hh
--- olena/oln/convert/rgbxyz.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/19_rgbxyz.hh 1.11 640)
+++ olena/oln/convert/rgbxyz.hh Thu, 22 Jan 2004 15:48:00 +0100 palma_g (oln/19_rgbxyz.hh 1.11 640)
@@ -59,7 +59,7 @@
vec<3, float> in = v.to_float();
vec<3, float> out;
out[xyz_X] = 0.490 * in[rgb_R] + 0.310 * in[rgb_G] + 0.200 * in[rgb_B];
- out[xyz_Y] = 0.177 * in[rgb_R] + 0.813 * in[rgb_G] + 0.011 * in[rgb_B];
+ out[xyz_Y] = 0.177 * in[rgb_R] + 0.812 * in[rgb_G] + 0.011 * in[rgb_B];
out[xyz_Z] = 0.010 * in[rgb_G] + 0.990 * in[rgb_B];
return out;
}
@@ -95,9 +95,9 @@
out[rgb_R] =
2.365 * in[xyz_X] - 0.896 * in[xyz_Y] - 0.468 * in[xyz_Z];
out[rgb_G] =
- - 0.515 * in[xyz_X] + 1.425 * in[xyz_Y] + 0.088 * in[xyz_Z];
+ - 0.515 * in[xyz_X] + 1.425 * in[xyz_Y] + 0.089 * in[xyz_Z];
out[rgb_B] =
- 0.005 * in[xyz_X] - 0.014 * in[xyz_Y] + 1.009 * in[xyz_Z];
+ 0.005 * in[xyz_X] - 0.014 * in[xyz_Y] + 1.01 * in[xyz_Z];
return out;
}
Index: olena/oln/core/abstract/dpoint.hh
--- olena/oln/core/abstract/dpoint.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/d/28_dpoint.hh 1.16 640)
+++ olena/oln/core/abstract/dpoint.hh Thu, 22 Jan 2004 21:39:15 +0100 palma_g (oln/d/28_dpoint.hh 1.17 640)
@@ -30,6 +30,7 @@
# include <mlc/type.hh>
# include <oln/core/coord.hh>
+# include <ntg/real/builtin_float.hh>
namespace oln {
@@ -135,6 +136,16 @@
return true;
}
+ ntg::float_d
+ norm2(void) const
+ {
+ double norm = 0;
+
+ for (unsigned i = 0; i < dim; ++i)
+ norm += nth(i) * nth(i);
+ return sqrt(norm);
+ }
+
static std::string
name()
{
Index: olena/oln/core/point2d.hxx
--- olena/oln/core/point2d.hxx Mon, 28 Jul 2003 14:14:03 +0200 david (oln/c/29_point2d.hx 1.5 640)
+++ olena/oln/core/point2d.hxx Thu, 22 Jan 2004 21:40:42 +0100 palma_g (oln/c/29_point2d.hx 1.6 640)
@@ -114,7 +114,7 @@
inline point2d
point2d::minus() const
{
- point2d p(row(), col());
+ point2d p(-row(), -col());
return p;
}
Index: metalic/mlc/array/1d.hh
--- metalic/mlc/array/1d.hh Thu, 07 Aug 2003 02:37:23 +0200 burrus_n (oln/f/23_array1d.hh 1.10 640)
+++ metalic/mlc/array/1d.hh Thu, 22 Jan 2004 21:39:18 +0100 palma_g (oln/f/23_array1d.hh 1.11 640)
@@ -31,9 +31,10 @@
# include <mlc/contract.hh>
# include <mlc/cmp.hh>
# include <mlc/array/objs.hh>
-
+# include <ntg/basics.hh>
# include <iostream>
+
// impl
# include <mlc/array/1d.hxx>
@@ -79,20 +80,28 @@
}
+ // Name
+
+ static std::string
+ name()
+ {
+ return std::string("array1d< Info, ") + ntg_name(T) + " >";
+ }
+
+
//
// Operations on array
//
- typedef array1d<Info_,float> to_float; // FIXME : argh
-
// Normalize (absolute values -> relative values)
- to_float normalize()
+ array1d<Info_, ntg::float_s>
+ normalize()
{
- to_float tmp;
- float sum = 0.f; // FIXME: float only?
- const float epsilon = 0.01f; // FIXME : epsilon should be global
+ array1d<Info_, ntg::float_s> tmp;
+ ntg::float_s sum = 0.f;
+ const ntg::float_s epsilon = 0.01f; // FIXME : epsilon should be global
unsigned i;
for (i = 0; i < Info_::card; ++i)
sum += this->buffer_[i];
@@ -122,6 +131,59 @@
}
+ // Operators
+
+ // FIXME: This code should be factorized between 1d, 2d and 3d.
+ // Think of a mechanism similar to apply() and apply2().
+
+ template <class U>
+ array1d< Info, ntg_return_type(times, T, U) >
+ operator*(U w)
+ {
+ array1d< Info, ntg_return_type(times, T, U) > tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] * w;
+ return tmp;
+ }
+
+ template <class U>
+ array1d< Info, ntg_return_type(div, T, U) >
+ operator/(U w)
+ {
+ array1d< Info, ntg_return_type(div, T, U) > tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] / w;
+ return tmp;
+ }
+
+ self operator+(const self& rhs) const
+ {
+ self tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] + rhs.buffer_[i];
+ return tmp;
+ }
+ self& operator+=(const self& rhs)
+ {
+ for (unsigned i = 0; i < Info::card; ++i)
+ this->buffer_[i] += rhs.buffer_[i];
+ return *this;
+ }
+
+ self operator-(const self& rhs) const
+ {
+ self tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] - rhs.buffer_[i];
+ return tmp;
+ }
+ self& operator-=(const self& rhs)
+ {
+ for (unsigned i = 0; i < Info::card; ++i)
+ this->buffer_[i] -= rhs.buffer_[i];
+ return *this;
+ }
+
//
// Accessors
@@ -179,7 +241,6 @@
return *(buffer_ + Info_::center + i);
}
-
protected:
T buffer_[Info_::card];
@@ -202,8 +263,18 @@
// starter objects
- static internal::array1d_start_<int> ints_1d = internal::array1d_start_<int>();
- static internal::array1d_start_<float> floats_1d = internal::array1d_start_<float>();
+ // FIXME: what about other types? Replace this by a function
+ // returning a starter.
+
+# define array1d_starter(T) \
+ static internal::array1d_start_<T> T##s_1d = internal::array1d_start_<T>()
+
+ array1d_starter(int); // ints_1d
+ array1d_starter(float); // floats_1d
+
+
+
+ // print
template<class Info, class T>
std::ostream& operator<<(std::ostream& ostr, const array1d<Info, T>& rhs)
Index: metalic/mlc/array/2d.hh
--- metalic/mlc/array/2d.hh Thu, 07 Aug 2003 02:37:23 +0200 burrus_n (oln/f/21_array2d.hh 1.10 640)
+++ metalic/mlc/array/2d.hh Thu, 22 Jan 2004 21:39:19 +0100 palma_g (oln/f/21_array2d.hh 1.11 640)
@@ -31,6 +31,7 @@
# include <mlc/array/objs.hh>
# include <mlc/contract.hh>
# include <mlc/cmp.hh>
+# include <ntg/basics.hh>
# include <iostream>
@@ -78,19 +79,30 @@
return *this;
}
+
+ // Name
+
+ static std::string
+ name()
+ {
+ return std::string("array2d< Info, ") + ntg_name(T) + " >";
+ }
+
+
+
//
// Operations on array
//
- typedef array2d<Info_, float> to_float; // FIXME : argh
// Normalize (absolute values -> relative values)
- to_float normalize()
+ array2d<Info_, ntg::float_s>
+ normalize()
{
- to_float tmp;
- float sum = 0.f; // FIXME: float only?
- const float epsilon = 0.01f; // FIXME : epsilon should be global
+ array2d<Info_, ntg::float_s> tmp;
+ ntg::float_s sum = 0.f;
+ const ntg::float_s epsilon = 0.01f; // FIXME : epsilon should be global
unsigned i;
for (i = 0; i < Info_::card; ++i)
sum += this->buffer_[i];
@@ -138,6 +150,60 @@
return tmp;
}
+ // Operators
+
+ // FIXME: This code should be factorized between 1d, 2d and 3d.
+ // Think of a mechanism similar to apply() and apply2().
+
+ template <class U>
+ array2d< Info, ntg_return_type(times, T, U) >
+ operator*(U w)
+ {
+ array2d< Info, ntg_return_type(times, T, U) > tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] * w;
+ return tmp;
+ }
+
+ template <class U>
+ array2d< Info, ntg_return_type(div, T, U) >
+ operator/(U w)
+ {
+ array2d< Info, ntg_return_type(div, T, U) > tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] / w;
+ return tmp;
+ }
+
+ self operator+(const self& rhs) const
+ {
+ self tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] + rhs.buffer_[i];
+ return tmp;
+ }
+ self& operator+=(const self& rhs)
+ {
+ for (unsigned i = 0; i < Info::card; ++i)
+ this->buffer_[i] += rhs.buffer_[i];
+ return *this;
+ }
+
+ self operator-(const self& rhs) const
+ {
+ self tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] - rhs.buffer_[i];
+ return tmp;
+ }
+ self& operator-=(const self& rhs)
+ {
+ for (unsigned i = 0; i < Info::card; ++i)
+ this->buffer_[i] -= rhs.buffer_[i];
+ return *this;
+ }
+
+
//
// Accessors
//
@@ -200,8 +266,6 @@
lesseq< nrow, Info_::nrows - Info_::center_row - 1 >::ensure();
lesseq< -Info_::center_col, ncol >::ensure();
lesseq< ncol, Info_::ncols - Info_::center_col - 1 >::ensure();
-
- // FIXME: return *(buffer_ + Info_::center + (row * Info_::ncols) + col);
return *(buffer_ + Info_::center + (nrow * Info_::ncols) + ncol);
}
@@ -228,8 +292,17 @@
// starter objects
- static internal::array2d_start_<int> ints_2d = internal::array2d_start_<int>();
- static internal::array2d_start_<float> floats_2d = internal::array2d_start_<float>();
+ // FIXME: what about other types? Replace this by a function
+ // returning a starter.
+
+# define array2d_starter(T) \
+ static internal::array2d_start_<T> T##s_2d = internal::array2d_start_<T>()
+
+ array2d_starter(int); // ints_2d
+ array2d_starter(float); // floats_2d
+
+
+ // print
template<class Info, class T>
std::ostream& operator<<(std::ostream& ostr, const array2d<Info, T>& rhs)
Index: metalic/mlc/array/3d.hh
--- metalic/mlc/array/3d.hh Thu, 07 Aug 2003 02:37:23 +0200 burrus_n (oln/f/19_array3d.hh 1.11 640)
+++ metalic/mlc/array/3d.hh Thu, 22 Jan 2004 21:39:19 +0100 palma_g (oln/f/19_array3d.hh 1.12 640)
@@ -31,6 +31,7 @@
# include <mlc/array/objs.hh>
# include <mlc/contract.hh>
# include <mlc/cmp.hh>
+# include <ntg/basics.hh>
# include <iostream>
@@ -82,20 +83,28 @@
}
+ // Name
+
+ static std::string
+ name()
+ {
+ return std::string("array3d< Info, ") + ntg_name(T) + " >";
+ }
+
+
//
// Operations on array
//
- typedef array3d<Info_, float> to_float; // FIXME : argh
-
// Normalize (absolute values -> relative values)
- to_float normalize()
+ array3d<Info_, ntg::float_s>
+ normalize()
{
- to_float tmp;
- float sum = 0.f; // FIXME: float only?
- const float epsilon = 0.01f; // FIXME : epsilon should be global
+ array3d<Info_, ntg::float_s> tmp;
+ ntg::float_s sum = 0.f;
+ const ntg::float_s epsilon = 0.01f; // FIXME : epsilon should be global
unsigned i;
for (i = 0; i < Info_::card; ++i)
sum += this->buffer_[i];
@@ -119,7 +128,7 @@
operator-() const
{
enum { new_center = Info_::card - Info_::center - 1 };
- array3d<array3d_info< Info::nplanes, Info_::nrows, Info_::ncols, new_center, Info_::i>,T> tmp;
+ array3d<array3d_info< Info_::nplanes, Info_::nrows, Info_::ncols, new_center, Info_::i>,T> tmp;
for (unsigned i = 0; i < Info_::card; ++i)
tmp[Info_::card - i - 1] = this->operator[](i);
@@ -129,13 +138,68 @@
// Transpose
-
array3d<Info, T> transpose() const // FIXME
{
std::cerr << "[31m===> 3D transposition not implemented yet. <===[0m" << std::endl;
throw not_implemented_yet();
}
+
+ // Operators
+
+ // FIXME: This code should be factorized between 1d, 2d and 3d.
+ // Think of a mechanism similar to apply() and apply2().
+
+ template <class U>
+ array3d< Info, ntg_return_type(times, T, U) >
+ operator*(U w)
+ {
+ array3d< Info, ntg_return_type(times, T, U) > tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] * w;
+ return tmp;
+ }
+
+ template <class U>
+ array3d< Info, ntg_return_type(div, T, U) >
+ operator/(U w)
+ {
+ array3d< Info, ntg_return_type(div, T, U) > tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] / w;
+ return tmp;
+ }
+
+ self operator+(const self& rhs) const
+ {
+ self tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] + rhs.buffer_[i];
+ return tmp;
+ }
+ self& operator+=(const self& rhs)
+ {
+ for (unsigned i = 0; i < Info::card; ++i)
+ this->buffer_[i] += rhs.buffer_[i];
+ return *this;
+ }
+
+ self operator-(const self& rhs) const
+ {
+ self tmp;
+ for (unsigned i = 0; i < Info::card; ++i)
+ tmp[i] = this->buffer_[i] - rhs.buffer_[i];
+ return tmp;
+ }
+ self& operator-=(const self& rhs)
+ {
+ for (unsigned i = 0; i < Info::card; ++i)
+ this->buffer_[i] -= rhs.buffer_[i];
+ return *this;
+ }
+
+
+
// template<class U> int operator,(U); // FIXME: why this?
//
@@ -207,8 +271,6 @@
lesseq< nrow, Info_::nrows - Info_::center_row - 1 >::ensure();
lesseq< -Info_::center_col, ncol >::ensure();
lesseq< ncol, Info_::ncols - Info_::center_col - 1 >::ensure();
-
- //FIXME: return *(buffer_ + Info_::center + (nplane * Info::nrows * Info::ncols) + (row * Info::ncols) + col);
return *(buffer_ + Info_::center + (nplane * Info::nrows * Info::ncols) + (nrow * Info::ncols) + ncol);
}
@@ -235,8 +297,17 @@
// starter objects
- static internal::array3d_start_<int> ints_3d = internal::array3d_start_<int>();
- static internal::array3d_start_<float> floats_3d = internal::array3d_start_<float>();
+ // FIXME: what about other types? Replace this by a function
+ // returning a starter.
+
+# define array3d_starter(T) \
+ static internal::array3d_start_<T> T##s_3d = internal::array3d_start_<T>()
+
+ array3d_starter(int); // ints_3d
+ array3d_starter(float); // floats_3d
+
+
+ // print
template<class Info, class T>
std::ostream& operator<<(std::ostream& ostr, const array3d<Info, T>& rhs)
@@ -256,6 +327,7 @@
return ostr;
}
+
} // end of mlc
#endif // ! METALIC_ARRAY_3D_HH
Index: integre/ntg/color/hsi.hh
--- integre/ntg/color/hsi.hh Mon, 28 Jul 2003 18:24:48 +0200 burrus_n (oln/i/20_hsi.hh 1.3.1.6 640)
+++ integre/ntg/color/hsi.hh Thu, 22 Jan 2004 17:26:30 +0100 palma_g (oln/i/20_hsi.hh 1.3.1.6 640)
@@ -45,7 +45,7 @@
template<> struct hsi_traits<hsi_S>
{
static float lower_bound() { return 0.; }
- static float upper_bound() { return 1.0801234; } //sqrt(7. / 6)
+ static float upper_bound() { return 0.816497; } //2 / sqrt(6)
};
template<> struct hsi_traits<hsi_I>
Index: integre/ntg/color/nrgb.hh
--- integre/ntg/color/nrgb.hh Wed, 30 Jul 2003 18:49:16 +0200 burrus_n (oln/i/19_nrgb.hh 1.5.1.5 640)
+++ integre/ntg/color/nrgb.hh Thu, 22 Jan 2004 17:50:09 +0100 palma_g (oln/i/19_nrgb.hh 1.5.1.5 640)
@@ -45,9 +45,29 @@
};
template<unsigned icomp> struct nrgb_traits;
- template<> struct nrgb_traits<nrgb_R> : public interval<0,1> {};
- template<> struct nrgb_traits<nrgb_G> : public interval<0,1> {};
- template<> struct nrgb_traits<nrgb_B> : public interval<0,1> {};
+ template<>
+ struct nrgb_traits<nrgb_R>
+ {
+ static float lower_bound() { return 0;}
+ static float upper_bound() { return 1.0885004;}
+ };
+
+
+ template<>
+ struct nrgb_traits<nrgb_G>
+ {
+ static float lower_bound() { return -0.3321984;}
+ static float upper_bound() { return 1.3189264;}
+ };
+
+
+ template<>
+ struct nrgb_traits<nrgb_B>
+ {
+ static float lower_bound() { return -0.0688480;}
+ static float upper_bound() { return 0.904727;}
+ };
+
typedef color<3,8,nrgb_traits> nrgb_8;
typedef color<3,16,nrgb_traits> nrgb_16;
Index: integre/ntg/color/xyz.hh
--- integre/ntg/color/xyz.hh Mon, 28 Jul 2003 18:24:48 +0200 burrus_n (oln/i/24_xyz.hh 1.3.1.6 640)
+++ integre/ntg/color/xyz.hh Thu, 22 Jan 2004 15:49:51 +0100 palma_g (oln/i/24_xyz.hh 1.3.1.6 640)
@@ -43,12 +43,7 @@
template<unsigned icomp> struct xyz_traits;
template<> struct xyz_traits<xyz_X> : public interval<0,1> {};
template<> struct xyz_traits<xyz_Y> : public interval<0,1> {};
-
- template<> struct xyz_traits<xyz_Z>
- {
- static float lower_bound() { return 0.; }
- static float upper_bound() { return 1.2; }
- };
+ template<> struct xyz_traits<xyz_Z> : public interval<0,1> {};
typedef color<3,8,xyz_traits> xyz_8;
typedef color<3,16,xyz_traits> xyz_16;
Index: integre/ntg/color/yiq.hh
--- integre/ntg/color/yiq.hh Mon, 28 Jul 2003 18:24:48 +0200 burrus_n (oln/i/23_yiq.hh 1.3.1.6 640)
+++ integre/ntg/color/yiq.hh Thu, 22 Jan 2004 18:59:48 +0100 palma_g (oln/i/23_yiq.hh 1.3.1.6 640)
@@ -45,14 +45,14 @@
template<> struct yiq_traits<yiq_I>
{
- static float lower_bound() { return -.6; }
- static float upper_bound() { return .6; }
+ static float lower_bound() { return -.4192; }
+ static float upper_bound() { return .5346; }
};
template<> struct yiq_traits<yiq_Q>
{
- static float lower_bound() { return -.6; }
- static float upper_bound() { return .6; }
+ static float lower_bound() { return -.6783; }
+ static float upper_bound() { return .6527; }
};
typedef color<3,8,yiq_traits> yiq_8;
Index: integre/ntg/color/yuv.hh
--- integre/ntg/color/yuv.hh Mon, 28 Jul 2003 18:24:48 +0200 burrus_n (oln/i/25_yuv.hh 1.3.1.6 640)
+++ integre/ntg/color/yuv.hh Thu, 22 Jan 2004 16:23:56 +0100 palma_g (oln/i/25_yuv.hh 1.3.1.6 640)
@@ -44,14 +44,14 @@
template<> struct yuv_traits<yuv_Y> : public interval<0,1> {};
template<> struct yuv_traits<yuv_U>
{
- static float lower_bound() { return -0.45; }
- static float upper_bound() { return 0.45; }
+ static float lower_bound() { return -0.517; }
+ static float upper_bound() { return 0.437; }
};
template<> struct yuv_traits<yuv_V>
{
- static float lower_bound() { return -0.62; }
- static float upper_bound() { return 0.62; }
+ static float lower_bound() { return -0.576; }
+ static float upper_bound() { return 0.654; }
};
typedef color<3,8,yuv_traits> yuv_8;
Index: olena/tests/convert/Makefile.am
--- olena/tests/convert/Makefile.am Fri, 01 Aug 2003 02:45:53 +0200 burrus_n (oln/f/0_Makefile.a 1.13 640)
+++ olena/tests/convert/Makefile.am Thu, 22 Jan 2004 19:22:42 +0100 palma_g (oln/f/0_Makefile.a 1.13 640)
@@ -4,74 +4,74 @@
include ../check/Makefile.check
check_PROGRAMS = \
- 8-nrgb-hsi \
- 8-nrgb-hsl \
- 8-nrgb-hsv \
- 8-nrgb-xyz \
- 8-nrgb-yiq \
- 8-nrgb-yuv \
+ 8-rgb-hsi \
+ 8-rgb-hsl \
+ 8-rgb-hsv \
+ 8-rgb-xyz \
+ 8-rgb-yiq \
+ 8-rgb-yuv \
8-rgb-nrgb \
8-rgb-xyz \
- f-8-nrgb-hsi \
- f-8-nrgb-hsl \
- f-8-nrgb-hsv \
- f-8-nrgb-xyz \
- f-8-nrgb-yiq \
- f-8-nrgb-yuv \
+ f-8-rgb-hsi \
+ f-8-rgb-hsl \
+ f-8-rgb-hsv \
+ f-8-rgb-xyz \
+ f-8-rgb-yiq \
+ f-8-rgb-yuv \
f-8-rgb-nrgb \
f-8-rgb-xyz
-XFAIL_TESTS = 8-rgb-nrgb$(EXEEXT)
+# XFAIL_TESTS = 8-rgb-nrgb$(EXEEXT)
## FIXME: Ideally, each _SOURCES should be defined as $(CONVSOURCES), with
## CONVSOURCES = convcomp.cc convcomp.hh
## but this triggers a bug in Automake 1.6.
-8_nrgb_hsi_SOURCES = conv.cc conv.hh
-8_nrgb_hsi_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=hsi -DEM=5
+8_rgb_hsi_SOURCES = conv.cc conv.hh
+8_rgb_hsi_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=hsi -DEM=5
-8_nrgb_hsl_SOURCES = conv.cc conv.hh
-8_nrgb_hsl_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=hsl -DEM=5
+8_rgb_hsl_SOURCES = conv.cc conv.hh
+8_rgb_hsl_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=hsl -DEM=5
-8_nrgb_hsv_SOURCES = conv.cc conv.hh
-8_nrgb_hsv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=hsv -DEM=3
+8_rgb_hsv_SOURCES = conv.cc conv.hh
+8_rgb_hsv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=hsv -DEM=3
-8_nrgb_xyz_SOURCES = conv.cc conv.hh
-8_nrgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=xyz -DEM=5
+8_rgb_xyz_SOURCES = conv.cc conv.hh
+8_rgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=xyz -DEM=5
-8_nrgb_yiq_SOURCES = conv.cc conv.hh
-8_nrgb_yiq_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=yiq -DEM=5
+8_rgb_yiq_SOURCES = conv.cc conv.hh
+8_rgb_yiq_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=yiq -DEM=6
-8_nrgb_yuv_SOURCES = conv.cc conv.hh
-8_nrgb_yuv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=yuv -DEM=6
+8_rgb_yuv_SOURCES = conv.cc conv.hh
+8_rgb_yuv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=yuv -DEM=6
8_rgb_nrgb_SOURCES = conv.cc conv.hh
8_rgb_nrgb_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=nrgb -DEM=6
-8_rgb_xyz_SOURCES = conv.cc conv.hh
-8_rgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=xyz -DEM=4
+# 8_rgb_xyz_SOURCES = conv.cc conv.hh
+# 8_rgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=xyz -DEM=4
-f_8_nrgb_hsi_SOURCES = convcomp.cc convcomp.hh
-f_8_nrgb_hsi_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=hsi -DEM=17.8723 -DEV=1099.78
+f_8_rgb_hsi_SOURCES = convcomp.cc convcomp.hh
+f_8_rgb_hsi_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=hsi -DEM=17.8723 -DEV=1099.78
-f_8_nrgb_hsl_SOURCES = convcomp.cc convcomp.hh
-f_8_nrgb_hsl_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=hsl -DEM=5.90563 -DEV=152.583
+f_8_rgb_hsl_SOURCES = convcomp.cc convcomp.hh
+f_8_rgb_hsl_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=hsl -DEM=5.90563 -DEV=152.583
-f_8_nrgb_hsv_SOURCES = convcomp.cc convcomp.hh
-f_8_nrgb_hsv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=hsv -DEM=1.10193 -DEV=74.3924
+f_8_rgb_hsv_SOURCES = convcomp.cc convcomp.hh
+f_8_rgb_hsv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=hsv -DEM=1.10193 -DEV=74.3924
-f_8_nrgb_xyz_SOURCES = convcomp.cc convcomp.hh
-f_8_nrgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=xyz -DEM=0.952448 -DEV=4.04194
+# f_8_nrgb_xyz_SOURCES = convcomp.cc convcomp.hh
+# f_8_nrgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=xyz -DEM=0.952448 -DEV=4.04194
-f_8_nrgb_yiq_SOURCES = convcomp.cc convcomp.hh
-f_8_nrgb_yiq_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=yiq -DEM=2.11554 -DEV=18.7004
+f_8_rgb_yiq_SOURCES = convcomp.cc convcomp.hh
+f_8_rgb_yiq_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=yiq -DEM=2.11554 -DEV=18.7004
-f_8_nrgb_yuv_SOURCES = convcomp.cc convcomp.hh
-f_8_nrgb_yuv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=nrgb -DDEST=yuv -DEM=5.20401 -DEV=1.36447
+f_8_rgb_yuv_SOURCES = convcomp.cc convcomp.hh
+f_8_rgb_yuv_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=yuv -DEM=5.20401 -DEV=1.36447
f_8_rgb_nrgb_SOURCES = convcomp.cc convcomp.hh
-f_8_rgb_nrgb_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=nrgb -DEM=0.426287 -DEV=1.97667
+f_8_rgb_nrgb_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=nrgb -DEM=0.692094 -DEV=0.329154
f_8_rgb_xyz_SOURCES = convcomp.cc convcomp.hh
f_8_rgb_xyz_CPPFLAGS = $(AM_CPPFLAGS) -DSRC=rgb -DDEST=xyz -DEM=0.865949 -DEV=0.356157
Index: olena/oln/Makefile.am
--- olena/oln/Makefile.am Thu, 27 Nov 2003 10:33:30 +0100 burrus_n (oln/q/47_Makefile.a 1.3.1.1.1.6.1.6 640)
+++ olena/oln/Makefile.am Thu, 22 Jan 2004 17:47:32 +0100 palma_g (oln/q/47_Makefile.a 1.3.1.1.1.6.1.6 640)
@@ -25,11 +25,11 @@
convert/conversion_ng_se.hh \
convert/force.hh \
convert/nrgbxyz.hh \
- convert/nrgbyiq.hh \
- convert/nrgbyuv.hh \
- convert/nrgbhsi.hh \
- convert/nrgbhsl.hh \
- convert/nrgbhsv.hh \
+ convert/rgbyiq.hh \
+ convert/rgbyuv.hh \
+ convert/rgbhsi.hh \
+ convert/rgbhsl.hh \
+ convert/rgbhsv.hh \
convert/rgbnrgb.hh \
convert/rgbxyz.hh \
convert/stretch.hh \
Index: olena/oln/convert/rgbhsv.hh
--- olena/oln/convert/rgbhsv.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/convert/rgbhsv.hh Thu, 22 Jan 2004 17:35:48 +0100 palma_g (oln/j/35_rgbhsv.hh 644)
@@ -0,0 +1,188 @@
+// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_RGBHSV_HH
+# define OLENA_CONVERT_RGBHSV_HH
+
+# include <oln/basics.hh>
+# include <oln/convert/abstract/colorconv.hh>
+
+# include <ntg/basics.hh>
+# include <ntg/color/rgb.hh>
+# include <ntg/color/hsv.hh>
+
+# include <mlc/contract.hh>
+
+# include <sstream>
+
+/*-----------------------------------------------------------------.
+| The formulas used here come from ``Color Conversion Algorithms'' |
+`-----------------------------------------------------------------*/
+
+namespace oln {
+
+ using namespace ntg;
+
+ namespace convert {
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_rgb_to_hsv
+ : public abstract::color_conversion<3, inbits, rgb_traits,
+ 3, outbits, hsv_traits, f_rgb_to_hsv<inbits, outbits> >
+ {
+ color<3, outbits, hsv_traits>
+ doit(const color<3, inbits, rgb_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ float max_in = std::max(in[rgb_R], std::max(in[rgb_B], in[rgb_G]));
+ float min_in = std::min(in[rgb_R], std::min(in[rgb_B], in[rgb_G]));
+ float delta = max_in - min_in;
+
+
+ out[hsv_V] = max_in;
+
+ if (max_in != 0)
+ out[hsv_S] = delta / max_in;
+ else
+ out[hsv_S] = 0;
+
+ if (out[hsv_S] == 0)
+ out[hsv_H] = -1; // undefined
+ else {
+ if (in[rgb_R] == max_in)
+ out[hsv_H] = (in[rgb_G] - in[rgb_B]) / delta;
+ else if (in[rgb_G] == max_in)
+ out[hsv_H] = 2 + (in[rgb_B] - in[rgb_R]) / delta;
+ else
+ out[hsv_H] = 4 + (in[rgb_R] - in[rgb_G]) / delta;
+ out[hsv_H] *= 60;
+ if (out[hsv_H] < 0)
+ out[hsv_H] += 360;
+ }
+
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_rgb_to_hsv<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, hsv_traits>
+ rgb_to_hsv(const color<3, inbits, rgb_traits>& v)
+ {
+ f_rgb_to_hsv<inbits, outbits> f;
+ return f(v);
+ }
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_hsv_to_rgb
+ : public abstract::color_conversion<3, inbits, hsv_traits,
+ 3, outbits, rgb_traits, f_hsv_to_rgb<inbits, outbits> >
+ {
+ color<3, outbits, rgb_traits>
+ doit(const color<3, inbits, hsv_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+
+ if(in[hsv_S] == 0)
+ out[rgb_G] = out[rgb_B] = out[rgb_R] = in[hsv_V];
+ else
+ {
+ in[hsv_H] /= 60;
+ int i = (int)floor (in[hsv_H]);
+ float f = in[hsv_H] - i;
+ float p = in[hsv_V] * (1 - in[hsv_S]);
+ float q = in[hsv_V] * (1 - in[hsv_S] * f);
+ float t = in[hsv_V] * (1 - in[hsv_S] * (1 - f));
+
+ switch (i){
+ case 0:
+ case 6:
+ out[rgb_R] = in[hsv_V];
+ out[rgb_G] = t;
+ out[rgb_B] = p;
+ break;
+ case 1:
+ out[rgb_R] = q;
+ out[rgb_G] = in[hsv_V];
+ out[rgb_B] = p;
+ break;
+ case 2:
+ out[rgb_R] = p;
+ out[rgb_G] = in[hsv_V];
+ out[rgb_B] = t;
+ break;
+ case 3:
+ out[rgb_R] = p;
+ out[rgb_G] = q;
+ out[rgb_B] = in[hsv_V];
+ break;
+ case 4:
+ out[rgb_R] = t;
+ out[rgb_G] = p;
+ out[rgb_B] = in[hsv_V];
+ break;
+ default:
+ out[rgb_R] = in[hsv_V];
+ out[rgb_G] = p;
+ out[rgb_B] = q;
+ break;
+ }
+ }
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_hsv_to_rgb<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, rgb_traits>
+ hsv_to_rgb(const color<3, inbits, hsv_traits>& v)
+ {
+ f_hsv_to_rgb<inbits, outbits> f;
+ return f(v);
+ }
+
+ } // convert
+} // oln
+
+#endif // OLENA_CONVERT_RGBHSV_HH
Index: olena/oln/convert/rgbhsl.hh
--- olena/oln/convert/rgbhsl.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/convert/rgbhsl.hh Thu, 22 Jan 2004 18:37:35 +0100 palma_g (oln/j/36_rgbhsl.hh 644)
@@ -0,0 +1,185 @@
+// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBHSL_HH
+# define OLENA_CONVERT_NRGBHSL_HH
+
+# include <oln/basics.hh>
+# include <oln/convert/abstract/colorconv.hh>
+
+# include <ntg/basics.hh>
+# include <ntg/color/nrgb.hh>
+# include <ntg/color/hsl.hh>
+
+# include <mlc/contract.hh>
+
+# include <cstdlib>
+# include <sstream>
+
+/*------------------------------------------------------------------.
+| The formulas used here come from ``Color space conversion''; Paul |
+| Bourke. |
+`------------------------------------------------------------------*/
+namespace oln {
+
+ using namespace ntg;
+
+ namespace convert {
+ template<unsigned inbits, unsigned outbits>
+ struct f_rgb_to_hsl
+ : public abstract::color_conversion<3, inbits, rgb_traits,
+ 3, outbits, hsl_traits, f_rgb_to_hsl<inbits, outbits> >
+ {
+ color<3, outbits, hsl_traits>
+ doit(const color<3, inbits, rgb_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+
+ float max_in = ntg::max(in[rgb_R], std::max(in[rgb_B], in[rgb_G]));
+ float min_in = ntg::min(in[rgb_R], std::min(in[rgb_B], in[rgb_G]));
+ float diff = max_in-min_in;
+
+ out[hsl_L] = (max_in + min_in) / 2;
+ if (std::abs(diff) <= FLT_EPSILON){
+ out[hsl_S] = 0;
+ out[hsl_H] = 0; // undefined
+ }
+ else {
+ if (out[hsl_L] <= 0.5)
+ out[hsl_S] = diff / (max_in + min_in);
+ else
+ out[hsl_S] = diff / (2 - max_in - min_in);
+
+
+ float r_dist = (max_in - in[rgb_R]) / diff;
+ float g_dist = (max_in - in[rgb_G]) / diff;
+ float b_dist = (max_in - in[rgb_B]) / diff;
+
+ if (in[rgb_R] == max_in)
+ out[hsl_H] = b_dist - g_dist;
+ else if(in[rgb_G] == max_in)
+ out[hsl_H] = 2 + r_dist - b_dist;
+ else if(in[rgb_B] == max_in)
+ out[hsl_H] = 4 + g_dist - r_dist;
+
+ out[hsl_H] *= 60;
+ if(out[hsl_H] < 0)
+ out[hsl_H] += 360;
+ }
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_rgb_to_hsl<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, inbits, hsl_traits>
+ rgb_to_hsl(const color<3, outbits, rgb_traits>& v)
+ {
+ f_rgb_to_hsl<inbits, outbits> f;
+ return f(v);
+ }
+
+ namespace internal {
+ float
+ RGB(float q1, float q2, float hue)
+ {
+ if (hue >= 360)
+ hue -= 360;
+ if (hue < 0)
+ hue += 360;
+ if (hue < 60)
+ return q1 + (q2 - q1) * hue / 60;
+ else if (hue < 180)
+ return q2;
+ else if (hue < 240)
+ return q1 + (q2 - q1) * (240 - hue) / 60;
+ else
+ return q1;
+ }
+ }
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_hsl_to_rgb
+ : public abstract::color_conversion<3, inbits, hsl_traits,
+ 3, outbits, rgb_traits, f_hsl_to_rgb<inbits, outbits> >
+ {
+ color<3, outbits, rgb_traits>
+ doit(const color<3, inbits, hsl_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ float p2;
+
+ if(in[hsl_L] < 0.5)
+ p2 = in[hsl_L] * (1+in[hsl_S]);
+ else
+ p2 = in[hsl_L] + in[hsl_S] - (in[hsl_L] * in[hsl_S]);
+
+ float p1 = 2 * in[hsl_L] - p2;
+
+ if(in[hsl_S] == 0)
+ out[rgb_R] = out[rgb_G] = out[rgb_B] = in[hsl_L];
+ else
+ {
+ out[rgb_R] = internal::RGB(p1, p2, in[hsl_H] + 120);
+ out[rgb_G] = internal::RGB(p1, p2, in[hsl_H]);
+ out[rgb_B] = internal::RGB(p1, p2, in[hsl_H] - 120);
+ }
+
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_hsl_to_rgb<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template<unsigned inbits, unsigned outbits>
+ color<3, outbits, rgb_traits>
+ hsl_to_rgb(const color<3, inbits, hsl_traits>& v)
+ {
+ f_hsl_to_rgb<inbits, outbits> f;
+ return f(v);
+ }
+
+ } // convert
+} // oln
+
+#endif // OLENA_CONVERT_RGBHSL_HH
Index: olena/oln/convert/rgbhsi.hh
--- olena/oln/convert/rgbhsi.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/convert/rgbhsi.hh Thu, 22 Jan 2004 16:39:38 +0100 palma_g (oln/j/37_rgbhsi.hh 644)
@@ -0,0 +1,136 @@
+// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_RGBHSI_HH
+# define OLENA_CONVERT_RGBHSI_HH
+
+# include <oln/convert/abstract/colorconv.hh>
+
+# include <ntg/basics.hh>
+# include <ntg/color/rgb.hh>
+# include <ntg/color/hsi.hh>
+
+# include <sstream>
+
+/*--------------------------------------------------------------.
+| The formulas used here come from ``Digital Image Processing |
+| Algorithms and Applications'', I. Pitas; Wiley-Interscience. |
+`--------------------------------------------------------------*/
+
+namespace oln {
+
+ using namespace ntg;
+
+ namespace convert {
+
+ static const float sqrt3_3 = sqrt(3) / 3;
+ static const float inv_sqrt6 = 1 / sqrt(6);
+ static const float inv_sqrt2 = 1 / sqrt(2);
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_rgb_to_hsi
+ : public abstract::color_conversion<3, inbits, rgb_traits,
+ 3, outbits, hsi_traits, f_rgb_to_hsi<inbits, outbits> >
+ {
+ color<3, inbits, hsi_traits>
+ doit(const color<3, outbits, rgb_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ out[hsi_I] =
+ sqrt3_3 * in[rgb_R] + sqrt3_3 * in[rgb_G] + sqrt3_3 * in[rgb_B];
+ const float v1 = inv_sqrt2 * in[rgb_G] - inv_sqrt2 * in[rgb_B];
+ const float v2 = 2 * inv_sqrt6 * in[rgb_R] - inv_sqrt6 * in[rgb_G]
+ - inv_sqrt6 * in[rgb_B];
+ out[hsi_H] = atan2(v2, v1) / M_PI * 180.0;
+ if (out[hsi_H] < 0)
+ out[hsi_H] += 360.0;
+ assert(out[hsi_H] >= 0);
+ out[hsi_S] = sqrt(v1 * v1 + v2 * v2);
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_rgb_to_hsi<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, hsi_traits>
+ rgb_to_hsi(const color<3, inbits, rgb_traits>& v)
+ {
+ f_rgb_to_hsi<inbits, outbits> f;
+
+ return f(v);
+ }
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_hsi_to_rgb
+ : public abstract::color_conversion<3, inbits, hsi_traits,
+ 3, outbits, rgb_traits, f_hsi_to_rgb<inbits, outbits> >
+ {
+ color<3, outbits, rgb_traits>
+ doit(const color<3, inbits, hsi_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ const float h = in[hsi_H] / 180.0 * M_PI;
+ const float v1 = in[hsi_S] * cos(h);
+ const float v2 = in[hsi_S] * sin(h);
+ out[rgb_R] = sqrt3_3 * in[hsi_I] + 2 * inv_sqrt6 * v2;
+ out[rgb_G] = sqrt3_3 * in[hsi_I] + inv_sqrt2 * v1 - inv_sqrt6 * v2;
+ out[rgb_B] = sqrt3_3 * in[hsi_I] - inv_sqrt2 * v1 - inv_sqrt6 * v2;
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_hsi_to_rgb<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, rgb_traits>
+ hsi_to_rgb (const color<3, inbits, hsi_traits>& v)
+ {
+ f_hsi_to_rgb<inbits, outbits> f;
+
+ return f(v);
+ }
+
+ } // convert
+} // oln
+
+#endif // OLENA_CONVERT_RGBHSI_HH
Index: olena/oln/convert/rgbyuv.hh
--- olena/oln/convert/rgbyuv.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/convert/rgbyuv.hh Thu, 22 Jan 2004 16:28:30 +0100 palma_g (oln/j/38_rgbyuv.hh 644)
@@ -0,0 +1,126 @@
+// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBYUV_HH
+# define OLENA_CONVERT_NRGBYUV_HH
+
+# include <oln/convert/abstract/colorconv.hh>
+
+# include <ntg/color/rgb.hh>
+# include <ntg/color/yuv.hh>
+# include <ntg/basics.hh>
+
+# include <sstream>
+
+/*---------------------------------------------------------------.
+| The formulas used here come from ``Colour Space Conversions'', |
+| IAdrian Ford and Alan Roberts; August 11,1998. |
+`---------------------------------------------------------------*/
+
+namespace oln {
+
+ using namespace ntg;
+
+ namespace convert {
+
+ template <unsigned inbits, unsigned outbits>
+ struct f_rgb_to_yuv
+ : public abstract::color_conversion<3, inbits, rgb_traits,
+ 3, outbits, yuv_traits, f_rgb_to_yuv<inbits, outbits> >
+ {
+ color<3, outbits, yuv_traits>
+ doit(const color<3, inbits, rgb_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ out[yuv_Y] =
+ + 0.177 * in[rgb_R] + 0.813 * in[rgb_G] + 0.01 * in[rgb_B];
+ out[yuv_U] =
+ - 0.083 * in[rgb_R] - 0.434 * in[rgb_G] + 0.437 * in[rgb_B];
+ out[yuv_V] =
+ + 0.583 * in[rgb_R] - 0.576 * in[rgb_G] + 0.071 * in[rgb_B];
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_rgb_to_yuv<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, yuv_traits>
+ rgb_to_yuv(const color<3, inbits, rgb_traits>& v)
+ {
+ f_rgb_to_yuv<inbits, outbits> f;
+
+ return f(v);
+ }
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_yuv_to_rgb
+ : public abstract::color_conversion<3, inbits, yuv_traits,
+ 3, outbits, rgb_traits, f_yuv_to_rgb<inbits, outbits> >
+ {
+ color<3, outbits, rgb_traits>
+ doit(const color<3, inbits, yuv_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ out[rgb_R] = 0.8702 * in[yuv_Y] - 0.2487 * in[yuv_U] + 1.4250 * in[yuv_V];
+ out[rgb_G] = 1.0259 * in[yuv_Y] + 0.0259 * in[yuv_U] - 0.3072 * in[yuv_V];
+ out[rgb_B] = 1.1837 * in[yuv_Y] + 2.2642 * in[yuv_U] - 0.0359 * in[yuv_V];
+
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_yuv_to_rgb<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, rgb_traits>
+ yuv_to_rgb(const color<3, inbits, yuv_traits>& v)
+ {
+ f_yuv_to_rgb<inbits, outbits> f;
+
+ return f(v);
+ }
+
+ } // convert
+} // oln
+
+#endif // OLENA_CONVERT_RGBYUV_HH
Index: olena/oln/convert/rgbyiq.hh
--- olena/oln/convert/rgbyiq.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/convert/rgbyiq.hh Thu, 22 Jan 2004 16:35:28 +0100 palma_g (oln/j/39_rgbyiq.hh 644)
@@ -0,0 +1,125 @@
+// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_RGBYIQ_HH
+# define OLENA_CONVERT_RGBYIQ_HH
+
+# include <oln/convert/abstract/colorconv.hh>
+
+# include <ntg/color/rgb.hh>
+# include <ntg/color/yiq.hh>
+# include <ntg/basics.hh>
+
+# include <sstream>
+
+/*--------------------------------------------------------------.
+| The formulas used here come from ``Digital Image Processing |
+| Algorithms and Applications'', I. Pitas; Wiley-Interscience. |
+`--------------------------------------------------------------*/
+
+namespace oln {
+
+ using namespace ntg;
+
+ namespace convert {
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_rgb_to_yiq
+ : public abstract::color_conversion<3, inbits, rgb_traits,
+ 3, outbits, yiq_traits, f_rgb_to_yiq<inbits, outbits> >
+ {
+ color<3, inbits, yiq_traits>
+ doit(const color<3, outbits, rgb_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ out[yiq_Y] =
+ 0.1768 * in[rgb_R] + 0.8130 * in[rgb_G] + 0.0101 * in[rgb_B];
+ out[yiq_I] =
+ 0.5346 * in[rgb_R] - 0.2461 * in[rgb_G] - 0.1791 * in[rgb_B];
+ out[yiq_Q] =
+ 0.2474 * in[rgb_R] - 0.6783 * in[rgb_G] + 0.4053 * in[rgb_B];
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_rgb_to_yiq<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, yiq_traits>
+ rgb_to_yiq(const color<3, inbits, rgb_traits>& v)
+ {
+ f_rgb_to_yiq<inbits, outbits> f;
+
+ return f(v);
+ }
+
+ template<unsigned inbits, unsigned outbits>
+ struct f_yiq_to_rgb
+ : public abstract::color_conversion<3, inbits, yiq_traits,
+ 3, outbits, rgb_traits, f_yiq_to_rgb<inbits, outbits> >
+ {
+ color<3, inbits, rgb_traits>
+ doit(const color<3, outbits, yiq_traits>& v) const
+ {
+ vec<3, float> in = v.to_float();
+ vec<3, float> out;
+ out[rgb_R] = 0.87 * in[yiq_Y] + 1.3223 * in[yiq_I] + 0.5628 * in[yiq_Q];
+ out[rgb_G] = 1.026 * in[yiq_Y] - 0.2718 * in[yiq_I] - 0.1458 * in[yiq_Q];
+ out[rgb_B] = 1.186 * in[yiq_Y] - 1.2620 * in[yiq_I] + 1.8795 * in[yiq_Q];
+ return out;
+ }
+
+ static std::string
+ name()
+ {
+ std::ostringstream s;
+ s << "f_yiq_to_rgb<" << inbits << ", " << outbits << '>';
+ s.str();
+ }
+ };
+
+ template <unsigned inbits, unsigned outbits>
+ color<3, outbits, rgb_traits>
+ yiq_to_rgb(const color<3, inbits, yiq_traits>& v)
+ {
+ f_yiq_to_rgb<inbits, outbits> f;
+
+ return f(v);
+ }
+
+ } // convert
+} // oln
+
+#endif // OLENA_CONVERT_RGBYIQ_HH
Index: olena/oln/snakes/snakes_base.hxx
--- olena/oln/snakes/snakes_base.hxx Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/snakes_base.hxx Thu, 22 Jan 2004 21:39:24 +0100 palma_g (oln/f/11_snakes_bas 1.1 644)
@@ -0,0 +1,84 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SNAKES_BASE_HXX
+# define OLENA_SNAKES_SNAKES_BASE_HXX
+
+#include <oln/morpho/gradient.hh>
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class algorithm>
+ snake<algorithm>::snake(const image_type& image,
+ std::list<point_type> initial_contour,
+ ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi = 0.0f) :
+ s(initial_contour), a(alpha, beta, gamma, khi),
+ alpha(alpha), beta(beta), gamma(gamma), khi(khi)
+ {
+ gradient = morpho::fast::beucher_gradient(image, win_c8p());
+ };
+
+ template <class algorithm>
+ std::list<typename snake<algorithm>::point_type>
+ snake<algorithm>::contour(void) const
+ {
+ return s.contour();
+ }
+
+ template <class algorithm>
+ ntg::float_s
+ snake<algorithm>::energy(void) const
+ {
+ return s.energy(gradient);
+ }
+
+ template <class algorithm>
+ inline
+ int
+ snake<algorithm>::update_snake(void)
+ {
+ return a.update_snake(gradient, *this);
+ }
+
+ template <class algorithm>
+ inline
+ void
+ snake<algorithm>::converge(void)
+ {
+ a.converge(gradient, *this);
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_SNAKES_BASE_HXX
Index: olena/oln/snakes/snakes_base.hh
--- olena/oln/snakes/snakes_base.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/snakes_base.hh Thu, 22 Jan 2004 21:39:25 +0100 palma_g (oln/f/50_snakes_bas 1.1 644)
@@ -0,0 +1,124 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SNAKES_BASE_HH
+# define OLENA_SNAKES_SNAKES_BASE_HH
+
+#include <oln/snakes/segment.hh>
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class algorithm>
+ class snake
+ {
+ public:
+ typedef typename algorithm::image_type image_type;
+ typedef typename image_type::point_type point_type;
+
+ public:
+ snake(const image_type& image,
+ std::list<point_type> initial_contour,
+ ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi);
+
+ public:
+ std::list<point_type>
+ contour(void) const;
+ ///< Return the points of the snake.
+
+ ntg::float_s
+ energy(void) const;
+ ///< Return the snake energy. This is not algorithm-dependant.
+
+ public:
+ int
+ update_snake(void);
+ ///< Calling this method causes the snake to execute one
+ ///< step. If the method is not iterative, it should fail
+ ///< to compile.
+
+ void
+ converge(void);
+ ///< Calling this method causes the snake to converge. It
+ ///< does so by delegating the method to the algorithm.
+
+ private:
+ segment<image_type> s;
+ ///< The current point list, I mean the one that is returned
+ ///< when nodes() is called and the one on which energy() computes
+ ///< the global energy. Implementations that use several segments
+ ///< should just do so in the algorithm class.
+
+ algorithm a;
+ ///< This one is just the instance that holds algorithm-specific
+ //< information, that is to say nearly every information.
+
+ private:
+ ///< Image gradient.
+ image_type gradient;
+
+ private:
+ ///< Each energy is weighted by a its own coefficient.
+ ntg::float_s alpha; ///< Weight of the continuity energy.
+ ntg::float_s beta; ///< Weight of the curvature energy.
+ ntg::float_s gamma; ///< Weight of the image energy.
+ ntg::float_s khi; ///< Weight of the image energy.
+
+ private:
+ friend
+ int
+ algorithm::update_snake(const typename algorithm::image_type&, snake&);
+
+ friend
+ void
+ algorithm::converge(const typename algorithm::image_type&, snake&);
+
+ friend
+ std::ostream&
+ ::operator<< <>(std::ostream&, const snake&);
+ };
+
+ } // end snakes
+
+} // end oln
+
+template <class algorithm>
+std::ostream& operator<<(std::ostream& os,
+ const oln::snakes::snake<algorithm>& s)
+{
+ os << "Snake:" << std::endl;
+ os << s.s;
+ return os;
+}
+
+#include <oln/snakes/snakes_base.hxx>
+
+#endif // !OLENA_SNAKES_SNAKES_BASE_HH
Index: olena/oln/snakes/energies.hxx
--- olena/oln/snakes/energies.hxx Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/energies.hxx Thu, 22 Jan 2004 21:40:50 +0100 palma_g (oln/j/21_energies.h 1.1 664)
@@ -0,0 +1,82 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_ENERGIES_HXX
+# define OLENA_SNAKES_ENERGIES_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+
+ template <class I>
+ inline
+ ntg::float_s
+ continuity_energy<I>::compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>&)
+ {
+ ntg::float_s d = *average_dist - (current - prev).norm2();
+ return d > 0 ? d : -d;
+ }
+
+ template <class I>
+ inline
+ ntg::float_s
+ curvature_energy<I>::compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>& next)
+ {
+ typename I::point_type twice_current;
+
+ twice_current.row() = 2 * current.row();
+ twice_current.col() = 2 * current.col();
+ return (next + (prev - twice_current) -
+ typename I::point_type(0,0)).norm2();
+ }
+
+ template <class I>
+ inline
+ ntg::float_s
+ image_energy<I>::compute(const I& gradient,
+ const node<I>&,
+ const node<I>& current,
+ const node<I>&)
+ {
+ // FIXME: Add magic trick: if there is very little gradient difference,
+ // don't pay too much attention to it.
+ // If max_gradient < min_gradient + 5: max_gradient = min_gradient + 5
+ return ntg_sup_val(oln_value_type(I)) - gradient[current];
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_ENERGIES_HXX
Index: olena/oln/snakes/energies.hh
--- olena/oln/snakes/energies.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/energies.hh Thu, 22 Jan 2004 21:39:25 +0100 palma_g (oln/j/22_energies.h 1.1 664)
@@ -0,0 +1,163 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_ENERGIES_HH
+# define OLENA_SNAKES_ENERGIES_HH
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ class energy
+ {
+ public:
+ energy() {}
+ energy(void *) {}
+
+ public:
+ ntg::float_s
+ compute(const I&, const node<I>&, const node<I>&, const node<I>&)
+ {
+ // This is intended to cause an error. The user must define a
+ // member function named `compute()' for each external energy,
+ // otherwise the following method will be compiled and cause an
+ // error.
+ user_defined_external_energy_functor::compute();
+ return 0.f;
+ }
+
+ public:
+ static void* cookie() { return 0; };
+
+ private:
+ struct user_defined_external_energy_functor{};
+ };
+
+
+ template <class I>
+ class continuity_energy : public energy<I>
+ {
+ public:
+ typedef I image_type;
+
+ public:
+ continuity_energy(ntg::float_s* average_dist) :
+ average_dist(average_dist) {}
+
+ public:
+ inline
+ ntg::float_s
+ compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>&);
+
+ private:
+ ntg::float_s* average_dist;
+ };
+
+
+ template <class I>
+ class curvature_energy : public energy<I>
+ {
+ public:
+ typedef I image_type;
+
+ public:
+ curvature_energy(void *) {}
+
+ public:
+ static inline
+ ntg::float_s
+ compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>& next);
+ };
+
+
+ template <class I>
+ class image_energy : public energy<I>
+ {
+ public:
+ typedef I image_type;
+
+ public:
+ image_energy(void*) {}
+
+ public:
+ static inline
+ ntg::float_s
+ compute(const I& gradient,
+ const node<I>&,
+ const node<I>& current,
+ const node<I>&);
+ };
+
+
+ // This macro allows the user to define his own external energy.
+#define oln_snakes_define_external_energy(Energy, Gradient, PrevNode, CurrentNode, NextNode) \
+ \
+template<class I> \
+class Energy : public energy<I> \
+{ \
+public: \
+ typedef I image_type; \
+ \
+public: \
+ Energy(void*) {} \
+ \
+public: \
+ ::ntg::float_s \
+ compute(const I& gradient, \
+ const ::oln::snakes::node<I>&, \
+ const ::oln::snakes::node<I>&, \
+ const ::oln::snakes::node<I>&); \
+}; \
+ \
+template<class I> \
+::ntg::float_s \
+Energy<I>::compute(const I& Gradient, \
+ const ::oln::snakes::node<I>& PrevNode, \
+ const ::oln::snakes::node<I>& CurrentNode, \
+ const ::oln::snakes::node<I>& NextNode)
+
+
+ // Default external energy.
+ oln_snakes_define_external_energy(dummy_energy,,,,)
+ {
+ return 0;
+ }
+
+ } // end snakes
+
+} // end oln
+
+#include <oln/snakes/energies.hxx>
+
+#endif // !OLENA_SNAKES_ENERGIES_HH
Index: olena/oln/snakes/segment.hxx
--- olena/oln/snakes/segment.hxx Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/segment.hxx Thu, 22 Jan 2004 21:39:26 +0100 palma_g (oln/j/23_segment.hx 1.1 644)
@@ -0,0 +1,132 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SEGMENT_HXX
+# define OLENA_SNAKES_SEGMENT_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ segment<I>::segment(std::list<point_type>& initial_contour) :
+ prev_segment(*this), next_segment(*this)
+ {
+ for (typename std::list<point_type>::const_iterator
+ it = initial_contour.begin();
+ it != initial_contour.end();
+ ++it)
+ nodes.push_back(*it);
+ }
+
+ template <class I>
+ inline
+ ntg::float_s
+ segment<I>::energy(const I& gradient) const
+ {
+ ntg::float_s e = 0.f;
+ typename segment<I>::const_iter_type p = nodes.begin();
+ typename segment<I>::const_iter_type c = nodes.begin();
+ typename segment<I>::const_iter_type n = nodes.begin();
+
+ ++n;
+ e += c->energy(gradient, prev_node(), *n);
+ for (++c, ++n; n != nodes.end(); ++p, ++c, ++n)
+ e += c->energy(gradient, *p, *n);
+ e += c->energy(gradient, *p, next_node());
+ return e;
+ }
+
+ template <class I>
+ std::list<typename segment<I>::point_type>
+ segment<I>::contour(void) const
+ {
+ std::list<point_type> result;
+
+ for (typename segment<I>::const_iter_type it = nodes.begin();
+ it != nodes.end(); ++it)
+ result.push_back(*it);
+ return result;
+ }
+
+ template <class I>
+ typename segment<I>::const_iter_type
+ segment<I>::begin(void) const
+ {
+ return nodes.begin();
+ }
+ template <class I>
+ typename segment<I>::iter_type
+ segment<I>::begin(void)
+ {
+ return nodes.begin();
+ }
+
+ template <class I>
+ typename segment<I>::const_iter_type
+ segment<I>::end(void) const
+ {
+ return nodes.end();
+ }
+ template <class I>
+ typename segment<I>::iter_type
+ segment<I>::end(void)
+ {
+ return nodes.end();
+ }
+
+ template <class I>
+ const node<I>
+ segment<I>::prev_node(void) const
+ {
+ return prev_segment.back();
+ }
+ template <class I>
+ const node<I>
+ segment<I>::next_node(void) const
+ {
+ return next_segment.front();
+ }
+
+ template <class I>
+ const node<I>
+ segment<I>::front(void) const
+ {
+ return nodes.front();
+ }
+ template <class I>
+ const node<I>
+ segment<I>::back(void) const
+ {
+ return nodes.back();
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_SEGMENT_HXX
Index: olena/oln/snakes/greedy.hxx
--- olena/oln/snakes/greedy.hxx Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/greedy.hxx Thu, 22 Jan 2004 21:39:26 +0100 palma_g (oln/j/24_greedy.hxx 1.1 644)
@@ -0,0 +1,210 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_GREEDY_HXX
+# define OLENA_SNAKES_GREEDY_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+
+ template <int N, class I, template<typename> class external_energy>
+ greedy<N, I, external_energy>::greedy(ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi) :
+ continuity_e(&average_dist),
+ curvature_e(curvature_energy<I>::cookie()),
+ image_e(image_energy<I>::cookie()),
+ external_e(external_energy<I>::cookie()),
+ alpha(alpha), beta(beta), gamma(gamma), khi(khi)
+ {
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ int
+ greedy<N, I, external_energy>::
+ update_snake(const I& gradient, snake<greedy<N, I, external_energy> >& s)
+ {
+ /// This place is left void to make room for a future extension
+ /// where a snake will be able to hold several segments.
+ average_dist = compute_average_dist(s.s);
+ return update_segment(gradient, s.s);
+ }
+
+ template <int N, class I, template<typename> class external_energy>
+ void
+ greedy<N, I, external_energy>::
+ converge(const I& gradient, snake<greedy<N, I, external_energy> >& s)
+ {
+ // FIXME: think of a real stop condition.
+ unsigned i = 0;
+ while (threshold < update_segment(gradient, s.s))
+ {
+ average_dist = compute_average_dist(s.s);
+ std::cout << i << ' ' << s.s << std::endl;
+ ++i;
+ };
+ }
+
+ template <int N, class I, template<typename> class external_energy>
+ int
+ greedy<N, I, external_energy>::update_segment(const I& gradient,
+ segment<I>& s)
+ {
+ int nb_updates = 0;
+ typename segment<I>::iter_type p = s.begin();
+ typename segment<I>::iter_type c = s.begin();
+ typename segment<I>::iter_type n = s.begin();
+
+ ++n;
+ nb_updates += update_node(gradient, s.prev_node(), *c, *n) ? 1 : 0;
+ for (++c, ++n; n != s.end(); ++p, ++c, ++n)
+ nb_updates += update_node(gradient, *p, *c, *n) ? 1 : 0;
+ nb_updates += update_node(gradient, *p, *c, s.next_node()) ? 1 : 0;
+ return nb_updates;
+ }
+
+ template <int N, class I, template<typename> class external_energy>
+ bool
+ greedy<N, I, external_energy>::update_node(const I& gradient,
+ const node<I>& prev,
+ node<I>& current,
+ const node<I>& next)
+ ///< Return whether the point has changed or not.
+ {
+ store_type energy;
+ ntg::float_s minimum = ntg_sup_val(ntg::float_s);
+ dpoint2d minimum_location;
+
+ energy = compute_and_normalize_energy<continuity_energy<I> >
+ (gradient, prev, current, next, continuity_e) * alpha;
+ energy += compute_and_normalize_energy<curvature_energy<I> >
+ (gradient, prev, current, next, curvature_e) * beta;
+ energy += compute_and_normalize_energy<image_energy<I> >
+ (gradient, prev, current, next, image_e) * gamma;
+ energy += compute_and_normalize_energy<external_energy<I> >
+ (gradient, prev, current, next, external_e) * khi;
+
+ window2d::iter_type it(neighborhood);
+ for_all(it)
+ {
+ if (minimum > energy(it.cur().col(), it.cur().row()))
+ {
+ minimum = energy(it.cur().col(), it.cur().row());
+ minimum_location = it;
+ }
+ }
+ if (0 != minimum_location.col() || 0 != minimum_location.row())
+ {
+ current += minimum_location;
+ return true;
+ }
+ return false;
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ template <class energy_functor>
+ inline
+ typename greedy<N, I, external_energy>::store_type
+ greedy<N, I, external_energy>::
+ compute_and_normalize_energy
+ (const typename energy_functor::image_type& gradient,
+ const node<typename energy_functor::image_type>& prev,
+ const node<typename energy_functor::image_type>& current,
+ const node<typename energy_functor::image_type>& next,
+ energy_functor functor)
+ {
+ store_type energy;
+ ntg::float_s energy_min = ntg_sup_val(ntg::float_s);
+ ntg::float_s energy_max = ntg_inf_val(ntg::float_s);
+
+ // Compute energy of each point of the neighborhood. Those are
+ // not normalized yet.
+ window2d::iter_type it(neighborhood);
+ for_all(it)
+ {
+ ntg::float_s e = functor.compute(gradient, prev, current + it, next);
+
+ // Find minimal and maximal energy on the fly, for we need them
+ // thereafter.
+ if (e > energy_max) energy_max = e;
+ if (e < energy_min) energy_min = e;
+ // Store it in a temporary location.
+ energy(it.cur().col(), it.cur().row()) = e;
+ }
+ if (energy_max > 0)
+ {
+ ntg::float_s invmax = 1 / (energy_max - energy_min);
+ window2d::iter_type itw(neighborhood);
+ for_all(itw)
+ {
+ ntg::float_s tmp = energy(itw.cur().col(), itw.cur().row()) -
+ energy_min;
+ tmp *= invmax;
+ energy(itw.cur().col(), itw.cur().row()) = tmp;
+ }
+ }
+ return energy;
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ ntg::float_s
+ greedy<N, I, external_energy>::compute_average_dist(const segment<I>& s)
+ {
+ ntg::float_s mean = 0.f;
+
+ typename segment<I>::const_iter_type prev = s.begin();
+ typename segment<I>::const_iter_type cur = s.begin();
+ unsigned card = 0;
+ for (++cur; cur != s.end(); ++prev, ++cur)
+ {
+ mean += (*cur - *prev).norm2();
+ ++card;
+ }
+ return mean / (ntg::float_s)card;
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ const int greedy<N, I, external_energy>::threshold = 3; // FIXME:
+
+
+ template <int N, class I, template<typename> class external_energy>
+ window2d greedy<N, I, external_energy>::neighborhood = mk_win_square(N);
+
+
+ } // end snakes
+
+} // end oln
+
+
+#endif // !OLENA_SNAKES_GREEDY_HXX
Index: olena/oln/snakes/greedy.hh
--- olena/oln/snakes/greedy.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/greedy.hh Thu, 22 Jan 2004 21:39:26 +0100 palma_g (oln/j/25_greedy.hh 1.1 644)
@@ -0,0 +1,121 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_GREEDY_HH
+# define OLENA_SNAKES_GREEDY_HH
+
+#include <oln/snakes/snakes_base.hh>
+#include <oln/snakes/energies.hh>
+#include <mlc/array/2d.hh>
+
+namespace oln {
+
+ namespace snakes {
+
+ /// N is the size of the neighborhood.
+ template <int N, class I, template<typename> class external_energy = dummy_energy>
+ class greedy
+ {
+ public:
+ typedef I image_type;
+ typedef typename I::point_type point_type;
+ typedef mlc::array2d<mlc::array2d_info<N,N>, ntg::float_s> store_type;
+ // FIXME: why only 2d?
+
+ public:
+ greedy(ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi);
+
+ public:
+ inline
+ int
+ update_snake(const I& gradient, snake<greedy>& s);
+ ///< Asynchronous update for more efficient convergence.
+
+ void
+ converge(const I& gradient, snake<greedy>& s);
+
+
+ private:
+ inline
+ int
+ update_segment(const I& gradient, segment<I>& s);
+
+ inline
+ bool
+ update_node(const I& gradient,
+ const node<I>& prev, node<I>& n, const node<I>& next);
+
+ private:
+ template <class energy_functor>
+ inline
+ store_type
+ compute_and_normalize_energy
+ (const typename energy_functor::image_type& gradient,
+ const node<typename energy_functor::image_type>& prev,
+ const node<typename energy_functor::image_type>& current,
+ const node<typename energy_functor::image_type>& next,
+ energy_functor functor);
+
+ private:
+ ntg::float_s average_dist;
+ ///< Average distance between the points of the contour.
+
+ inline
+ ntg::float_s
+ compute_average_dist(const segment<I>& s);
+
+ private:
+ continuity_energy<I> continuity_e;
+ curvature_energy<I> curvature_e;
+ image_energy<I> image_e;
+ external_energy<I> external_e;
+
+ private:
+ ///< Each energy is weighted by a its own coefficient.
+ ntg::float_s alpha; ///< Weight of the continuity energy.
+ ntg::float_s beta; ///< Weight of the curvature energy.
+ ntg::float_s gamma; ///< Weight of the image energy.
+ ntg::float_s khi; ///< Weight of the image energy.
+
+ private:
+ static const int threshold;
+ // FIXME: think about a real stop condition.
+ private:
+ static window2d neighborhood;
+ // FIXME: better write an iterator on arrays.
+ };
+
+ } // end snakes
+
+} // end oln
+
+#include <oln/snakes/greedy.hxx>
+
+#endif // !OLENA_SNAKES_GREEDY_HH
Index: olena/oln/snakes/node.hh
--- olena/oln/snakes/node.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/node.hh Thu, 22 Jan 2004 21:39:26 +0100 palma_g (oln/j/32_node.hh 1.1 644)
@@ -0,0 +1,74 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_NODE_HH
+# define OLENA_SNAKES_NODE_HH
+
+#include <oln/basics2d.hh> // FIXME: Why only 2d?
+
+namespace oln {
+
+ namespace snakes {
+
+ template<class I>
+ class node : public I::point_type
+ {
+ public:
+ typedef typename I::point_type point_type;
+ typedef typename I::dpoint_type dpoint_type;
+
+ public:
+ node(point_type point) :
+ I::point_type(point)
+ {
+ }
+
+ public:
+ inline
+ ntg::float_s
+ energy(const I& gradient, point_type prev, point_type next) const;
+
+ private:
+ friend std::ostream&
+ ::operator<< <>(std::ostream&, const node&);
+ };
+
+ } // end snakes
+
+} // end oln
+
+
+template <class I>
+std::ostream& operator<<(std::ostream& os, const oln::snakes::node<I>& n)
+{
+ os << "Node:" << static_cast<typename oln::snakes::node<I>::point_type>(n);
+ return os;
+}
+
+#include <oln/snakes/node.hxx>
+
+#endif // !OLENA_SNAKES_NODE_HH
Index: olena/oln/snakes/node.hxx
--- olena/oln/snakes/node.hxx Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/node.hxx Thu, 22 Jan 2004 21:39:27 +0100 palma_g (oln/j/33_node.hxx 1.1 644)
@@ -0,0 +1,46 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_NODE_HXX
+# define OLENA_SNAKES_NODE_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ ntg::float_s
+ node<I>::energy(const I& gradient, point_type prev, point_type next) const
+ {
+ return 42; // FIXME: compute the real value.
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_NODE_HXX
Index: olena/oln/snakes/segment.hh
--- olena/oln/snakes/segment.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
+++ olena/oln/snakes/segment.hh Thu, 22 Jan 2004 21:39:27 +0100 palma_g (oln/j/34_segment.hh 1.1 644)
@@ -0,0 +1,107 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SEGMENT_HH
+# define OLENA_SNAKES_SEGMENT_HH
+
+#include <oln/snakes/node.hh>
+
+#include <vector>
+#include <list>
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ class segment
+ {
+ public:
+ typedef typename std::vector<node<I> >::iterator iter_type;
+ typedef typename std::vector<node<I> >::const_iterator const_iter_type;
+ typedef typename I::point_type point_type;
+
+ public:
+ segment(std::list<point_type>& initial_contour);
+
+ public:
+ inline
+ ntg::float_s
+ energy(const I& gradient) const;
+ ///< Just iterate through the vector and sums up point energies.
+
+ public:
+ std::list<point_type>
+ contour(void) const;
+ ///< Return the points of the segment.
+
+ public:
+ const_iter_type begin(void) const;
+ iter_type begin(void);
+ ///< Return an iterator on the first node of the segment.
+ const_iter_type end(void) const;
+ iter_type end(void);
+ ///< Return an iterator on the last node of the segment.
+
+ public:
+ const node<I> prev_node(void) const;
+ ///< Node before the first node of this segment.
+ const node<I> next_node(void) const;
+ ///< Node after the next node of this segment.
+
+ private:
+ std::vector<node<I> > nodes;
+ segment& prev_segment;
+ segment& next_segment;
+
+ const node<I> front(void) const;
+ const node<I> back(void) const;
+
+ friend
+ std::ostream&
+ ::operator<< <>(std::ostream&, const segment&);
+ };
+
+ } // end snakes
+
+} // end oln
+
+
+template <class I>
+std::ostream& operator<<(std::ostream& os, const oln::snakes::segment<I>& s)
+{
+ os << "Segment:" << std::endl;
+ for (typename oln::snakes::segment<I>::const_iter_type it = s.begin();
+ it != s.end();
+ ++it)
+ os << *it << std::endl;
+ return os;
+}
+
+#include <oln/snakes/segment.hxx>
+
+#endif // !OLENA_SNAKES_SEGMENT_HH
Index: olena/oln/convert/nrgbhsi.hh
--- olena/oln/convert/nrgbhsi.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/15_nrgbhsi.hh 1.12 640)
+++ olena/oln/convert/nrgbhsi.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
@@ -1,136 +0,0 @@
-// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBHSI_HH
-# define OLENA_CONVERT_NRGBHSI_HH
-
-# include <oln/convert/abstract/colorconv.hh>
-
-# include <ntg/basics.hh>
-# include <ntg/color/nrgb.hh>
-# include <ntg/color/hsi.hh>
-
-# include <sstream>
-
-/*--------------------------------------------------------------.
-| The formulas used here come from ``Digital Image Processing |
-| Algorithms and Applications'', I. Pitas; Wiley-Interscience. |
-`--------------------------------------------------------------*/
-
-namespace oln {
-
- using namespace ntg;
-
- namespace convert {
-
- static const float sqrt3_3 = sqrt(3) / 3;
- static const float inv_sqrt6 = 1 / sqrt(6);
- static const float inv_sqrt2 = 1 / sqrt(2);
-
- template<unsigned inbits, unsigned outbits>
- struct f_nrgb_to_hsi
- : public abstract::color_conversion<3, inbits, nrgb_traits,
- 3, outbits, hsi_traits, f_nrgb_to_hsi<inbits, outbits> >
- {
- color<3, inbits, hsi_traits>
- doit(const color<3, outbits, nrgb_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- out[hsi_I] =
- sqrt3_3 * in[nrgb_R] + sqrt3_3 * in[nrgb_G] + sqrt3_3 * in[nrgb_B];
- const float v1 = inv_sqrt2 * in[nrgb_G] - inv_sqrt2 * in[nrgb_B];
- const float v2 = 2 * inv_sqrt6 * in[nrgb_R] - inv_sqrt6 * in[nrgb_G]
- - inv_sqrt6 * in[nrgb_B];
- out[hsi_H] = atan2(v2, v1) / M_PI * 180.0;
- if (out[hsi_H] < 0)
- out[hsi_H] += 360.0;
- assert(out[hsi_H] >= 0);
- out[hsi_S] = sqrt(v1 * v1 + v2 * v2);
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_nrgb_to_hsi<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, hsi_traits>
- nrgb_to_hsi(const color<3, inbits, nrgb_traits>& v)
- {
- f_nrgb_to_hsi<inbits, outbits> f;
-
- return f(v);
- }
-
- template<unsigned inbits, unsigned outbits>
- struct f_hsi_to_nrgb
- : public abstract::color_conversion<3, inbits, hsi_traits,
- 3, outbits, nrgb_traits, f_hsi_to_nrgb<inbits, outbits> >
- {
- color<3, outbits, nrgb_traits>
- doit(const color<3, inbits, hsi_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- const float h = in[hsi_H] / 180.0 * M_PI;
- const float v1 = in[hsi_S] * cos(h);
- const float v2 = in[hsi_S] * sin(h);
- out[nrgb_R] = sqrt3_3 * in[hsi_I] + 2 * inv_sqrt6 * v2;
- out[nrgb_G] = sqrt3_3 * in[hsi_I] + inv_sqrt2 * v1 - inv_sqrt6 * v2;
- out[nrgb_B] = sqrt3_3 * in[hsi_I] - inv_sqrt2 * v1 - inv_sqrt6 * v2;
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_hsi_to_nrgb<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, nrgb_traits>
- hsi_to_nrgb (const color<3, inbits, hsi_traits>& v)
- {
- f_hsi_to_nrgb<inbits, outbits> f;
-
- return f(v);
- }
-
- } // convert
-} // oln
-
-#endif // OLENA_CONVERT_NRGBHSI_HH
Index: olena/oln/convert/nrgbhsl.hh
--- olena/oln/convert/nrgbhsl.hh Wed, 08 Oct 2003 23:36:51 +0200 burrus_n (oln/12_nrgbhsl.hh 1.17 640)
+++ olena/oln/convert/nrgbhsl.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
@@ -1,187 +0,0 @@
-// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBHSL_HH
-# define OLENA_CONVERT_NRGBHSL_HH
-
-# include <oln/basics.hh>
-# include <oln/convert/abstract/colorconv.hh>
-
-# include <ntg/basics.hh>
-# include <ntg/color/nrgb.hh>
-# include <ntg/color/hsl.hh>
-
-# include <mlc/contract.hh>
-
-# include <cstdlib>
-# include <sstream>
-
-/*------------------------------------------------------------------.
-| The formulas used here come from ``Color space conversion''; Paul |
-| Bourke. |
-`------------------------------------------------------------------*/
-
-namespace oln {
-
- using namespace ntg;
-
- namespace convert {
-
- template<unsigned inbits, unsigned outbits>
- struct f_nrgb_to_hsl
- : public abstract::color_conversion<3, inbits, nrgb_traits,
- 3, outbits, hsl_traits, f_nrgb_to_hsl<inbits, outbits> >
- {
- color<3, outbits, hsl_traits>
- doit(const color<3, inbits, nrgb_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
-
- float max_in = ntg::max(in[nrgb_R], std::max(in[nrgb_B], in[nrgb_G]));
- float min_in = ntg::min(in[nrgb_R], std::min(in[nrgb_B], in[nrgb_G]));
- float diff = max_in-min_in;
-
- out[hsl_L] = (max_in + min_in) / 2;
- if (std::abs(diff) <= FLT_EPSILON){
- out[hsl_S] = 0;
- out[hsl_H] = 0; // undefined
- }
- else {
- if (out[hsl_L] <= 0.5)
- out[hsl_S] = diff / (max_in + min_in);
- else
- out[hsl_S] = diff / (2 - max_in - min_in);
-
-
- float r_dist = (max_in - in[nrgb_R]) / diff;
- float g_dist = (max_in - in[nrgb_G]) / diff;
- float b_dist = (max_in - in[nrgb_B]) / diff;
-
- if (in[nrgb_R] == max_in)
- out[hsl_H] = b_dist - g_dist;
- else if(in[nrgb_G] == max_in)
- out[hsl_H] = 2 + r_dist - b_dist;
- else if(in[nrgb_B] == max_in)
- out[hsl_H] = 4 + g_dist - r_dist;
-
- out[hsl_H] *= 60;
- if(out[hsl_H] < 0)
- out[hsl_H] += 360;
- }
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_nrgb_to_hsl<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, inbits, hsl_traits>
- nrgb_to_hsl(const color<3, outbits, nrgb_traits>& v)
- {
- f_nrgb_to_hsl<inbits, outbits> f;
- return f(v);
- }
-
- namespace internal {
- float
- RGB(float q1, float q2, float hue)
- {
- if (hue >= 360)
- hue -= 360;
- if (hue < 0)
- hue += 360;
- if (hue < 60)
- return q1 + (q2 - q1) * hue / 60;
- else if (hue < 180)
- return q2;
- else if (hue < 240)
- return q1 + (q2 - q1) * (240 - hue) / 60;
- else
- return q1;
- }
- }
-
- template<unsigned inbits, unsigned outbits>
- struct f_hsl_to_nrgb
- : public abstract::color_conversion<3, inbits, hsl_traits,
- 3, outbits, nrgb_traits, f_hsl_to_nrgb<inbits, outbits> >
- {
- color<3, outbits, nrgb_traits>
- doit(const color<3, inbits, hsl_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- float p2;
-
- if(in[hsl_L] < 0.5)
- p2 = in[hsl_L] * (1+in[hsl_S]);
- else
- p2 = in[hsl_L] + in[hsl_S] - (in[hsl_L] * in[hsl_S]);
-
- float p1 = 2 * in[hsl_L] - p2;
-
- if(in[hsl_S] == 0)
- out[nrgb_R] = out[nrgb_G] = out[nrgb_B] = in[hsl_L];
- else
- {
- out[nrgb_R] = internal::RGB(p1, p2, in[hsl_H] + 120);
- out[nrgb_G] = internal::RGB(p1, p2, in[hsl_H]);
- out[nrgb_B] = internal::RGB(p1, p2, in[hsl_H] - 120);
- }
-
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_hsl_to_nrgb<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template<unsigned inbits, unsigned outbits>
- color<3, outbits, nrgb_traits>
- hsl_to_nrgb(const color<3, inbits, hsl_traits>& v)
- {
- f_hsl_to_nrgb<inbits, outbits> f;
- return f(v);
- }
-
- } // convert
-} // oln
-
-#endif // OLENA_CONVERT_NRGBHSL_HH
Index: olena/oln/convert/nrgbhsv.hh
--- olena/oln/convert/nrgbhsv.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/11_nrgbhsv.hh 1.14 640)
+++ olena/oln/convert/nrgbhsv.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
@@ -1,188 +0,0 @@
-// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBHSV_HH
-# define OLENA_CONVERT_NRGBHSV_HH
-
-# include <oln/basics.hh>
-# include <oln/convert/abstract/colorconv.hh>
-
-# include <ntg/basics.hh>
-# include <ntg/color/nrgb.hh>
-# include <ntg/color/hsv.hh>
-
-# include <mlc/contract.hh>
-
-# include <sstream>
-
-/*-----------------------------------------------------------------.
-| The formulas used here come from ``Color Conversion Algorithms'' |
-`-----------------------------------------------------------------*/
-
-namespace oln {
-
- using namespace ntg;
-
- namespace convert {
-
- template<unsigned inbits, unsigned outbits>
- struct f_nrgb_to_hsv
- : public abstract::color_conversion<3, inbits, nrgb_traits,
- 3, outbits, hsv_traits, f_nrgb_to_hsv<inbits, outbits> >
- {
- color<3, outbits, hsv_traits>
- doit(const color<3, inbits, nrgb_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- float max_in = std::max(in[nrgb_R], std::max(in[nrgb_B], in[nrgb_G]));
- float min_in = std::min(in[nrgb_R], std::min(in[nrgb_B], in[nrgb_G]));
- float delta = max_in - min_in;
-
-
- out[hsv_V] = max_in;
-
- if (max_in != 0)
- out[hsv_S] = delta / max_in;
- else
- out[hsv_S] = 0;
-
- if (out[hsv_S] == 0)
- out[hsv_H] = -1; // undefined
- else {
- if (in[nrgb_R] == max_in)
- out[hsv_H] = (in[nrgb_G] - in[nrgb_B]) / delta;
- else if (in[nrgb_G] == max_in)
- out[hsv_H] = 2 + (in[nrgb_B] - in[nrgb_R]) / delta;
- else
- out[hsv_H] = 4 + (in[nrgb_R] - in[nrgb_G]) / delta;
- out[hsv_H] *= 60;
- if (out[hsv_H] < 0)
- out[hsv_H] += 360;
- }
-
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_nrgb_to_hsv<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, hsv_traits>
- nrgb_to_hsv(const color<3, inbits, nrgb_traits>& v)
- {
- f_nrgb_to_hsv<inbits, outbits> f;
- return f(v);
- }
-
- template<unsigned inbits, unsigned outbits>
- struct f_hsv_to_nrgb
- : public abstract::color_conversion<3, inbits, hsv_traits,
- 3, outbits, nrgb_traits, f_hsv_to_nrgb<inbits, outbits> >
- {
- color<3, outbits, nrgb_traits>
- doit(const color<3, inbits, hsv_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
-
- if(in[hsv_S] == 0)
- out[nrgb_G] = out[nrgb_B] = out[nrgb_R] = in[hsv_V];
- else
- {
- in[hsv_H] /= 60;
- int i = (int)floor (in[hsv_H]);
- float f = in[hsv_H] - i;
- float p = in[hsv_V] * (1 - in[hsv_S]);
- float q = in[hsv_V] * (1 - in[hsv_S] * f);
- float t = in[hsv_V] * (1 - in[hsv_S] * (1 - f));
-
- switch (i){
- case 0:
- case 6:
- out[nrgb_R] = in[hsv_V];
- out[nrgb_G] = t;
- out[nrgb_B] = p;
- break;
- case 1:
- out[nrgb_R] = q;
- out[nrgb_G] = in[hsv_V];
- out[nrgb_B] = p;
- break;
- case 2:
- out[nrgb_R] = p;
- out[nrgb_G] = in[hsv_V];
- out[nrgb_B] = t;
- break;
- case 3:
- out[nrgb_R] = p;
- out[nrgb_G] = q;
- out[nrgb_B] = in[hsv_V];
- break;
- case 4:
- out[nrgb_R] = t;
- out[nrgb_G] = p;
- out[nrgb_B] = in[hsv_V];
- break;
- default:
- out[nrgb_R] = in[hsv_V];
- out[nrgb_G] = p;
- out[nrgb_B] = q;
- break;
- }
- }
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_hsv_to_nrgb<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, nrgb_traits>
- hsv_to_nrgb(const color<3, inbits, hsv_traits>& v)
- {
- f_hsv_to_nrgb<inbits, outbits> f;
- return f(v);
- }
-
- } // convert
-} // oln
-
-#endif // OLENA_CONVERT_NRGBHSV_HH
Index: olena/oln/convert/nrgbyiq.hh
--- olena/oln/convert/nrgbyiq.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/14_nrgbyiq.hh 1.11 640)
+++ olena/oln/convert/nrgbyiq.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
@@ -1,125 +0,0 @@
-// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBYIQ_HH
-# define OLENA_CONVERT_NRGBYIQ_HH
-
-# include <oln/convert/abstract/colorconv.hh>
-
-# include <ntg/color/nrgb.hh>
-# include <ntg/color/yiq.hh>
-# include <ntg/basics.hh>
-
-# include <sstream>
-
-/*--------------------------------------------------------------.
-| The formulas used here come from ``Digital Image Processing |
-| Algorithms and Applications'', I. Pitas; Wiley-Interscience. |
-`--------------------------------------------------------------*/
-
-namespace oln {
-
- using namespace ntg;
-
- namespace convert {
-
- template<unsigned inbits, unsigned outbits>
- struct f_nrgb_to_yiq
- : public abstract::color_conversion<3, inbits, nrgb_traits,
- 3, outbits, yiq_traits, f_nrgb_to_yiq<inbits, outbits> >
- {
- color<3, inbits, yiq_traits>
- doit(const color<3, outbits, nrgb_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- out[yiq_Y] =
- 0.299 * in[nrgb_R] + 0.587 * in[nrgb_G] + 0.114 * in[nrgb_B];
- out[yiq_I] =
- 0.596 * in[nrgb_R] - 0.274 * in[nrgb_G] - 0.322 * in[nrgb_B];
- out[yiq_Q] =
- 0.211 * in[nrgb_R] - 0.523 * in[nrgb_G] + 0.312 * in[nrgb_B];
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_nrgb_to_yiq<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, yiq_traits>
- nrgb_to_yiq(const color<3, inbits, nrgb_traits>& v)
- {
- f_nrgb_to_yiq<inbits, outbits> f;
-
- return f(v);
- }
-
- template<unsigned inbits, unsigned outbits>
- struct f_yiq_to_nrgb
- : public abstract::color_conversion<3, inbits, yiq_traits,
- 3, outbits, nrgb_traits, f_yiq_to_nrgb<inbits, outbits> >
- {
- color<3, inbits, nrgb_traits>
- doit(const color<3, outbits, yiq_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- out[nrgb_R] = in[yiq_Y] + 0.95617 * in[yiq_I] + 0.62143 * in[yiq_Q];
- out[nrgb_G] = in[yiq_Y] - 0.27269 * in[yiq_I] - 0.64681 * in[yiq_Q];
- out[nrgb_B] = in[yiq_Y] - 1.10374 * in[yiq_I] + 1.70062 * in[yiq_Q];
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_yiq_to_nrgb<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, nrgb_traits>
- yiq_to_nrgb(const color<3, inbits, yiq_traits>& v)
- {
- f_yiq_to_nrgb<inbits, outbits> f;
-
- return f(v);
- }
-
- } // convert
-} // oln
-
-#endif // OLENA_CONVERT_NRGBYIQ_HH
Index: olena/oln/convert/nrgbyuv.hh
--- olena/oln/convert/nrgbyuv.hh Thu, 07 Aug 2003 02:08:21 +0200 david (oln/13_nrgbyuv.hh 1.12 640)
+++ olena/oln/convert/nrgbyuv.hh Thu, 22 Jan 2004 21:43:43 +0100 palma_g ()
@@ -1,126 +0,0 @@
-// Copyright (C) 2001, 2002, 2003 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, 59 Temple Place - Suite 330, 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 OLENA_CONVERT_NRGBYUV_HH
-# define OLENA_CONVERT_NRGBYUV_HH
-
-# include <oln/convert/abstract/colorconv.hh>
-
-# include <ntg/color/nrgb.hh>
-# include <ntg/color/yuv.hh>
-# include <ntg/basics.hh>
-
-# include <sstream>
-
-/*---------------------------------------------------------------.
-| The formulas used here come from ``Colour Space Conversions'', |
-| IAdrian Ford and Alan Roberts; August 11,1998. |
-`---------------------------------------------------------------*/
-
-namespace oln {
-
- using namespace ntg;
-
- namespace convert {
-
- template <unsigned inbits, unsigned outbits>
- struct f_nrgb_to_yuv
- : public abstract::color_conversion<3, inbits, nrgb_traits,
- 3, outbits, yuv_traits, f_nrgb_to_yuv<inbits, outbits> >
- {
- color<3, outbits, yuv_traits>
- doit(const color<3, inbits, nrgb_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- out[yuv_Y] =
- + 0.299 * in[nrgb_R] + 0.587 * in[nrgb_G] + 0.114 * in[nrgb_B];
- out[yuv_U] =
- - 0.147 * in[nrgb_R] - 0.289 * in[nrgb_G] + 0.436 * in[nrgb_B];
- out[yuv_V] =
- + 0.615 * in[nrgb_R] - 0.515 * in[nrgb_G] - 0.100 * in[nrgb_B];
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_nrgb_to_yuv<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, yuv_traits>
- nrgb_to_yuv(const color<3, inbits, nrgb_traits>& v)
- {
- f_nrgb_to_yuv<inbits, outbits> f;
-
- return f(v);
- }
-
- template<unsigned inbits, unsigned outbits>
- struct f_yuv_to_nrgb
- : public abstract::color_conversion<3, inbits, yuv_traits,
- 3, outbits, nrgb_traits, f_yuv_to_nrgb<inbits, outbits> >
- {
- color<3, outbits, nrgb_traits>
- doit(const color<3, inbits, yuv_traits>& v) const
- {
- vec<3, float> in = v.to_float();
- vec<3, float> out;
- out[nrgb_R] = in[yuv_Y] + 1.140 * in[yuv_V];
- out[nrgb_G] = in[yuv_Y] - 0.394 * in[yuv_U] - 0.581 * in[yuv_V];
- out[nrgb_B] = in[yuv_Y] + 2.028 * in[yuv_U];
-
- return out;
- }
-
- static std::string
- name()
- {
- std::ostringstream s;
- s << "f_yuv_to_nrgb<" << inbits << ", " << outbits << '>';
- s.str();
- }
- };
-
- template <unsigned inbits, unsigned outbits>
- color<3, outbits, nrgb_traits>
- yuv_to_nrgb(const color<3, inbits, yuv_traits>& v)
- {
- f_yuv_to_nrgb<inbits, outbits> f;
-
- return f(v);
- }
-
- } // convert
-} // oln
-
-#endif // OLENA_CONVERT_NRGBYUV_HH
--
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
Index: olena/ChangeLog
from Astrid Wang <astrid(a)lrde.epita.fr>
* oln/snakes/snakes_base.hh,
* oln/snakes/snakes_base.hxx,
* oln/snakes/segment.hh,
* oln/snakes/segment.hxx,
* oln/snakes/node.hh,
* oln/snakes/node.hxx,
* oln/snakes/energies.hh,
* oln/snakes/energies.hxx,
* oln/snakes/greedy.hh,
* oln/snakes/greedy.hxx: New.
Index: olena/oln/snakes/snakes_base.hxx
--- olena/oln/snakes/snakes_base.hxx Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/snakes_base.hxx Wed, 21 Jan 2004 04:36:32 +0100 astrid (oln/f/11_snakes_bas 644)
@@ -0,0 +1,84 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SNAKES_BASE_HXX
+# define OLENA_SNAKES_SNAKES_BASE_HXX
+
+#include <oln/morpho/gradient.hh>
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class algorithm>
+ snake<algorithm>::snake(const image_type& image,
+ std::list<point_type> initial_contour,
+ ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi = 0.0f) :
+ s(initial_contour), a(alpha, beta, gamma, khi),
+ alpha(alpha), beta(beta), gamma(gamma), khi(khi)
+ {
+ gradient = morpho::fast::beucher_gradient(image, win_c8p());
+ };
+
+ template <class algorithm>
+ std::list<typename snake<algorithm>::point_type>
+ snake<algorithm>::contour(void) const
+ {
+ return s.contour();
+ }
+
+ template <class algorithm>
+ ntg::float_s
+ snake<algorithm>::energy(void) const
+ {
+ return s.energy(gradient);
+ }
+
+ template <class algorithm>
+ inline
+ int
+ snake<algorithm>::update_snake(void)
+ {
+ return a.update_snake(gradient, *this);
+ }
+
+ template <class algorithm>
+ inline
+ void
+ snake<algorithm>::converge(void)
+ {
+ a.converge(gradient, *this);
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_SNAKES_BASE_HXX
Index: olena/oln/snakes/snakes_base.hh
--- olena/oln/snakes/snakes_base.hh Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/snakes_base.hh Wed, 21 Jan 2004 04:38:34 +0100 astrid (oln/f/50_snakes_bas 644)
@@ -0,0 +1,124 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SNAKES_BASE_HH
+# define OLENA_SNAKES_SNAKES_BASE_HH
+
+#include <oln/snakes/segment.hh>
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class algorithm>
+ class snake
+ {
+ public:
+ typedef typename algorithm::image_type image_type;
+ typedef typename image_type::point_type point_type;
+
+ public:
+ snake(const image_type& image,
+ std::list<point_type> initial_contour,
+ ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi);
+
+ public:
+ std::list<point_type>
+ contour(void) const;
+ ///< Return the points of the snake.
+
+ ntg::float_s
+ energy(void) const;
+ ///< Return the snake energy. This is not algorithm-dependant.
+
+ public:
+ int
+ update_snake(void);
+ ///< Calling this method causes the snake to execute one
+ ///< step. If the method is not iterative, it should fail
+ ///< to compile.
+
+ void
+ converge(void);
+ ///< Calling this method causes the snake to converge. It
+ ///< does so by delegating the method to the algorithm.
+
+ private:
+ segment<image_type> s;
+ ///< The current point list, I mean the one that is returned
+ ///< when nodes() is called and the one on which energy() computes
+ ///< the global energy. Implementations that use several segments
+ ///< should just do so in the algorithm class.
+
+ algorithm a;
+ ///< This one is just the instance that holds algorithm-specific
+ //< information, that is to say nearly every information.
+
+ private:
+ ///< Image gradient.
+ image_type gradient;
+
+ private:
+ ///< Each energy is weighted by a its own coefficient.
+ ntg::float_s alpha; ///< Weight of the continuity energy.
+ ntg::float_s beta; ///< Weight of the curvature energy.
+ ntg::float_s gamma; ///< Weight of the image energy.
+ ntg::float_s khi; ///< Weight of the image energy.
+
+ private:
+ friend
+ int
+ algorithm::update_snake(const typename algorithm::image_type&, snake&);
+
+ friend
+ void
+ algorithm::converge(const typename algorithm::image_type&, snake&);
+
+ friend
+ std::ostream&
+ ::operator<< <>(std::ostream&, const snake&);
+ };
+
+ } // end snakes
+
+} // end oln
+
+template <class algorithm>
+std::ostream& operator<<(std::ostream& os,
+ const oln::snakes::snake<algorithm>& s)
+{
+ os << "Snake:" << std::endl;
+ os << s.s;
+ return os;
+}
+
+#include <oln/snakes/snakes_base.hxx>
+
+#endif // !OLENA_SNAKES_SNAKES_BASE_HH
Index: olena/oln/snakes/energies.hxx
--- olena/oln/snakes/energies.hxx Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/energies.hxx Wed, 21 Jan 2004 04:40:31 +0100 astrid (oln/j/21_energies.h 644)
@@ -0,0 +1,82 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_ENERGIES_HXX
+# define OLENA_SNAKES_ENERGIES_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+
+ template <class I>
+ inline
+ ntg::float_s
+ continuity_energy<I>::compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>&)
+ {
+ ntg::float_s d = *average_dist - (current - prev).norm2();
+ return d > 0 ? d : -d;
+ }
+
+ template <class I>
+ inline
+ ntg::float_s
+ curvature_energy<I>::compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>& next)
+ {
+ typename I::point_type twice_current;
+
+ twice_current.row() = 2 * current.row();
+ twice_current.col() = 2 * current.col();
+ return (next + (prev - twice_current) -
+ typename I::point_type(0,0)).norm2();
+ }
+
+ template <class I>
+ inline
+ ntg::float_s
+ image_energy<I>::compute(const I& gradient,
+ const node<I>&,
+ const node<I>& current,
+ const node<I>&)
+ {
+ // FIXME: Add magic trick: if there is very little gradient difference,
+ // don't pay too much attention to it.
+ // If max_gradient < min_gradient + 5: max_gradient = min_gradient + 5
+ return ntg_sup_val(oln_value_type(I)) - gradient[current];
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_ENERGIES_HXX
Index: olena/oln/snakes/energies.hh
--- olena/oln/snakes/energies.hh Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/energies.hh Wed, 21 Jan 2004 04:42:52 +0100 astrid (oln/j/22_energies.h 644)
@@ -0,0 +1,163 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_ENERGIES_HH
+# define OLENA_SNAKES_ENERGIES_HH
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ class energy
+ {
+ public:
+ energy() {}
+ energy(void *) {}
+
+ public:
+ ntg::float_s
+ compute(const I&, const node<I>&, const node<I>&, const node<I>&)
+ {
+ // This is intended to cause an error. The user must define a
+ // member function named `compute()' for each external energy,
+ // otherwise the following method will be compiled and cause an
+ // error.
+ user_defined_external_energy_functor::compute();
+ return 0.f;
+ }
+
+ public:
+ static void* cookie() { return 0; };
+
+ private:
+ struct user_defined_external_energy_functor{};
+ };
+
+
+ template <class I>
+ class continuity_energy : public energy<I>
+ {
+ public:
+ typedef I image_type;
+
+ public:
+ continuity_energy(ntg::float_s* average_dist) :
+ average_dist(average_dist) {}
+
+ public:
+ inline
+ ntg::float_s
+ compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>&);
+
+ private:
+ ntg::float_s* average_dist;
+ };
+
+
+ template <class I>
+ class curvature_energy : public energy<I>
+ {
+ public:
+ typedef I image_type;
+
+ public:
+ curvature_energy(void *) {}
+
+ public:
+ static inline
+ ntg::float_s
+ compute(const I&,
+ const node<I>& prev,
+ const node<I>& current,
+ const node<I>& next);
+ };
+
+
+ template <class I>
+ class image_energy : public energy<I>
+ {
+ public:
+ typedef I image_type;
+
+ public:
+ image_energy(void*) {}
+
+ public:
+ static inline
+ ntg::float_s
+ compute(const I& gradient,
+ const node<I>&,
+ const node<I>& current,
+ const node<I>&);
+ };
+
+
+ // This macro allows the user to define his own external energy.
+#define oln_snakes_define_external_energy(Energy, Gradient, PrevNode, CurrentNode, NextNode) \
+ \
+template<class I> \
+class Energy : public energy<I> \
+{ \
+public: \
+ typedef I image_type; \
+ \
+public: \
+ Energy(void*) {} \
+ \
+public: \
+ ::ntg::float_s \
+ compute(const I& gradient, \
+ const ::oln::snakes::node<I>&, \
+ const ::oln::snakes::node<I>&, \
+ const ::oln::snakes::node<I>&); \
+}; \
+ \
+template<class I> \
+::ntg::float_s \
+Energy<I>::compute(const I& Gradient, \
+ const ::oln::snakes::node<I>& PrevNode, \
+ const ::oln::snakes::node<I>& CurrentNode, \
+ const ::oln::snakes::node<I>& NextNode)
+
+
+ // Default external energy.
+ oln_snakes_define_external_energy(dummy_energy,,,,)
+ {
+ return 0;
+ }
+
+ } // end snakes
+
+} // end oln
+
+#include <oln/snakes/energies.hxx>
+
+#endif // !OLENA_SNAKES_ENERGIES_HH
Index: olena/oln/snakes/segment.hxx
--- olena/oln/snakes/segment.hxx Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/segment.hxx Wed, 21 Jan 2004 04:44:03 +0100 astrid (oln/j/23_segment.hx 644)
@@ -0,0 +1,132 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SEGMENT_HXX
+# define OLENA_SNAKES_SEGMENT_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ segment<I>::segment(std::list<point_type>& initial_contour) :
+ prev_segment(*this), next_segment(*this)
+ {
+ for (typename std::list<point_type>::const_iterator
+ it = initial_contour.begin();
+ it != initial_contour.end();
+ ++it)
+ nodes.push_back(*it);
+ }
+
+ template <class I>
+ inline
+ ntg::float_s
+ segment<I>::energy(const I& gradient) const
+ {
+ ntg::float_s e = 0.f;
+ typename segment<I>::const_iter_type p = nodes.begin();
+ typename segment<I>::const_iter_type c = nodes.begin();
+ typename segment<I>::const_iter_type n = nodes.begin();
+
+ ++n;
+ e += c->energy(gradient, prev_node(), *n);
+ for (++c, ++n; n != nodes.end(); ++p, ++c, ++n)
+ e += c->energy(gradient, *p, *n);
+ e += c->energy(gradient, *p, next_node());
+ return e;
+ }
+
+ template <class I>
+ std::list<typename segment<I>::point_type>
+ segment<I>::contour(void) const
+ {
+ std::list<point_type> result;
+
+ for (typename segment<I>::const_iter_type it = nodes.begin();
+ it != nodes.end(); ++it)
+ result.push_back(*it);
+ return result;
+ }
+
+ template <class I>
+ typename segment<I>::const_iter_type
+ segment<I>::begin(void) const
+ {
+ return nodes.begin();
+ }
+ template <class I>
+ typename segment<I>::iter_type
+ segment<I>::begin(void)
+ {
+ return nodes.begin();
+ }
+
+ template <class I>
+ typename segment<I>::const_iter_type
+ segment<I>::end(void) const
+ {
+ return nodes.end();
+ }
+ template <class I>
+ typename segment<I>::iter_type
+ segment<I>::end(void)
+ {
+ return nodes.end();
+ }
+
+ template <class I>
+ const node<I>
+ segment<I>::prev_node(void) const
+ {
+ return prev_segment.back();
+ }
+ template <class I>
+ const node<I>
+ segment<I>::next_node(void) const
+ {
+ return next_segment.front();
+ }
+
+ template <class I>
+ const node<I>
+ segment<I>::front(void) const
+ {
+ return nodes.front();
+ }
+ template <class I>
+ const node<I>
+ segment<I>::back(void) const
+ {
+ return nodes.back();
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_SEGMENT_HXX
Index: olena/oln/snakes/greedy.hxx
--- olena/oln/snakes/greedy.hxx Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/greedy.hxx Wed, 21 Jan 2004 04:59:29 +0100 astrid (oln/j/24_greedy.hxx 644)
@@ -0,0 +1,210 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_GREEDY_HXX
+# define OLENA_SNAKES_GREEDY_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+
+ template <int N, class I, template<typename> class external_energy>
+ greedy<N, I, external_energy>::greedy(ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi) :
+ continuity_e(&average_dist),
+ curvature_e(curvature_energy<I>::cookie()),
+ image_e(image_energy<I>::cookie()),
+ external_e(external_energy<I>::cookie()),
+ alpha(alpha), beta(beta), gamma(gamma), khi(khi)
+ {
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ int
+ greedy<N, I, external_energy>::
+ update_snake(const I& gradient, snake<greedy<N, I, external_energy> >& s)
+ {
+ /// This place is left void to make room for a future extension
+ /// where a snake will be able to hold several segments.
+ average_dist = compute_average_dist(s.s);
+ return update_segment(gradient, s.s);
+ }
+
+ template <int N, class I, template<typename> class external_energy>
+ void
+ greedy<N, I, external_energy>::
+ converge(const I& gradient, snake<greedy<N, I, external_energy> >& s)
+ {
+ // FIXME: think of a real stop condition.
+ unsigned i = 0;
+ while (threshold < update_segment(gradient, s.s))
+ {
+ average_dist = compute_average_dist(s.s);
+ std::cout << i << ' ' << s.s << std::endl;
+ ++i;
+ };
+ }
+
+ template <int N, class I, template<typename> class external_energy>
+ int
+ greedy<N, I, external_energy>::update_segment(const I& gradient,
+ segment<I>& s)
+ {
+ int nb_updates = 0;
+ typename segment<I>::iter_type p = s.begin();
+ typename segment<I>::iter_type c = s.begin();
+ typename segment<I>::iter_type n = s.begin();
+
+ ++n;
+ nb_updates += update_node(gradient, s.prev_node(), *c, *n) ? 1 : 0;
+ for (++c, ++n; n != s.end(); ++p, ++c, ++n)
+ nb_updates += update_node(gradient, *p, *c, *n) ? 1 : 0;
+ nb_updates += update_node(gradient, *p, *c, s.next_node()) ? 1 : 0;
+ return nb_updates;
+ }
+
+ template <int N, class I, template<typename> class external_energy>
+ bool
+ greedy<N, I, external_energy>::update_node(const I& gradient,
+ const node<I>& prev,
+ node<I>& current,
+ const node<I>& next)
+ ///< Return whether the point has changed or not.
+ {
+ store_type energy;
+ ntg::float_s minimum = ntg_sup_val(ntg::float_s);
+ dpoint2d minimum_location;
+
+ energy = compute_and_normalize_energy<continuity_energy<I> >
+ (gradient, prev, current, next, continuity_e) * alpha;
+ energy += compute_and_normalize_energy<curvature_energy<I> >
+ (gradient, prev, current, next, curvature_e) * beta;
+ energy += compute_and_normalize_energy<image_energy<I> >
+ (gradient, prev, current, next, image_e) * gamma;
+ energy += compute_and_normalize_energy<external_energy<I> >
+ (gradient, prev, current, next, external_e) * khi;
+
+ window2d::iter_type it(neighborhood);
+ for_all(it)
+ {
+ if (minimum > energy(it.cur().col(), it.cur().row()))
+ {
+ minimum = energy(it.cur().col(), it.cur().row());
+ minimum_location = it;
+ }
+ }
+ if (0 != minimum_location.col() || 0 != minimum_location.row())
+ {
+ current += minimum_location;
+ return true;
+ }
+ return false;
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ template <class energy_functor>
+ inline
+ typename greedy<N, I, external_energy>::store_type
+ greedy<N, I, external_energy>::
+ compute_and_normalize_energy
+ (const typename energy_functor::image_type& gradient,
+ const node<typename energy_functor::image_type>& prev,
+ const node<typename energy_functor::image_type>& current,
+ const node<typename energy_functor::image_type>& next,
+ energy_functor functor)
+ {
+ store_type energy;
+ ntg::float_s energy_min = ntg_sup_val(ntg::float_s);
+ ntg::float_s energy_max = ntg_inf_val(ntg::float_s);
+
+ // Compute energy of each point of the neighborhood. Those are
+ // not normalized yet.
+ window2d::iter_type it(neighborhood);
+ for_all(it)
+ {
+ ntg::float_s e = functor.compute(gradient, prev, current + it, next);
+
+ // Find minimal and maximal energy on the fly, for we need them
+ // thereafter.
+ if (e > energy_max) energy_max = e;
+ if (e < energy_min) energy_min = e;
+ // Store it in a temporary location.
+ energy(it.cur().col(), it.cur().row()) = e;
+ }
+ if (energy_max > 0)
+ {
+ ntg::float_s invmax = 1 / (energy_max - energy_min);
+ window2d::iter_type itw(neighborhood);
+ for_all(itw)
+ {
+ ntg::float_s tmp = energy(itw.cur().col(), itw.cur().row()) -
+ energy_min;
+ tmp *= invmax;
+ energy(itw.cur().col(), itw.cur().row()) = tmp;
+ }
+ }
+ return energy;
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ ntg::float_s
+ greedy<N, I, external_energy>::compute_average_dist(const segment<I>& s)
+ {
+ ntg::float_s mean = 0.f;
+
+ typename segment<I>::const_iter_type prev = s.begin();
+ typename segment<I>::const_iter_type cur = s.begin();
+ unsigned card = 0;
+ for (++cur; cur != s.end(); ++prev, ++cur)
+ {
+ mean += (*cur - *prev).norm2();
+ ++card;
+ }
+ return mean / (ntg::float_s)card;
+ }
+
+
+ template <int N, class I, template<typename> class external_energy>
+ const int greedy<N, I, external_energy>::threshold = 3; // FIXME:
+
+
+ template <int N, class I, template<typename> class external_energy>
+ window2d greedy<N, I, external_energy>::neighborhood = mk_win_square(N);
+
+
+ } // end snakes
+
+} // end oln
+
+
+#endif // !OLENA_SNAKES_GREEDY_HXX
Index: olena/oln/snakes/greedy.hh
--- olena/oln/snakes/greedy.hh Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/greedy.hh Wed, 21 Jan 2004 05:05:18 +0100 astrid (oln/j/25_greedy.hh 644)
@@ -0,0 +1,121 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_GREEDY_HH
+# define OLENA_SNAKES_GREEDY_HH
+
+#include <oln/snakes/snakes_base.hh>
+#include <oln/snakes/energies.hh>
+#include <mlc/array/2d.hh>
+
+namespace oln {
+
+ namespace snakes {
+
+ /// N is the size of the neighborhood.
+ template <int N, class I, template<typename> class external_energy = dummy_energy>
+ class greedy
+ {
+ public:
+ typedef I image_type;
+ typedef typename I::point_type point_type;
+ typedef mlc::array2d<mlc::array2d_info<N,N>, ntg::float_s> store_type;
+ // FIXME: why only 2d?
+
+ public:
+ greedy(ntg::float_s alpha,
+ ntg::float_s beta,
+ ntg::float_s gamma,
+ ntg::float_s khi);
+
+ public:
+ inline
+ int
+ update_snake(const I& gradient, snake<greedy>& s);
+ ///< Asynchronous update for more efficient convergence.
+
+ void
+ converge(const I& gradient, snake<greedy>& s);
+
+
+ private:
+ inline
+ int
+ update_segment(const I& gradient, segment<I>& s);
+
+ inline
+ bool
+ update_node(const I& gradient,
+ const node<I>& prev, node<I>& n, const node<I>& next);
+
+ private:
+ template <class energy_functor>
+ inline
+ store_type
+ compute_and_normalize_energy
+ (const typename energy_functor::image_type& gradient,
+ const node<typename energy_functor::image_type>& prev,
+ const node<typename energy_functor::image_type>& current,
+ const node<typename energy_functor::image_type>& next,
+ energy_functor functor);
+
+ private:
+ ntg::float_s average_dist;
+ ///< Average distance between the points of the contour.
+
+ inline
+ ntg::float_s
+ compute_average_dist(const segment<I>& s);
+
+ private:
+ continuity_energy<I> continuity_e;
+ curvature_energy<I> curvature_e;
+ image_energy<I> image_e;
+ external_energy<I> external_e;
+
+ private:
+ ///< Each energy is weighted by a its own coefficient.
+ ntg::float_s alpha; ///< Weight of the continuity energy.
+ ntg::float_s beta; ///< Weight of the curvature energy.
+ ntg::float_s gamma; ///< Weight of the image energy.
+ ntg::float_s khi; ///< Weight of the image energy.
+
+ private:
+ static const int threshold;
+ // FIXME: think about a real stop condition.
+ private:
+ static window2d neighborhood;
+ // FIXME: better write an iterator on arrays.
+ };
+
+ } // end snakes
+
+} // end oln
+
+#include <oln/snakes/greedy.hxx>
+
+#endif // !OLENA_SNAKES_GREEDY_HH
Index: olena/oln/snakes/node.hh
--- olena/oln/snakes/node.hh Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/node.hh Wed, 21 Jan 2004 05:06:18 +0100 astrid (oln/j/32_node.hh 644)
@@ -0,0 +1,74 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_NODE_HH
+# define OLENA_SNAKES_NODE_HH
+
+#include <oln/basics2d.hh> // FIXME: Why only 2d?
+
+namespace oln {
+
+ namespace snakes {
+
+ template<class I>
+ class node : public I::point_type
+ {
+ public:
+ typedef typename I::point_type point_type;
+ typedef typename I::dpoint_type dpoint_type;
+
+ public:
+ node(point_type point) :
+ I::point_type(point)
+ {
+ }
+
+ public:
+ inline
+ ntg::float_s
+ energy(const I& gradient, point_type prev, point_type next) const;
+
+ private:
+ friend std::ostream&
+ ::operator<< <>(std::ostream&, const node&);
+ };
+
+ } // end snakes
+
+} // end oln
+
+
+template <class I>
+std::ostream& operator<<(std::ostream& os, const oln::snakes::node<I>& n)
+{
+ os << "Node:" << static_cast<typename oln::snakes::node<I>::point_type>(n);
+ return os;
+}
+
+#include <oln/snakes/node.hxx>
+
+#endif // !OLENA_SNAKES_NODE_HH
Index: olena/oln/snakes/node.hxx
--- olena/oln/snakes/node.hxx Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/node.hxx Wed, 21 Jan 2004 05:06:50 +0100 astrid (oln/j/33_node.hxx 644)
@@ -0,0 +1,46 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_NODE_HXX
+# define OLENA_SNAKES_NODE_HXX
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ ntg::float_s
+ node<I>::energy(const I& gradient, point_type prev, point_type next) const
+ {
+ return 42; // FIXME: compute the real value.
+ }
+
+ } // end snakes
+
+} // end oln
+
+#endif // !OLENA_SNAKES_NODE_HXX
Index: olena/oln/snakes/segment.hh
--- olena/oln/snakes/segment.hh Wed, 21 Jan 2004 05:10:14 +0100 astrid ()
+++ olena/oln/snakes/segment.hh Wed, 21 Jan 2004 05:08:53 +0100 astrid (oln/j/34_segment.hh 644)
@@ -0,0 +1,107 @@
+// Copyright (C) 2004 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, 59 Temple Place - Suite 330, 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 OLENA_SNAKES_SEGMENT_HH
+# define OLENA_SNAKES_SEGMENT_HH
+
+#include <oln/snakes/node.hh>
+
+#include <vector>
+#include <list>
+
+namespace oln {
+
+ namespace snakes {
+
+ template <class I>
+ class segment
+ {
+ public:
+ typedef typename std::vector<node<I> >::iterator iter_type;
+ typedef typename std::vector<node<I> >::const_iterator const_iter_type;
+ typedef typename I::point_type point_type;
+
+ public:
+ segment(std::list<point_type>& initial_contour);
+
+ public:
+ inline
+ ntg::float_s
+ energy(const I& gradient) const;
+ ///< Just iterate through the vector and sums up point energies.
+
+ public:
+ std::list<point_type>
+ contour(void) const;
+ ///< Return the points of the segment.
+
+ public:
+ const_iter_type begin(void) const;
+ iter_type begin(void);
+ ///< Return an iterator on the first node of the segment.
+ const_iter_type end(void) const;
+ iter_type end(void);
+ ///< Return an iterator on the last node of the segment.
+
+ public:
+ const node<I> prev_node(void) const;
+ ///< Node before the first node of this segment.
+ const node<I> next_node(void) const;
+ ///< Node after the next node of this segment.
+
+ private:
+ std::vector<node<I> > nodes;
+ segment& prev_segment;
+ segment& next_segment;
+
+ const node<I> front(void) const;
+ const node<I> back(void) const;
+
+ friend
+ std::ostream&
+ ::operator<< <>(std::ostream&, const segment&);
+ };
+
+ } // end snakes
+
+} // end oln
+
+
+template <class I>
+std::ostream& operator<<(std::ostream& os, const oln::snakes::segment<I>& s)
+{
+ os << "Segment:" << std::endl;
+ for (typename oln::snakes::segment<I>::const_iter_type it = s.begin();
+ it != s.end();
+ ++it)
+ os << *it << std::endl;
+ return os;
+}
+
+#include <oln/snakes/segment.hxx>
+
+#endif // !OLENA_SNAKES_SEGMENT_HH
--
astrid
Spam detection software, running on the system "kualalumpur.lrde.epita.fr", has
identified this incoming email as possible spam. The original message
has been attached to this so you can view it (if it isn't spam) or block
similar future email. If you have any questions, see
the administrator of that system for details.
Content preview: OEM Software URI:http://www.pro-ez-oem.biz/?241958
Specials good thru 11/12/03. Please use discount code mail9221 to
receive these prices. Software: Windows XP Suites, Adobe software,
Clearance, Corel Draw/Corel Ventura, Games, 3D Studio Max, Operating
Systems, Utilities. [...]
Content analysis details: (17.4 points, 5.0 required)
pts rule name description
---- ---------------------- --------------------------------------------------
2.1 FROM_WEBMAIL_END_NUMS6 From webmail service and address ends in numbers
0.3 NO_REAL_NAME From: does not include a real name
0.9 FROM_ENDS_IN_NUMS From: ends in numbers
1.1 FROM_NUM_AT_WEBMAIL From address is webmail, but starts with a number
0.7 ADDR_NUMS_AT_BIGSITE Uses an address with lots of numbers, at a big ISP
1.6 FROM_STARTS_WITH_NUMS From: starts with nums
0.1 HTML_FONTCOLOR_UNKNOWN BODY: HTML font color is unknown to us
0.1 HTML_TAG_BALANCE_A BODY: HTML has excess "a" close tags
0.0 HTML_MESSAGE BODY: HTML included in message
0.2 HTML_TAG_BALANCE_TABLE BODY: HTML is missing "table" close tags
0.1 HTML_FONT_BIG BODY: HTML has a big font
0.1 HTML_70_80 BODY: Message is 70% to 80% HTML
0.1 MIME_HTML_ONLY BODY: Message only has text/html MIME parts
0.8 BIZ_TLD URI: Contains a URL in the BIZ top-level domain
0.5 RCVD_IN_NJABL_DIALUP RBL: NJABL: dialup sender did non-local SMTP
[172.180.151.150 listed in dnsbl.njabl.org]
1.1 RCVD_IN_DSBL RBL: Received via a relay in list.dsbl.org
[<http://dsbl.org/listing?ip=172.180.151.150>]
2.2 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in bl.spamcop.net
[Blocked - see <http://www.spamcop.net/bl.shtml?172.180.151.150>]
2.5 RCVD_IN_DYNABLOCK RBL: Sent directly from dynamic IP address
[172.180.151.150 listed in dnsbl.sorbs.net]
0.1 RCVD_IN_NJABL RBL: Received via a relay in dnsbl.njabl.org
[172.180.151.150 listed in dnsbl.njabl.org]
0.1 RCVD_IN_SORBS RBL: SORBS: sender is listed in SORBS
[172.180.151.150 listed in dnsbl.sorbs.net]
1.2 FROM_ALL_NUMS From an address that is all numbers (non-phone)
1.6 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook
The original message was not completely plain text, and may be unsafe to
open with some email clients; in particular, it may contain a virus,
or confirm that your address can receive spam. If you wish to view
it, it may be safer to save it to a file and open it with an editor.