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