1 #include <vector>
2 #include <iostream>
3 #include <sstream>
4 #include "testlib/testlib_test.h"
5 #ifdef _MSC_VER
6 #  include "vcl_msvc_warnings.h"
7 #endif
8 #include "vil/vil_image_view.h"
9 #include <brip/brip_histogram.h>
10 
11 template <class T>
test_hist(const vil_image_view<T> & image,double min,double max,unsigned n_bins)12 void test_hist(const vil_image_view<T>& image,
13                double min, double max, unsigned n_bins)
14 {
15   std::vector<double> hist;
16 
17   double sum = brip_histogram(image, hist, min, max, n_bins);
18   double test_sum = 0.0;
19 
20   //std::cout << "Histogram: ";
21   for (double i : hist){
22     //std::cout << hist[i] << ' ';
23     test_sum += i;
24   }
25   //std::cout << std::endl;
26   //std::cout << "Sum: " << sum << std::endl;
27 
28   std::stringstream test_name;
29   test_name << "Validate Sums (" << n_bins <<" bins)";
30   TEST(test_name.str().c_str(), test_sum == sum && sum == image.ni()*image.nj()*image.nplanes(), true);
31 }
32 
33 template <class T>
test_hist_weight(const vil_image_view<T> & image,const vil_image_view<double> & weights,double min,double max,unsigned n_bins)34 void test_hist_weight(const vil_image_view<T>& image,
35                       const vil_image_view<double>& weights,
36                       double min, double max, unsigned n_bins)
37 {
38   double test_sum = 0.0;
39   for (unsigned int i=0; i<weights.ni(); ++i)
40     for (unsigned int j=0; j<weights.nj(); ++j)
41       for (unsigned int p=0; p<weights.nplanes(); ++p)
42         test_sum += weights(i,j,p);
43 
44   std::vector<double> hist;
45   double sum = brip_weighted_histogram(image, weights, hist, min, max, n_bins);
46 
47   double verify_sum = 0.0;
48   for (double i : hist)
49     verify_sum += i;
50 
51   std::stringstream test_name;
52   test_name<<"Validate Weights ("<<n_bins<<" bins, range "<<min<<"--"<<max<<')';
53   TEST_NEAR(test_name.str().c_str(), sum, test_sum, 1e-9);
54 
55   std::stringstream t;
56   t<<"Validate histogram sum ("<<n_bins<<" bins, range "<<min<<"--"<<max<<')';
57   TEST_NEAR(test_name.str().c_str(), verify_sum, test_sum, 1e-9);
58 }
59 
60 template <class T>
test_hist_joint(const vil_image_view<T> & image1,const vil_image_view<T> & image2,double min,double max,unsigned n_bins)61 void test_hist_joint(const vil_image_view<T>& image1,
62                      const vil_image_view<T>& image2,
63                      double min, double max, unsigned n_bins)
64 {
65   std::vector<std::vector<double> > hist;
66 
67   double sum = brip_joint_histogram(image1, image2, hist, min, max, n_bins);
68   double test_sum = 0.0;
69 
70   for (unsigned int i=0; i<n_bins; ++i) {
71     for (unsigned int j=0; j<n_bins; ++j) {
72       test_sum += hist[i][j];
73       //std::cout << hist[i][j] << ' ';
74     }
75     //std::cout << std::endl;
76   }
77 
78   //std::cout << "Sum: " << sum << std::endl;
79 
80   std::stringstream test_name;
81   test_name << "Validate Joint Sums (" << n_bins <<"^2 bins)";
82   TEST(test_name.str().c_str(),test_sum, sum);
83 }
84 
test_histogram()85 static void test_histogram()
86 {
87   unsigned int ni=256, nj=256;
88   vil_image_view<vxl_byte> image1(ni,nj), image2(ni,nj);
89   vil_image_view<double> image3(ni,nj);
90   for (unsigned j=0;j<nj;++j){
91     for (unsigned i=0;i<ni;++i){
92       image1(i,j) = vxl_byte((i+j-1)/2);
93       image2(i,j) = vxl_byte(i+3);
94       image3(i,j) = (i+j+7)/555.0; // so values are between 0 and 1 (= weights)
95     }
96   }
97 
98   ni = 1000; nj = 100;
99   vil_image_view<double> image4(ni,nj);
100   for (unsigned j=0;j<nj;++j)
101     for (unsigned i=0;i<ni;++i)
102       image4(i,j) = 10.0/(i+j+10);
103 
104   test_hist(image1, 0, 255, 16);
105   test_hist(image1, 0, 255, 256);
106   test_hist(image2, 0, 255, 16);
107   test_hist(image2, 0, 255, 256);
108   test_hist(image3, 0, 1, 5);
109   test_hist(image3, 0, 1, 100);
110   test_hist(image4, 0, 1, 5);
111   test_hist(image4, 0, 1, 100);
112 
113   test_hist_weight(image1, image3, 0, 255, 20);
114   test_hist_weight(image1, image3, 0, 255, 200);
115   test_hist_weight(image3, image3, 0, 1, 20);
116   test_hist_weight(image3, image3, 0, 1, 200);
117 
118   // extremal cases
119   test_hist_weight(image1, image3, 0, 255, 1);
120   test_hist_weight(image3, image3, 0, 1, 1);
121   test_hist_weight(image1, image3, 0, 255, 1000000);
122   test_hist_weight(image3, image3, 0, 1, 1000000);
123   // add empty bins
124   test_hist_weight(image1, image3, -100, 1000, 200);
125   test_hist_weight(image3, image3, -1, 2, 200);
126 
127   // include negative weights
128   image3(1,2) = -1; image3(5,3) = -0.5;
129   test_hist_weight(image1, image3, 0, 255, 20);
130   test_hist_weight(image1, image3, 0, 255, 200);
131   test_hist_weight(image3, image3, 0, 255, 20);
132   test_hist_weight(image3, image3, 0, 255, 200);
133   test_hist_weight(image1, image3, -100, 1000, 200);
134   test_hist_weight(image3, image3, -1, 2, 200);
135 
136   test_hist_joint(image1, image2, 0, 255, 16);
137   test_hist_joint(image1, image1, 0, 255, 16);
138 }
139 
140 TESTMAIN(test_histogram);
141