Commit 4d87541b authored by green's avatar green Committed by Yann Jacquelet
Browse files

Fix bugs in the histogram visualization tools.

	* green/mln/display/display_histo.cc: Add new vizualisations.
	* green/mln/display/project_histo.cc: Add new color projections.
parent b57d26e9
......@@ -75,6 +75,13 @@
* bin/pgm_to_pbm.cc,
* bin/ppm_negate.cc: New.
2010-02-10 Yann Jacquelet <jacquelet@lrde.epita.fr>
Fix bugs in the histogram visualization tools.
* green/mln/display/display_histo.cc: Add new vizualisations.
* green/mln/display/project_histo.cc: Add new color projections.
2010-02-10 Yann Jacquelet <jacquelet@lrde.epita.fr>
Fix last details in the image processing chain.
......
......@@ -29,12 +29,14 @@
# define MLN_DISPLAY_DISPLAY_HISTO_HH
# include <mln/accu/math/sum.hh>
# include <mln/algebra/vec.hh>
# include <mln/data/stretch.hh>
# include <mln/display/project_histo.hh>
# include <mln/fun/v2v/log.hh>
# include <mln/value/int_u8.hh>
# include <mln/value/rgb8.hh>
# include <mln/value/label_8.hh>
# include <mln/util/array.hh>
/// \file
......@@ -57,19 +59,28 @@ namespace mln
image2d<value::int_u8>
display_histo3d_unsigned(const image3d<unsigned>& histo);
image2d<value::int_u8>
display2_histo3d_unsigned(const image3d<unsigned>& histo);
template <unsigned n>
image2d< value::int_u<n> >
display2_histo3d_unsigned(const image3d<unsigned>& histo,
const value::int_u<n> ambiguous_color);
template <unsigned n>
image2d<value::label_8>
display2_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label);
const image3d<value::label_8>& label,
const value::label_8 ambiguous_label);
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo);
template <unsigned n>
image2d< value::rgb<n> >
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const value::rgb<n> ambiguous_color);
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label);
template <unsigned n>
image2d< value::rgb8 >
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label,
const util::array< algebra::vec<3,float> >& pal,
const value::rgb8 ambiguous_color);
#ifndef MLN_INCLUDE_ONLY
......@@ -87,7 +98,7 @@ namespace mln
/// \parameter[in] histo the histogram in 3d.
/// \result return a equivalent 2d image.
// FIXME : display_shape [in int_u8]
image2d<value::int_u8>
display_histo3d_unsigned(const image3d<unsigned>& histo)
{
......@@ -102,40 +113,62 @@ namespace mln
return proj_int;
}
image2d<value::int_u8>
display2_histo3d_unsigned(const image3d<unsigned>& histo)
// FIXME : display_color [in int_un]
template <unsigned n>
image2d< value::int_u<n> >
display2_histo3d_unsigned(const image3d<unsigned>& histo,
const value::int_u<n> ambiguous_color)
{
image2d<value::int_u8> proj = project2_histo<0>(histo);
image2d< value::int_u<n> > proj = project2_histo<n,0>(histo,
ambiguous_color);
return proj;
}
// FIXME : display_label [in label]
template <unsigned n>
image2d<value::label_8>
display2_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
const image3d<value::label_8>& label,
const value::label_8 ambiguous_label)
{
image2d<value::label_8> proj = project2_histo<0>(histo, label);
image2d<value::label_8> proj = project2_histo<n,0>(histo,
label,
ambiguous_label);
return proj;
}
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo)
// FIXME : display_color [in color]
template <unsigned n>
image2d< value::rgb<n> >
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const value::rgb<n> ambiguous_color)
{
image2d<value::rgb8> proj = project3_histo<0>(histo);
image2d< value::rgb<n> > proj = project3_histo<n,0>(histo,
ambiguous_color);
return proj;
}
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
// FIXME : display_label [in color]
template <unsigned n>
image2d< value::rgb8 >
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label,
const util::array<algebra::vec<3,float> >& pal,
const value::rgb8 ambiguous_color)
{
image2d<value::rgb8> proj = project3_histo<0>(histo, label);
image2d< value::rgb8 > proj = project3_histo<n,0>(histo,
label,
pal,
ambiguous_color);
return proj;
}
#endif // ! MLN_INCLUDE_ONLY
......
......@@ -37,12 +37,16 @@
# include <mln/accu/image/take.hh>
# include <mln/accu/image/to_result.hh>
# include <mln/algebra/vec.hh>
# include <mln/opt/at.hh>
# include <mln/value/int_u8.hh>
# include <mln/value/rgb8.hh>
# include <mln/value/label_8.hh>
# include <mln/util/array.hh>
/// \file
///
/// \brief Allow the visualization of 3d histogram.
......@@ -60,9 +64,30 @@ namespace mln
image2d<mln_result(A)>
project_histo(const image3d<V>& histo);
template <typename A, unsigned direction, typename V>
template <typename A, unsigned n, unsigned direction, typename V>
image2d<mln_result(A)>
project2_histo(const image3d<V>& histo);
project2_histo(const image3d<V>& histo,
const value::int_u<n>& ambiguous_color);
template <unsigned n, unsigned direction, typename V>
image2d<V>
project2_histo(const image3d<unsigned>& histo,
const image3d<V>& label);
template <unsigned n, unsigned direction>
image2d< value::rgb<n> >
project3_histo(const image3d<unsigned>& histo,
const value::rgb<n> ambiguous_color);
template <unsigned n, unsigned direction>
image2d< value::rgb8 >
project3_histo(const image3d<unsigned>& histo,
const image3d<value::label_8>& label,
const util::array<algebra::vec<3, float> >& pal,
const value::rgb8 ambiguous_color);
// FIXME ==> palette must be 1d-image not an array !!
# ifndef MLN_INCLUDE_ONLY
......@@ -96,80 +121,96 @@ namespace mln
return accu::image::to_result(histo_accu);
}
template <unsigned direction>
image2d<value::int_u8>
project2_histo(const image3d<unsigned>& histo)
// 0 ==> blue
// 1 ==> red
// 2 ==> green
// mln::opt::at(histo, blue, red, green)
template <unsigned n, unsigned direction>
image2d< value::int_u<n> >
project2_histo(const image3d<unsigned>& histo,
const value::int_u<n>& ambiguous_color)
{
image2d<value::int_u8> result;
image2d< value::int_u<n> > result;
if (0 == direction) // blue
{
image2d<value::int_u8> arg_max(histo.ncols(), histo.nslices());
image2d< value::int_u<n> > arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
unsigned max = 0; // minimum as possible
def::coord pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = blue;
}
}
opt::at(arg_max,i,j) = pos;
if (-1 == pos)
opt::at(arg_max,red,green) = ambiguous_color;
else
opt::at(arg_max,red,green) = pos;
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::int_u8> arg_max(histo.nrows(), histo.nslices());
image2d< value::int_u<n> > arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = red;
}
}
opt::at(arg_max,i,j) = pos;
if (-1 == pos)
opt::at(arg_max,green,blue) = ambiguous_color;
else
opt::at(arg_max,green,blue) = pos;
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::int_u8> arg_max(histo.nrows(), histo.ncols());
image2d< value::int_u<n> > arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nslices(); ++k)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = green;
}
}
opt::at(arg_max,i,j) = pos;
if (-1 == pos)
opt::at(arg_max,red,blue) = ambiguous_color;
else
opt::at(arg_max,red,blue) = pos;
}
result = arg_max;
......@@ -178,81 +219,91 @@ namespace mln
return result;
}
template <unsigned direction>
template <unsigned n, unsigned direction>
image2d<value::label_8>
project2_histo(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
const image3d<value::label_8>& label,
const value::label_8 ambiguous_label)
{
image2d<value::label_8> result;
if (0 == direction) // blue
{
image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
unsigned max = 0; // minimum as possible
def::coord pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = blue;
}
}
opt::at(arg_max,i,j) = opt::at(label,i,j,pos);
if (-1 == pos)
opt::at(arg_max,red,green) = ambiguous_label;
else
opt::at(arg_max,red,green) = opt::at(label, pos, red, green);
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = red;
}
}
opt::at(arg_max,i,j) = opt::at(label,pos,i,j);
if (-1 == pos)
opt::at(arg_max,green,blue) = ambiguous_label;
else
opt::at(arg_max,green,blue) = opt::at(label, blue, pos, green);
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nslices(); ++k)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = green;
}
}
opt::at(arg_max,i,j) = opt::at(label,i,pos,j);
if (-1 == pos)
opt::at(arg_max,red,blue) = ambiguous_label;
else
opt::at(arg_max,red,blue) = opt::at(label, blue, red, pos);
}
result = arg_max;
......@@ -262,83 +313,117 @@ namespace mln
}
// FIXME ... determine the color of each class.
template <unsigned direction>
image2d<value::rgb8>
project3_histo(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
// FIXME la palette est supposée en 8 bits
template <unsigned n, unsigned direction>
image2d< value::rgb8 >
project3_histo(const image3d<unsigned>& histo,
const image3d<value::label_8>& label,
const util::array<algebra::vec<3,float> >& pal,
const value::rgb8 ambiguous_color)
{
image2d<value::rgb8> result;
image2d< value::rgb8 > result;
if (0 == direction) // blue
{
image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
image2d< value::rgb8 > arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
unsigned max = 0; // minimum as possible
def::coord pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = blue;
}
}
opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
if (-1 == pos)
opt::at(arg_max,red,green) = ambiguous_color;
else
{
value::int_u8 r = pal[opt::at(label,pos,red,green)][0];
value::int_u8 g = pal[opt::at(label,pos,red,green)][1];
value::int_u8 b = pal[opt::at(label,pos,red,green)][2];
value::rgb8 color(r,g,b);
opt::at(arg_max,red,green) = color;
}
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
image2d< value::rgb8 > arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
for (def::coord blue = 0; blue < (signed)histo.nslices(); ++blue)
for (def::coord green = 0; green < (signed)histo.ncols(); ++green)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
for (def::coord red = 0; red < (signed)histo.nrows(); ++red)
{
if (max <= opt::at(histo,i,j,k))
if (max < opt::at(histo,blue,red,green))
{
max = opt::at(histo,i,j,k);
pos = k;
max = opt::at(histo,blue,red,green);
pos = red;
}
}
opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
if (-1 == pos)
opt::at(arg_max,green,blue) = ambiguous_color;
else
{
value::int_u8 r = pal[opt::at(label,blue,pos,green)][0];
value::int_u8 g = pal[opt::at(label,blue,pos,green)][1];
value::int_u8 b = pal[opt::at(label,blue,pos,green)][2];
value::rgb8 color(r,g,b);
opt::at(arg_max,green,blue) = color;
}
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
image2d< value::rgb8 > arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i