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

Fix the right behaviour of the regmax software.

	* green/demo/labeling/regional_maxima/regional_maxima.cc: Add
	many modifications to reach the current software state. There is some
	nomenclatura, some refactoring and debugging.
parent 7570d066
......@@ -75,6 +75,14 @@
* bin/pgm_to_pbm.cc,
* bin/ppm_negate.cc: New.
2009-12-18 Yann Jacquelet<jacquelet@lrde.epita.fr>
Fix the right behaviour of the regmax software.
* green/demo/labeling/regional_maxima/regional_maxima.cc: Add
many modifications to reach the current software state. There is some
nomenclatura, some refactoring and debugging.
2009-12-17 Yann Jacquelet <jacquelet@lrde.epita.fr>
Fix bug in the direction of projection.
......
......@@ -27,7 +27,8 @@
// #include <mln/data/stretch.hh>
#include <mln/data/transform.hh>
// #include <mln/display/display_histo.hh>
// #include <mln/debug/println.hh>
#include <mln/display/display_histo.hh>
#include <mln/fun/v2v/rgb8_to_rgbn.hh>
......@@ -49,6 +50,7 @@
#include <mln/opt/at.hh>
#include <mln/transform/influence_zone_geodesic.hh>
// #include <mln/pw/value.hh>
#include <mln/util/array.hh>
......@@ -255,108 +257,6 @@ void print_count2(const mln::image2d<mln::value::rgb<n> >& input_rgbn,
}
}
template <unsigned n>
mln::image2d<mln::value::label_8>
compute_stats(const mln::image2d<mln::value::rgb8>& input_rgb8,
const mln::image2d<mln::value::rgb<n> >& input_rgbn,
const mln::image3d<unsigned>& histo,
const mln::image3d<mln::value::label_8>& label,
const unsigned n_labels)
{
typedef mln::value::label_8 t_lbl8;
typedef mln::value::rgb<n> t_rgbn;
typedef mln::value::rgb8 t_rgb8;
typedef mln::value::int_u<n> t_int_un;
typedef mln::algebra::vec<3,float> t_vec3f;
typedef mln::accu::math::sum<unsigned,unsigned> t_sum;
typedef mln::accu::stat::mean<t_vec3f,t_vec3f,t_vec3f> t_mean;
typedef mln::image2d<t_lbl8> t_image2d_lbl8;
typedef mln::image2d<t_rgbn> t_image2d_rgbn;
typedef mln::image2d<t_rgb8> t_image2d_rgb8;
typedef mln::image2d<t_int_un> t_image2d_int_un;
typedef mln::util::array<unsigned> t_count_array;
typedef mln::util::array<t_vec3f> t_mean_array;
mln::util::array<float> abs((unsigned)(n_labels)+1);
mln::util::array<float> rel((unsigned)(n_labels)+1);
unsigned nb = 0;
for (unsigned i = 0; i <= n_labels; ++i)
{
abs[i] = 0.0;
rel[i] = 0.0;
}
// COMPUTE THE SUM
t_count_array count = mln::labeling::compute(t_sum(),
histo,
label,
n_labels);
// COMPUTE THE TOTAL
for (unsigned i = 0; i <= n_labels; ++i)
{
unsigned c = count[i];
nb += c;
}
// COMPUTE THE PERCENTAGES
for (unsigned i = 0; i <= n_labels; ++i)
if (0 < count[i])
{
abs[i] = ((float)count[i] / nb)*100.0;
rel[i] = ((float)count[i] / (nb - count[0]))*100.0;
}
// COMPUTE THE MEAN
t_image2d_lbl8 label_img = mln::data::transform(input_rgbn,
t_labeling_rgbn<n>(label));
t_mean_array mean = mln::labeling::compute(t_mean(),
input_rgb8,
label_img,
n_labels);
// CORRECT LABEL 0 STATS
rel[0] = 0;
mean[0][0] = 255.0;
mean[0][1] = 255.0;
mean[0][2] = 0.0;
for (unsigned i = 0; i <= n_labels; ++i)
{
const t_vec3f& mean_v = mean[i];
std::cout << boost::format("%2i|"
"r = %6.2f, g = %6.2f, b = %6.2f |"
"c = %7i, %%i = %5.2f, %%c = %5.2f")
% i
% mean_v[0]
% mean_v[1]
% mean_v[2]
% count[i]
% abs[i]
% rel[i]
<< std::endl;
/*
std::cout << i << "|("
<< "r = " << unquant<n>(mean_v[0]) << ", "
<< "g = " << unquant<n>(mean_v[1]) << ", "
<< "b = " << unquant<n>(mean_v[2]) << ")|("
<< "c = " << count[i] << ", "
<< "%i= " << abs[i] << "%, "
<< "%c= " << rel[i] << "%)"
<< std::endl;
*/
}
t_image2d_rgb8 mean_rgb8 = mln::data::transform(label_img,
t_mean_lbl8_with_rgb8(mean));
mln::io::ppm::save(mean_rgb8, "mean.ppm");
return label_img;
}
void print_count(const mln::image3d<unsigned>& histo,
const mln::image3d<mln::value::label_8>& label,
......@@ -561,9 +461,111 @@ int main2()
return 0;
}
void compute_stats(const mln::image2d<mln::value::rgb8>& i_input_rgb8,
const mln::image2d<mln::value::label_8>& l_input_lbl8,
const mln::image3d<unsigned>& h_histo_rgbn,
const mln::image3d<mln::value::label_8>& l_histo_lbl8,
const mln::value::label_8& n_labels)
{
typedef mln::algebra::vec<3,float> t_vec3f;
typedef mln::accu::math::sum<unsigned,unsigned> t_sum;
typedef mln::accu::stat::mean<t_vec3f,t_vec3f,t_vec3f> t_mean;
typedef mln::util::array<unsigned> t_count_array;
typedef mln::util::array<t_vec3f> t_mean_array;
mln::util::array<float> abs((unsigned)(n_labels)+1);
mln::util::array<float> rel((unsigned)(n_labels)+1);
unsigned nb = 0;
for (unsigned i = 0; i <= n_labels; ++i)
{
abs[i] = 0.0;
rel[i] = 0.0;
}
// COMPUTE THE SUM
t_count_array count = mln::labeling::compute(t_sum(),
h_histo_rgbn,
l_histo_lbl8,
n_labels);
// COMPUTE THE TOTAL
for (unsigned i = 0; i <= n_labels; ++i)
{
unsigned c = count[i];
nb += c;
}
// COMPUTE THE PERCENTAGES
for (unsigned i = 0; i <= n_labels; ++i)
if (0 < count[i])
{
abs[i] = ((float)count[i] / nb)*100.0;
rel[i] = ((float)count[i] / (nb - count[0]))*100.0;
}
// COMPUTE THE MEAN
t_mean_array mean = mln::labeling::compute(t_mean(),
i_input_rgb8,
l_input_lbl8,
n_labels);
// CORRECT 0 LABEL STATS
rel[0] = 0;
mean[0][0] = 255.0;
mean[0][1] = 255.0;
mean[0][2] = 0.0;
// PRINT STATS
for (unsigned i = 0; i <= n_labels; ++i)
{
const t_vec3f& mean_v = mean[i];
std::cout << boost::format("%2i|"
"r = %6.2f, g = %6.2f, b = %6.2f |"
"c = %7i, %%i = %5.2f, %%c = %5.2f")
% i
% mean_v[0]
% mean_v[1]
% mean_v[2]
% count[i]
% abs[i]
% rel[i]
<< std::endl;
/*
std::cout << i << "|("
<< "r = " << unquant<n>(mean_v[0]) << ", "
<< "g = " << unquant<n>(mean_v[1]) << ", "
<< "b = " << unquant<n>(mean_v[2]) << ")|("
<< "c = " << count[i] << ", "
<< "%i= " << abs[i] << "%, "
<< "%c= " << rel[i] << "%)"
<< std::endl;
*/
}
std::cout << std::endl << std::endl;
}
void save_histo(const mln::image2d<mln::value::rgb8>& input_rgb8,
const std::string& name)
{
typedef mln::value::int_u8 t_int_u8;
typedef mln::image2d<t_int_u8> t_image2d_int_u8;
typedef mln::image3d<unsigned> t_histo3d;
typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun;
t_histo3d histo = mln::data::compute(t_histo3d_fun(), input_rgb8);
t_image2d_int_u8 display = mln::display::display_histo3d_unsigned(histo);
mln::io::pgm::save(display, name);
}
// n < 8, n is the degree of quantification
template <unsigned n>
void demo(const std::string& image, const unsigned min_volume)
void demo(const std::string& image, const unsigned min_vol)
{
typedef mln::value::label_8 t_lbl8;
typedef mln::value::int_u8 t_int_u8;
......@@ -580,45 +582,106 @@ void demo(const std::string& image, const unsigned min_volume)
typedef mln::accu::meta::stat::histo3d_rgb t_histo3d_fun;
// START OF IMAGE PROCESSING CHAIN
t_image2d_rgb8 input_rgb8;
t_image2d_rgbn input_rgbn;
t_image2d_rgb8 output_rgb8;
t_image2d_rgb8 mean_rgb8;
t_histo3d histo;
t_histo3d histo2;
// t_image2d_int_u8 projected;
// t_image2d_int_u8 filtered;
t_histo3d opened;
t_image3d_lbl8 label;
t_image2d_lbl8 label_img;
t_image3d_lbl8 dilated;
t_lbl8 n_labels;
mln::io::ppm::load(input_rgb8, image.c_str());
input_rgbn = mln::data::transform(input_rgb8, t_rgb8_to_rgbn());
histo = mln::data::compute(t_histo3d_fun(), input_rgbn);
opened = mln::morpho::opening::volume(histo, mln::c6(), min_volume);
label = mln::labeling::regional_maxima(opened, mln::c6(), n_labels);
// dilated = mln::morpho::elementary::dilation(label, mln::c26());
t_image2d_rgb8 i0_input; // input rgb8
t_histo3d h0_input; // histo input
t_image2d_rgbn i1_input; // input rgbn
t_histo3d h1_input; // histo input
t_histo3d h2_input; // histo opened
t_image3d_lbl8 l2_histo; // label histo
t_image2d_lbl8 l2_input; // label image
t_image2d_rgb8 i2_merge; // merge label
t_image2d_rgb8 i2_mean; // mean label
t_image3d_lbl8 l3_histo; // label dilated
t_image2d_lbl8 l3_input; // label image
t_image2d_rgb8 i3_merge; // merge label
t_image2d_rgb8 i3_mean; // mean label
t_image3d_lbl8 l4_histo; // label iz
t_image2d_lbl8 l4_input; // label image
t_image2d_rgb8 i4_merge; // merge label
t_image2d_rgb8 i4_mean; // mean label
t_image3d_lbl8 l5_histo; // label iz 2
t_image2d_lbl8 l5_input; // label image
t_image2d_rgb8 i5_merge; // merge label
t_image2d_rgb8 i5_mean; // mean label
t_lbl8 n_lbl; // nb class
mln::io::ppm::load(i0_input, image.c_str());
i1_input = mln::data::transform(i0_input, t_rgb8_to_rgbn());
h1_input = mln::data::compute(t_histo3d_fun(), i1_input);
h2_input = mln::morpho::opening::volume(h1_input, mln::c6(), min_vol);
l2_histo = mln::labeling::regional_maxima(h2_input, mln::c6(), n_lbl);
l3_histo = mln::morpho::elementary::dilation(l2_histo, mln::c26());
l4_histo = mln::transform::influence_zone_geodesic(l2_histo, mln::c26());
l5_histo = mln::transform::influence_zone_geodesic(l2_histo, mln::c26(), 2);
// END OF IMAGE PROCESSING CHAIN
// i2_mean = mln::data::transform(l0_input,t_mean_lbl8_with_rgb8(mean_array));
// BEGIN DUMPING
label_img = compute_stats(input_rgb8, input_rgbn, histo, label, n_labels);
// mean_rgb8 = mln::labeling::mean_values(input_rgb8, label_img, n_labels);
// mln::io::ppm::save(mean_rgb8, "mean.ppm");
save_histo(i0_input, "h0_input.pgm");
// without anything
l2_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l2_histo));
i2_mean = mln::labeling::mean_values(i0_input, l2_input, n_lbl);
i2_merge = mln::data::transform(i0_input,t_merge_lbl8_with_rgbn<n>(l2_histo));
compute_stats(i0_input, l2_input, h1_input, l2_histo, n_lbl);
mln::io::pgm::save(l2_input, "l2_input.pgm");
mln::io::ppm::save(i2_mean, "i2_mean.ppm");
mln::io::ppm::save(i2_merge, "i2_merge.ppm");
save_histo(i2_mean, "h2_mean.pgm");
save_histo(i2_merge, "h2_merge.pgm");
output_rgb8 = mln::data::transform(input_rgb8,
t_merge_lbl8_with_rgbn<5>(label));
// with dilation
l3_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l3_histo));
i3_mean = mln::labeling::mean_values(i0_input, l3_input, n_lbl);
i3_merge = mln::data::transform(i0_input,t_merge_lbl8_with_rgbn<n>(l3_histo));
compute_stats(i0_input, l3_input, h1_input, l3_histo, n_lbl);
mln::io::ppm::save(output_rgb8, "merge.ppm");
mln::io::pgm::save(label_img, "label.pgm");
mln::io::pgm::save(l3_input, "l3_input.pgm");
mln::io::ppm::save(i3_mean, "i3_mean.ppm");
mln::io::ppm::save(i3_merge, "i3_merge.ppm");
save_histo(i3_mean, "h3_mean.pgm");
save_histo(i3_merge, "h3_merge.pgm");
// histo2 = mln::data::compute(t_histo3d_fun(), mean_rgbn);
// mln::debug::println(histo2);
// with geodesic influence
l4_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l4_histo));
i4_mean = mln::labeling::mean_values(i0_input, l4_input, n_lbl);
i4_merge = mln::data::transform(i0_input,t_merge_lbl8_with_rgbn<n>(l4_histo));
compute_stats(i0_input, l4_input, h1_input, l4_histo, n_lbl);
mln::io::pgm::save(l4_input, "l4_input.pgm");
mln::io::ppm::save(i4_mean, "i4_mean.ppm");
mln::io::ppm::save(i4_merge, "i4_merge.ppm");
save_histo(i4_mean, "h4_mean.pgm");
save_histo(i4_merge, "h4_merge.pgm");
// with restricted geodesic influence
l5_input = mln::data::transform(i1_input, t_labeling_rgbn<n>(l5_histo));
i5_mean = mln::labeling::mean_values(i0_input, l5_input, n_lbl);
i5_merge = mln::data::transform(i0_input,t_merge_lbl8_with_rgbn<n>(l5_histo));
compute_stats(i0_input, l5_input, h1_input, l5_histo, n_lbl);
mln::io::pgm::save(l5_input, "l5_input.pgm");
mln::io::ppm::save(i5_mean, "i5_mean.ppm");
mln::io::ppm::save(i5_merge, "i5_merge.ppm");
save_histo(i5_mean, "h5_mean.pgm");
save_histo(i5_merge, "h5_merge.pgm");
// END DUMPING
/*
......@@ -685,25 +748,14 @@ void demo(const std::string& image, const unsigned min_volume)
*/
}
/*
int main_old()
{
demo<2>(); // 2.26 s
demo<3>(); // 2.29 s
demo<4>(); // 2.29 s
demo<5>(); // 2.37 s
demo<6>(); // 3.19 s
demo<7>(); // 11.43 s
demo<8>(); // 96.19 s
}
*/
void usage()
{
std::cout << std::endl;
std::cout << "regional_maxima" << std::endl;
std::cout << "image <name>" << std::endl;
std::cout << "quantification {5,6}" << std::endl;
std::cout << "volume 1000" << std::endl;
std::cout << "min_volume 1000" << std::endl;
// 3 paramètres en entré:
// * l'image
......@@ -712,8 +764,14 @@ void usage()
// sorties:
// * fichier de stats [etiquette|couleur moyenne|% image|% classé]
// * couleur moyenne de l'étiquette + couleur specifique pour étiquette 0
// * histo sur l'image d'étiquette
// * image de labels
// * image reconstruite avec la moyenne de chaque classe [i_mean]
// * image reconstruite avec les couleurs de chaque classe [i_merge]
// * histogramme original de l'image d'entrée [h_input]
// * histogramme projeté de mean [h_mean]
// * histogramme projeté de merge [h_merge]
// *
}
int main(int argc, char* args[])
......
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