Commit 17304c0d authored by green's avatar green Committed by Yann Jacquelet
Browse files

Extend the histogram visualization tools for new projection concept.

	* green/mln/display/project_histo.hh (project2_histo): New functions
	that keep the max of the histogram or the class associate to it while
	projecting along a direction.
	* green/mln/display/project_histo.hh (project3_histo): New functions
	that keep the color of the class associate to the histogram maximum
	while projecting along a direction.
	* green/mln/display/display_histo.hh: New interface functions for
	project2_histo and project3_histo.
parent 5179913a
......@@ -75,6 +75,19 @@
* bin/pgm_to_pbm.cc,
* bin/ppm_negate.cc: New.
2010-01-05 Yann Jacquelet <jacquelet@lrde.epita.fr>
Extend the histogram visualization tools for new projection concept.
* green/mln/display/project_histo.hh (project2_histo): New functions
that keep the max of the histogram or the class associate to it while
projecting along a direction.
* green/mln/display/project_histo.hh (project3_histo): New functions
that keep the color of the class associate to the histogram maximum
while projecting along a direction.
* green/mln/display/display_histo.hh: New interface functions for
project2_histo and project3_histo.
2010-01-05 Yann Jacquelet <jacquelet@lrde.epita.fr>
Build translation table between number of pixels and percentage of
......
......@@ -33,6 +33,8 @@
# 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>
/// \file
......@@ -55,6 +57,20 @@ namespace mln
image2d<value::int_u8>
display_histo3d_unsigned(const image3d<unsigned>& histo);
image2d<value::int_u8>
display2_histo3d_unsigned(const image3d<unsigned>& histo);
image2d<value::label_8>
display2_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label);
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo);
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label);
#ifndef MLN_INCLUDE_ONLY
/// \brief Allow the visualization of a 3d histogram by projection.
......@@ -86,6 +102,40 @@ namespace mln
return proj_int;
}
image2d<value::int_u8>
display2_histo3d_unsigned(const image3d<unsigned>& histo)
{
image2d<value::int_u8> proj = project2_histo<0>(histo);
return proj;
}
image2d<value::label_8>
display2_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
{
image2d<value::label_8> proj = project2_histo<0>(histo, label);
return proj;
}
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo)
{
image2d<value::rgb8> proj = project3_histo<0>(histo);
return proj;
}
image2d<value::rgb8>
display3_histo3d_unsigned(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
{
image2d<value::rgb8> proj = project3_histo<0>(histo, label);
return proj;
}
#endif // ! MLN_INCLUDE_ONLY
......
......@@ -37,6 +37,12 @@
# include <mln/accu/image/take.hh>
# include <mln/accu/image/to_result.hh>
# include <mln/opt/at.hh>
# include <mln/value/int_u8.hh>
# include <mln/value/rgb8.hh>
# include <mln/value/label_8.hh>
/// \file
///
/// \brief Allow the visualization of 3d histogram.
......@@ -54,6 +60,10 @@ namespace mln
image2d<mln_result(A)>
project_histo(const image3d<V>& histo);
template <typename A, unsigned direction, typename V>
image2d<mln_result(A)>
project2_histo(const image3d<V>& histo);
# ifndef MLN_INCLUDE_ONLY
/// \brief Allow the visualization of 3d histogram.
......@@ -86,6 +96,340 @@ namespace mln
return accu::image::to_result(histo_accu);
}
template <unsigned direction>
image2d<value::int_u8>
project2_histo(const image3d<unsigned>& histo)
{
image2d<value::int_u8> result;
if (0 == direction) // blue
{
image2d<value::int_u8> arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = pos;
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::int_u8> arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = pos;
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::int_u8> arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nslices(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = pos;
}
result = arg_max;
}
return result;
}
template <unsigned direction>
image2d<value::label_8>
project2_histo(const image3d<unsigned>& histo,
const image3d<value::label_8>& label)
{
image2d<value::label_8> result;
if (0 == direction) // blue
{
image2d<value::label_8> arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = opt::at(label,i,j,pos);
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::label_8> arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = opt::at(label,pos,i,j);
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::label_8> arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nslices(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = opt::at(label,i,pos,j);
}
result = arg_max;
}
return result;
}
// 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)
{
image2d<value::rgb8> result;
if (0 == direction) // blue
{
image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nslices(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
// FIXME ... how to fix the n of rgb
opt::at(arg_max,i,j) = value::rgb8(i,pos,j);
}
result = arg_max;
}
return result;
}
template <unsigned direction>
image2d<value::rgb8>
project3_histo(const image3d<unsigned>& histo)
{
image2d<value::rgb8> result;
if (0 == direction) // blue
{
image2d<value::rgb8> arg_max(histo.ncols(), histo.nslices());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nslices(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nrows(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = value::rgb8(i,j,pos);
}
result = arg_max;
}
else if (1 == direction) // red
{
image2d<value::rgb8> arg_max(histo.nrows(), histo.nslices());
for (unsigned j = 0; j < histo.nslices(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.ncols(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
opt::at(arg_max,i,j) = value::rgb8(pos,i,j);
}
result = arg_max;
}
else // 2 == direction // green
{
image2d<value::rgb8> arg_max(histo.nrows(), histo.ncols());
for (unsigned j = 0; j < histo.ncols(); ++j)
for (unsigned i = 0; i < histo.nrows(); ++i)
{
unsigned max = 0; // minimum as possible
signed pos = -1;
for (unsigned k = 0; k < histo.nslices(); ++k)
{
if (max <= opt::at(histo,i,j,k))
{
max = opt::at(histo,i,j,k);
pos = k;
}
}
// FIXME ... how to fix the n of rgb
opt::at(arg_max,i,j) = value::rgb8(i,pos,j);
}
result = arg_max;
}
return result;
}
# endif // ! MLN_INCLUDE_ONLY
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment