TestHistogram.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. #include "TestHistogram.h"
  2. #include <string>
  3. #include "core/image/ImageT.h"
  4. #include "core/image/ColorImageT.h"
  5. #include "core/image/Histogram.h"
  6. #ifdef NICE_USELIB_LIMUN_IOCOMPRESSION
  7. #include <iocompression/md5.h>
  8. #endif
  9. using namespace std;
  10. using namespace NICE;
  11. CPPUNIT_TEST_SUITE_REGISTRATION( TestHistogram );
  12. void TestHistogram::setUp()
  13. {
  14. }
  15. void TestHistogram::tearDown()
  16. {
  17. }
  18. void TestHistogram::testIterator()
  19. {
  20. Histogram hist(10);
  21. for(Ipp32u i=0; i<hist.size(); ++i)
  22. hist[i] = i+1;
  23. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(*hist.begin()));
  24. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(*(hist.end()-1)));
  25. CPPUNIT_ASSERT_EQUAL(static_cast<int>(*hist.getDataPointer()), static_cast<int>(*hist.begin()));
  26. Ipp32u j = 0;
  27. for(Histogram::iterator i=hist.begin(); i!=hist.end(); ++i,++j)
  28. CPPUNIT_ASSERT_EQUAL(static_cast<int>(hist[j]), static_cast<int>(*i));
  29. }
  30. void TestHistogram::testGrayHistogram()
  31. {
  32. Image src(10,10);
  33. for(int y=0; y<src.height(); ++y)
  34. for(int x=0; x<src.width(); ++x)
  35. src.setPixelQuick(x,y, (x+1)+y);
  36. // test with 20bins, range 0-20
  37. {
  38. Histogram hist(src,0,20);
  39. CPPUNIT_ASSERT_EQUAL( 20, static_cast<int>(hist.size()));
  40. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(hist.sum()));
  41. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.min()));
  42. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minIndex()));
  43. CPPUNIT_ASSERT_EQUAL( 10, static_cast<int>(hist.max()));
  44. CPPUNIT_ASSERT_EQUAL( 10, static_cast<int>(hist.maxIndex()));
  45. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  46. CPPUNIT_ASSERT_EQUAL( 20, static_cast<int>(hist.maxBorder()));
  47. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[0]));
  48. for(int i=1; i<=10; ++i) {
  49. CPPUNIT_ASSERT_EQUAL( i, static_cast<int>(hist[i]));
  50. CPPUNIT_ASSERT_EQUAL( i, static_cast<int>(hist[hist.size()-i]) );
  51. }
  52. }
  53. // test with 10bins, range 0-20
  54. {
  55. Histogram hist(src,0,20,10);
  56. CPPUNIT_ASSERT_EQUAL( 10, static_cast<int>(hist.size()));
  57. CPPUNIT_ASSERT_EQUAL( 10, static_cast<int>(hist.bins()));
  58. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(hist.sum()));
  59. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist.min()));
  60. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minIndex()));
  61. CPPUNIT_ASSERT_EQUAL( 19, static_cast<int>(hist.max()));
  62. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.maxIndex()));
  63. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  64. CPPUNIT_ASSERT_EQUAL( 20, static_cast<int>(hist.maxBorder()));
  65. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 0]));
  66. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist[ 1]));
  67. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist[ 2]));
  68. CPPUNIT_ASSERT_EQUAL(13, static_cast<int>(hist[ 3]));
  69. CPPUNIT_ASSERT_EQUAL(17, static_cast<int>(hist[ 4]));
  70. CPPUNIT_ASSERT_EQUAL(19, static_cast<int>(hist[ 5]));
  71. CPPUNIT_ASSERT_EQUAL(15, static_cast<int>(hist[ 6]));
  72. CPPUNIT_ASSERT_EQUAL(11, static_cast<int>(hist[ 7]));
  73. CPPUNIT_ASSERT_EQUAL( 7, static_cast<int>(hist[ 8]));
  74. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist[ 9]));
  75. }
  76. // test with 5bins, range 0-20
  77. {
  78. Histogram hist(src,0,20,5);
  79. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.size()));
  80. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(hist.sum()));
  81. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist.min()));
  82. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minIndex()));
  83. CPPUNIT_ASSERT_EQUAL( 36, static_cast<int>(hist.max()));
  84. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.maxIndex()));
  85. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  86. CPPUNIT_ASSERT_EQUAL( 20, static_cast<int>(hist.maxBorder()));
  87. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist[0]));
  88. CPPUNIT_ASSERT_EQUAL(22, static_cast<int>(hist[1]));
  89. CPPUNIT_ASSERT_EQUAL(36, static_cast<int>(hist[2]));
  90. CPPUNIT_ASSERT_EQUAL(26, static_cast<int>(hist[3]));
  91. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(hist[4]));
  92. }
  93. // test with 10bins, range 5-15
  94. {
  95. Histogram hist(src,5,15);
  96. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(hist.size()));
  97. CPPUNIT_ASSERT_EQUAL(75, static_cast<int>(hist.sum()));
  98. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.minBorder()));
  99. CPPUNIT_ASSERT_EQUAL(15, static_cast<int>(hist.maxBorder()));
  100. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(hist.bins()));
  101. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.min()));
  102. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minIndex()));
  103. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(hist.max()));
  104. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.maxIndex()));
  105. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist[ 0]));
  106. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist[ 1]));
  107. CPPUNIT_ASSERT_EQUAL( 7, static_cast<int>(hist[ 2]));
  108. CPPUNIT_ASSERT_EQUAL( 8, static_cast<int>(hist[ 3]));
  109. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist[ 4]));
  110. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(hist[ 5]));
  111. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist[ 6]));
  112. CPPUNIT_ASSERT_EQUAL( 8, static_cast<int>(hist[ 7]));
  113. CPPUNIT_ASSERT_EQUAL( 7, static_cast<int>(hist[ 8]));
  114. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist[ 9]));
  115. }
  116. // test with 5bins, range 5-15
  117. {
  118. Histogram hist(src,5,15,5);
  119. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.size()));
  120. CPPUNIT_ASSERT_EQUAL(75, static_cast<int>(hist.sum()));
  121. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.minBorder()));
  122. CPPUNIT_ASSERT_EQUAL(15, static_cast<int>(hist.maxBorder()));
  123. CPPUNIT_ASSERT_EQUAL(11, static_cast<int>(hist.min()));
  124. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minIndex()));
  125. CPPUNIT_ASSERT_EQUAL(19, static_cast<int>(hist.max()));
  126. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.maxIndex()));
  127. CPPUNIT_ASSERT_EQUAL(11, static_cast<int>(hist[0]));
  128. CPPUNIT_ASSERT_EQUAL(15, static_cast<int>(hist[1]));
  129. CPPUNIT_ASSERT_EQUAL(19, static_cast<int>(hist[2]));
  130. CPPUNIT_ASSERT_EQUAL(17, static_cast<int>(hist[3]));
  131. CPPUNIT_ASSERT_EQUAL(13, static_cast<int>(hist[4]));
  132. }
  133. }
  134. void TestHistogram::testGrayHistogramFromRect() {
  135. Image src(10,10);
  136. for(int y=0; y<src.height(); ++y) {
  137. for(int x=0; x<src.width(); ++x) {
  138. src.setPixelQuick(x,y, (x+1)+y);
  139. }
  140. }
  141. {
  142. Histogram hist(src, 0, 256, Rect(2,2,2,2));
  143. CPPUNIT_ASSERT_EQUAL(256, static_cast<Ipp32s>(hist.size()));
  144. CPPUNIT_ASSERT_EQUAL( 4, static_cast<Ipp32s>(hist.sum()));
  145. CPPUNIT_ASSERT_EQUAL( 1, static_cast<Ipp32s>(hist[5]));
  146. CPPUNIT_ASSERT_EQUAL( 2, static_cast<Ipp32s>(hist[6]));
  147. CPPUNIT_ASSERT_EQUAL( 1, static_cast<Ipp32s>(hist[7]));
  148. }
  149. {
  150. Histogram hist(src, 0, 256, Rect(2,2,5,5));
  151. CPPUNIT_ASSERT_EQUAL(256, static_cast<Ipp32s>(hist.size()));
  152. CPPUNIT_ASSERT_EQUAL( 25, static_cast<Ipp32s>(hist.sum()));
  153. CPPUNIT_ASSERT_EQUAL( 1, static_cast<Ipp32s>(hist[ 5]));
  154. CPPUNIT_ASSERT_EQUAL( 2, static_cast<Ipp32s>(hist[ 6]));
  155. CPPUNIT_ASSERT_EQUAL( 3, static_cast<Ipp32s>(hist[ 7]));
  156. CPPUNIT_ASSERT_EQUAL( 4, static_cast<Ipp32s>(hist[ 8]));
  157. CPPUNIT_ASSERT_EQUAL( 5, static_cast<Ipp32s>(hist[ 9]));
  158. CPPUNIT_ASSERT_EQUAL( 4, static_cast<Ipp32s>(hist[10]));
  159. CPPUNIT_ASSERT_EQUAL( 3, static_cast<Ipp32s>(hist[11]));
  160. CPPUNIT_ASSERT_EQUAL( 2, static_cast<Ipp32s>(hist[12]));
  161. CPPUNIT_ASSERT_EQUAL( 1, static_cast<Ipp32s>(hist[13]));
  162. }
  163. {
  164. Histogram hist(src, 0, 256, Rect(2,2,5,5), 30);
  165. CPPUNIT_ASSERT_EQUAL( 30, static_cast<Ipp32s>(hist.size()));
  166. CPPUNIT_ASSERT_EQUAL( 25, static_cast<Ipp32s>(hist.sum()));
  167. CPPUNIT_ASSERT_EQUAL( 10, static_cast<Ipp32s>(hist[0]));
  168. CPPUNIT_ASSERT_EQUAL( 15, static_cast<Ipp32s>(hist[1]));
  169. FloatVector* normHist = hist.normalized();
  170. CPPUNIT_ASSERT_DOUBLES_EQUAL( 10.0/25.0, (*normHist)[0], 1e-5);
  171. CPPUNIT_ASSERT_DOUBLES_EQUAL( 15.0/25.0, (*normHist)[1], 1e-5);
  172. }
  173. }
  174. void TestHistogram::testColorHistogram()
  175. {
  176. ColorImage src(2,2);
  177. for(int y=0; y<src.height(); ++y)
  178. for(int x=0; x<src.width(); ++x)
  179. src.setPixelQuick(x,y, (x+y), 2*(x+y), 3*(x+y));
  180. // create a histogram with 6 bins per channel [0,6) )
  181. {
  182. Histogram hist(src,0,6);
  183. CPPUNIT_ASSERT_EQUAL(18, static_cast<int>(hist.size()));
  184. CPPUNIT_ASSERT_EQUAL(11, static_cast<int>(hist.sum()));
  185. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist.bins()));
  186. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  187. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist.maxBorder()));
  188. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.min()));
  189. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist.minIndex()));
  190. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.max()));
  191. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist.maxIndex()));
  192. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 0]));
  193. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[ 1]));
  194. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 2]));
  195. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 3]));
  196. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 4]));
  197. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 5]));
  198. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 6]));
  199. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 7]));
  200. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[ 8]));
  201. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 9]));
  202. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[10]));
  203. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[11]));
  204. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[12]));
  205. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[13]));
  206. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[14]));
  207. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[15]));
  208. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[16]));
  209. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[17]));
  210. }
  211. // create a histogram with 7 bins per channel (values 0 to 6)
  212. {
  213. Histogram hist(src,0,6,3);
  214. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist.size()));
  215. CPPUNIT_ASSERT_EQUAL(11, static_cast<int>(hist.sum()));
  216. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  217. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist.maxBorder()));
  218. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist.bins()));
  219. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.min()));
  220. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.minIndex()));
  221. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist.max()));
  222. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.maxIndex()));
  223. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist[ 0]));
  224. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 1]));
  225. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 2]));
  226. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 3]));
  227. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[ 4]));
  228. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 5]));
  229. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 6]));
  230. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[ 7]));
  231. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 8]));
  232. }
  233. // create a histogram with 2 bins per channel [2,4)
  234. {
  235. Histogram hist(src,2,4);
  236. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(hist.size()));
  237. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.sum()));
  238. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.minBorder()));
  239. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(hist.maxBorder()));
  240. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.bins()));
  241. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.min()));
  242. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist.minIndex()));
  243. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.max()));
  244. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.maxIndex()));
  245. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist[ 0]));
  246. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 1]));
  247. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[ 2]));
  248. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 3]));
  249. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist[ 4]));
  250. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist[ 5]));
  251. }
  252. }
  253. void TestHistogram::testProp()
  254. {
  255. Image src(5,5);
  256. for(int y=0; y<src.height(); ++y)
  257. for(int x=0; x<src.width(); ++x)
  258. src(x,y) = x+y;
  259. Histogram hist(src,0,9);
  260. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist.min()));
  261. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minIndex()));
  262. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(hist.max()));
  263. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(hist.maxIndex()));
  264. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist.bins()));
  265. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  266. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist.maxBorder()));
  267. CPPUNIT_ASSERT_EQUAL(25, static_cast<int>(hist.sum()));
  268. CPPUNIT_ASSERT_EQUAL( false, hist.isWithin(-1));
  269. CPPUNIT_ASSERT_EQUAL( false, hist.isWithin( 9));
  270. CPPUNIT_ASSERT_EQUAL( true, hist.isWithin( 0));
  271. CPPUNIT_ASSERT_EQUAL( true, hist.isWithin( 8));
  272. // write, read and compare
  273. {
  274. Histogram hist2;
  275. CPPUNIT_ASSERT_EQUAL(true, hist.write("test1.color.hist"));
  276. CPPUNIT_ASSERT_EQUAL(true, hist2.read("test1.color.hist"));
  277. CPPUNIT_ASSERT_EQUAL(true, hist2.write("test2.color.hist"));
  278. #ifdef NICE_USELIB_LIMUN_IOCOMPRESSION
  279. {
  280. std::ifstream hf1("test1.color.hist");
  281. std::ifstream hf2("test2.color.hist");
  282. MD5::MD5 md5hf1(hf1);
  283. MD5::MD5 md5hf2(hf2);
  284. hf1.close();
  285. hf2.close();
  286. string m1 = md5hf1.hex_digest();
  287. string m2 = md5hf2.hex_digest();
  288. CPPUNIT_ASSERT_EQUAL(m1,m2);
  289. }
  290. #endif
  291. system("rm test1.color.hist test2.color.hist");
  292. }
  293. }
  294. void TestHistogram::testOp()
  295. {
  296. // test exceptions
  297. {
  298. Histogram h1(5), h2(3);
  299. CPPUNIT_ASSERT_THROW(h1 +h2, ImageException);
  300. CPPUNIT_ASSERT_THROW(h1+=h2, ImageException);
  301. }
  302. Histogram h1(3), h2(3);
  303. h1[0] = 4; h1[1] = 2; h1[2] = 6;
  304. h2[0] = 4; h2[1] = 2; h2[2] = 6;
  305. // test boolean operators
  306. CPPUNIT_ASSERT_EQUAL(true, h1==h2);
  307. CPPUNIT_ASSERT_EQUAL(false, h1!=h2);
  308. // test add
  309. Histogram h3 = h1+h2;
  310. CPPUNIT_ASSERT_EQUAL( 8, static_cast<int>(h3[0]));
  311. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(h3[1]));
  312. CPPUNIT_ASSERT_EQUAL(12, static_cast<int>(h3[2]));
  313. h1 += h2;
  314. CPPUNIT_ASSERT_EQUAL(true, h1==h3);
  315. // = element
  316. {
  317. h3 = 128;
  318. for(Histogram::iterator i=h3.begin(); i!=h3.end(); ++i)
  319. CPPUNIT_ASSERT_EQUAL(128, static_cast<int>(*i));
  320. h3 = 33;
  321. for(Histogram::iterator i=h3.begin(); i!=h3.end(); ++i)
  322. CPPUNIT_ASSERT_EQUAL( 33, static_cast<int>(*i));
  323. }
  324. // = Histogram
  325. {
  326. Histogram t1(100);
  327. t1 = 128;
  328. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(t1.size()));
  329. for(Histogram::iterator i=t1.begin(); i!=t1.end(); ++i)
  330. CPPUNIT_ASSERT_EQUAL(128, static_cast<int>(*i));
  331. Histogram t2(50);
  332. t2 = 64;
  333. CPPUNIT_ASSERT_EQUAL( 50, static_cast<int>(t2.size()));
  334. for(Histogram::iterator i=t2.begin(); i!=t2.end(); ++i)
  335. CPPUNIT_ASSERT_EQUAL( 64, static_cast<int>(*i));
  336. CPPUNIT_ASSERT_EQUAL( true, t1!=t2);
  337. CPPUNIT_ASSERT_EQUAL(false, t1==t2);
  338. t2 = t1;
  339. CPPUNIT_ASSERT_EQUAL(static_cast<int>(t1.size()), static_cast<int>(t2.size()));
  340. for(uint i=0; i<t2.size(); ++i)
  341. CPPUNIT_ASSERT_EQUAL(static_cast<int>(t1[i]), static_cast<int>(t2[i]));
  342. CPPUNIT_ASSERT_EQUAL(false, t1!=t2);
  343. CPPUNIT_ASSERT_EQUAL( true, t1==t2);
  344. }
  345. }
  346. void TestHistogram::testCumulative_Normalized()
  347. {
  348. Histogram hist(9);
  349. hist[0] = 1; hist[1] = 2; hist[2] = 3; hist[3] = 4;
  350. hist[4] = 5;
  351. hist[5] = 4; hist[6] = 3; hist[7] = 2; hist[8] = 1;
  352. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist.size()));
  353. CPPUNIT_ASSERT_EQUAL(25, static_cast<int>(hist.sum()));
  354. // cumulative
  355. {
  356. IntVector cum = *hist.cumulative();
  357. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(cum.size()));
  358. CPPUNIT_ASSERT_EQUAL(125, static_cast<int>(cum.Sum()));
  359. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(cum[0]));
  360. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(cum[1]));
  361. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(cum[2]));
  362. CPPUNIT_ASSERT_EQUAL(10, static_cast<int>(cum[3]));
  363. CPPUNIT_ASSERT_EQUAL(15, static_cast<int>(cum[4]));
  364. CPPUNIT_ASSERT_EQUAL(19, static_cast<int>(cum[5]));
  365. CPPUNIT_ASSERT_EQUAL(22, static_cast<int>(cum[6]));
  366. CPPUNIT_ASSERT_EQUAL(24, static_cast<int>(cum[7]));
  367. CPPUNIT_ASSERT_EQUAL(25, static_cast<int>(cum[8]));
  368. }
  369. // normalized
  370. {
  371. FloatVector norm = *hist.normalized();
  372. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(norm.size()));
  373. CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, static_cast<double>(norm.Sum()), 0.00001);
  374. CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0/25.0, static_cast<double>(norm[0]), 0.00001);
  375. CPPUNIT_ASSERT_DOUBLES_EQUAL( 2.0/25.0, static_cast<double>(norm[1]), 0.00001);
  376. CPPUNIT_ASSERT_DOUBLES_EQUAL( 3.0/25.0, static_cast<double>(norm[2]), 0.00001);
  377. CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.0/25.0, static_cast<double>(norm[3]), 0.00001);
  378. CPPUNIT_ASSERT_DOUBLES_EQUAL( 5.0/25.0, static_cast<double>(norm[4]), 0.00001);
  379. CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.0/25.0, static_cast<double>(norm[5]), 0.00001);
  380. CPPUNIT_ASSERT_DOUBLES_EQUAL( 3.0/25.0, static_cast<double>(norm[6]), 0.00001);
  381. CPPUNIT_ASSERT_DOUBLES_EQUAL( 2.0/25.0, static_cast<double>(norm[7]), 0.00001);
  382. CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0/25.0, static_cast<double>(norm[8]), 0.00001);
  383. }
  384. }
  385. void TestHistogram::testCombined()
  386. {
  387. // test exception
  388. {
  389. Image f1(3,3);
  390. Histogram f1h(f1,0,256);
  391. CPPUNIT_ASSERT_THROW(f1h.reproject(0,0,0), ImageException);
  392. ColorImage f2(3,3);
  393. Histogram f2h(f2,0,256);
  394. CPPUNIT_ASSERT_THROW(f2h.reproject(0,0,0), ImageException);
  395. }
  396. ColorImage src(1,17);
  397. src.setPixelQuick(0, 0, 255, 0, 0);
  398. src.setPixelQuick(0, 1, 0,255, 0);
  399. src.setPixelQuick(0, 2, 0, 0,255);
  400. src.setPixelQuick(0, 3, 255,255, 0);
  401. src.setPixelQuick(0, 4, 0,255,255);
  402. src.setPixelQuick(0, 5, 255, 0,255);
  403. src.setPixelQuick(0, 6, 255,255,255);
  404. src.setPixelQuick(0, 7, 128, 0, 0);
  405. src.setPixelQuick(0, 8, 0,128, 0);
  406. src.setPixelQuick(0, 9, 0, 0,128);
  407. src.setPixelQuick(0,10, 128,128, 0);
  408. src.setPixelQuick(0,11, 0,128,128);
  409. src.setPixelQuick(0,12, 128, 0,128);
  410. src.setPixelQuick(0,13, 128,128,128);
  411. src.setPixelQuick(0,14, 0,192,132);
  412. src.setPixelQuick(0,15, 0, 0, 0);
  413. src.setPixelQuick(0,16, 0, 0, 26);
  414. // [0,256) with 10 bins per channel, first channel is ignored
  415. {
  416. Ipp32u bins = 10;
  417. Histogram hist(src, 0,256, bins, true);
  418. CPPUNIT_ASSERT_EQUAL(static_cast<int>(bins*bins+bins), static_cast<int>(hist.size()));
  419. CPPUNIT_ASSERT_EQUAL(static_cast<int>(src.height()) , static_cast<int>(hist.sum()));
  420. CPPUNIT_ASSERT_EQUAL(static_cast<int>(bins) , static_cast<int>(hist.bins()));
  421. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.min()));
  422. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(hist.minIndex()));
  423. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist.max()));
  424. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.maxIndex()));
  425. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.minBorder()));
  426. CPPUNIT_ASSERT_EQUAL( 256, static_cast<int>(hist.maxBorder()));
  427. CPPUNIT_ASSERT_EQUAL( 17, static_cast<int>(hist.sum()));
  428. // now check the reprojection
  429. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(hist.reproject( 0, 0, 0)));
  430. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(hist.reproject( 0, 0, 26)));
  431. CPPUNIT_ASSERT_EQUAL(109, static_cast<int>(hist.reproject(255,255,255)));
  432. CPPUNIT_ASSERT_EQUAL( 50, static_cast<int>(hist.reproject( 0,128, 0)));
  433. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(hist.reproject( 0, 0,255)));
  434. // because noLum==true
  435. CPPUNIT_ASSERT_EQUAL(static_cast<int>(hist.reproject( 0,255,255)),
  436. static_cast<int>(hist.reproject(255,255,255)));
  437. CPPUNIT_ASSERT_EQUAL(static_cast<int>(hist.reproject( 0,128,128)),
  438. static_cast<int>(hist.reproject(128,128,128)));
  439. CPPUNIT_ASSERT_EQUAL(static_cast<int>(hist.reproject(255,255, 0)),
  440. static_cast<int>(hist.reproject( 0,255, 0)));
  441. }
  442. // [100,200) mit 10 bins
  443. {
  444. int bins = 10;
  445. Histogram hist(src, 100,200, bins, true);
  446. CPPUNIT_ASSERT_EQUAL(static_cast<int>(bins*bins+bins), static_cast<int>(hist.size()));
  447. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(hist.sum()));
  448. CPPUNIT_ASSERT_EQUAL( bins, static_cast<int>(hist.bins()));
  449. CPPUNIT_ASSERT_EQUAL( 30, static_cast<int>(hist.reproject(0,128,128)));
  450. CPPUNIT_ASSERT_EQUAL( 95, static_cast<int>(hist.reproject(0,192,132)));
  451. CPPUNIT_ASSERT_EQUAL( 55, static_cast<int>(hist.reproject(0,150,150)));
  452. CPPUNIT_ASSERT_EQUAL( 39, static_cast<int>(hist.reproject(0,133,166)));
  453. }
  454. }