ImageTest.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. #include "ImageTest.h"
  2. #include <string>
  3. #include <core/image/ippwrapper.h>
  4. #include <core/image/ImageT.h>
  5. #include <core/image/ImageT.h>
  6. #include <core/image/ColorImageT.h>
  7. #include "core/basics/cppunitex.h"
  8. using namespace std;
  9. using namespace NICE;
  10. CPPUNIT_TEST_SUITE_REGISTRATION( ImageTest );
  11. void ImageTest::setUp() {
  12. }
  13. void ImageTest::tearDown() {
  14. }
  15. void ImageTest::testFloatImage() {
  16. int width=10;
  17. int height=10;
  18. FloatImage fimg(width,height);
  19. fimg=0;
  20. for(int w=0;w<width;w++) {
  21. fimg(w,height/2) = -25*w;
  22. }
  23. for(int h=0;h<height;h++) {
  24. fimg(width/2,h) = 25*h;
  25. }
  26. // fimg.writeColored(ImageFile("test.png",ImageFile::PNG));
  27. }
  28. void printGrayImage2(Image *result)
  29. {
  30. printf("\n");
  31. for(int j=0; j<result->height(); ++j)
  32. {
  33. for(int i=0; i<result->width(); ++i)
  34. {
  35. if((*result)(i,j)<100) printf(" ");
  36. if((*result)(i,j)<10) printf(" ");
  37. printf("%i ",(*result)(i,j));
  38. }
  39. printf("\n");
  40. }
  41. }
  42. void ImageTest::testGrayImage()
  43. {
  44. Image image(4,3);
  45. CPPUNIT_ASSERT_EQUAL(4, image.width());
  46. CPPUNIT_ASSERT_EQUAL(3, image.height());
  47. // setPixel
  48. CPPUNIT_ASSERT_THROW(image.setPixel(4, 2, 11), ImageException);
  49. CPPUNIT_ASSERT_THROW(image.setPixel(3, 3, 12), ImageException);
  50. CPPUNIT_ASSERT_NO_THROW(image.setPixelSave(4, 2, 11));
  51. CPPUNIT_ASSERT_NO_THROW(image.setPixelSave(3, 3, 12));
  52. CPPUNIT_ASSERT_THROW(image.getPixel(4, 2), ImageException);
  53. CPPUNIT_ASSERT_THROW(image.getPixel(3, 3), ImageException);
  54. image.setPixel(0, 0, 11);
  55. image.setPixel(3, 2, 12);
  56. CPPUNIT_ASSERT_EQUAL(11, (int)image.getPixel(0, 0));
  57. CPPUNIT_ASSERT_EQUAL(12, (int)image.getPixel(3, 2));
  58. CPPUNIT_ASSERT_EQUAL(12, (int)*image.getPixelPointerXY(3, 2));
  59. // operator ==, !=
  60. {
  61. Image img(2,2);
  62. img.set(133);
  63. // Image::set test
  64. CPPUNIT_ASSERT_EQUAL(133, static_cast<int>(img.getPixel(0,0)));
  65. CPPUNIT_ASSERT_EQUAL(133, static_cast<int>(img.getPixel(1,0)));
  66. CPPUNIT_ASSERT_EQUAL(133, static_cast<int>(img.getPixel(0,1)));
  67. CPPUNIT_ASSERT_EQUAL(133, static_cast<int>(img.getPixel(1,1)));
  68. Image timg(3,2);
  69. CPPUNIT_ASSERT_THROW(timg==img, ImageException);
  70. CPPUNIT_ASSERT_THROW(timg!=img, ImageException);
  71. timg = img;
  72. CPPUNIT_ASSERT_EQUAL(true, timg==img);
  73. CPPUNIT_ASSERT_EQUAL(false, timg!=img);
  74. timg.setPixelQuick(1,1,0);
  75. CPPUNIT_ASSERT_EQUAL(false, timg==img);
  76. CPPUNIT_ASSERT_EQUAL(true, timg!=img);
  77. }
  78. // invert
  79. Image image2(image, GrayColorImageCommonImplementation::noAlignment);
  80. CPPUNIT_ASSERT_EQUAL(11, (int)image.getPixel(0,0));
  81. CPPUNIT_ASSERT_EQUAL(12, (int)image.getPixel(3,2));
  82. CPPUNIT_ASSERT_EQUAL(11, (int)image2.getPixel(0,0));
  83. CPPUNIT_ASSERT_EQUAL(12, (int)image2.getPixel(3,2));
  84. CPPUNIT_ASSERT_EQUAL(12, (int) image2.getPixel(3, 2));
  85. CPPUNIT_ASSERT_EQUAL(12, (int) image.getPixel(3, 2));
  86. CPPUNIT_ASSERT_EQUAL(true, image == image2);
  87. image2.invert();
  88. CPPUNIT_ASSERT_EQUAL(false, image == image2);
  89. CPPUNIT_ASSERT_EQUAL(255-11, (int)image2.getPixel(0,0));
  90. CPPUNIT_ASSERT_EQUAL(255-12, (int)image2.getPixel(3,2));
  91. // mirror
  92. Image image3 = Image(3,4);
  93. for(int j=0; j<image3.height(); ++j)
  94. for(int i=0; i<image3.width(); ++i)
  95. image3.setPixel(i,j, (i+1)+j*(image3.width()));
  96. image3.mirror(ippAxsVertical);
  97. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(image3.getPixel(0,0)));
  98. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(image3.getPixel(1,0)));
  99. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(image3.getPixel(2,0)));
  100. image3.mirror(ippAxsVertical);
  101. image3.mirror(ippAxsHorizontal);
  102. CPPUNIT_ASSERT_EQUAL( 10, static_cast<int>(image3.getPixel(0,0)));
  103. CPPUNIT_ASSERT_EQUAL( 7, static_cast<int>(image3.getPixel(0,1)));
  104. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(image3.getPixel(0,2)));
  105. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(image3.getPixel(0,3)));
  106. image3.mirror(ippAxsHorizontal);
  107. image3.mirror(ippAxsBoth);
  108. CPPUNIT_ASSERT_EQUAL( 12, static_cast<int>(image3.getPixel(0,0)));
  109. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(image3.getPixel(0,1)));
  110. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(image3.getPixel(2,2)));
  111. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(image3.getPixel(2,3)));
  112. // transpose
  113. Image image4 = Image(3,4);
  114. CPPUNIT_ASSERT_THROW(image4.transpose(), ImageException);
  115. for(int s=1; s<=8; ++s)
  116. {
  117. image4 = Image(s,s);
  118. for(int j=0; j<image4.height(); ++j)
  119. for(int i=0; i<image4.width(); ++i)
  120. image4.setPixel(i,j, (i+1)+j*(image4.width()));
  121. image4.transpose();
  122. for(int j=0; j<image4.height(); ++j)
  123. for(int i=0; i<image4.width(); ++i)
  124. CPPUNIT_ASSERT_EQUAL(static_cast<int>((j+1)+i*(image4.width())),
  125. static_cast<int>(image4.getPixel(i,j)));
  126. }
  127. // set
  128. image4.set(133);
  129. CPPUNIT_ASSERT_EQUAL(133, static_cast<int>(image4.getPixel(1,1)));
  130. CPPUNIT_ASSERT_EQUAL(133, static_cast<int>(image4.getPixel(2,2)));
  131. image4.set(0);
  132. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(image4.getPixel(0,1)));
  133. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(image4.getPixel(1,0)));
  134. image4.set(255);
  135. CPPUNIT_ASSERT_EQUAL(255, static_cast<int>(image4.getPixel(2,3)));
  136. CPPUNIT_ASSERT_EQUAL(255, static_cast<int>(image4.getPixel(2,0)));
  137. // copyRect
  138. image4 = Image(10,10);
  139. for(int y=0; y<image4.width(); ++y)
  140. for(int x=0; x<image4.width(); ++x)
  141. image4(x,y) = x+1+y*image4.width();
  142. Image* imgRect = image4.copyRect(Rect(2,3,4,3));
  143. CPPUNIT_ASSERT_EQUAL(4, static_cast<int>(imgRect->width()));
  144. CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(imgRect->height()));
  145. for(int y=0; y<imgRect->height(); ++y)
  146. for(int x=0; x<imgRect->width(); ++x)
  147. CPPUNIT_ASSERT_EQUAL((x+3)+(y+3)*image4.width(), static_cast<int>(imgRect->getPixel(x,y)));
  148. imgRect = image4.copyRect(Rect(7,6,10,10));
  149. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(imgRect->width()));
  150. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(imgRect->height()));
  151. CPPUNIT_ASSERT_EQUAL( 68, static_cast<int>(imgRect->getPixel(0,0)));
  152. CPPUNIT_ASSERT_EQUAL( 69, static_cast<int>(imgRect->getPixel(1,0)));
  153. CPPUNIT_ASSERT_EQUAL( 70, static_cast<int>(imgRect->getPixel(2,0)));
  154. CPPUNIT_ASSERT_EQUAL( 98, static_cast<int>(imgRect->getPixel(0,3)));
  155. CPPUNIT_ASSERT_EQUAL( 99, static_cast<int>(imgRect->getPixel(1,3)));
  156. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(imgRect->getPixel(2,3)));
  157. }
  158. void ImageTest::testGrayImage16s()
  159. {
  160. GrayImage16s image(4,3);
  161. CPPUNIT_ASSERT_EQUAL(4, image.width());
  162. CPPUNIT_ASSERT_EQUAL(3, image.height());
  163. CPPUNIT_ASSERT_THROW(image.setPixel(4, 2, 11), ImageException);
  164. CPPUNIT_ASSERT_THROW(image.setPixel(3, 3, 12), ImageException);
  165. CPPUNIT_ASSERT_NO_THROW(image.setPixelSave(4, 2, 11));
  166. CPPUNIT_ASSERT_NO_THROW(image.setPixelSave(3, 3, 12));
  167. CPPUNIT_ASSERT_THROW(image.getPixel(4, 2), ImageException);
  168. CPPUNIT_ASSERT_THROW(image.getPixel(3, 3), ImageException);
  169. image.setPixel(0, 0, 11);
  170. image.setPixel(3, 2, 12);
  171. CPPUNIT_ASSERT_EQUAL(11, (int) image.getPixel(0, 0));
  172. CPPUNIT_ASSERT_EQUAL(12, (int) image.getPixel(3, 2));
  173. CPPUNIT_ASSERT_EQUAL(12, (int) *image.getPixelPointerXY(3, 2));
  174. GrayImage16s image2(image, GrayColorImageCommonImplementation::noAlignment);
  175. CPPUNIT_ASSERT_EQUAL(12, (int) image.getPixel(3, 2));
  176. CPPUNIT_ASSERT_EQUAL(12, (int) image2.getPixel(3, 2));
  177. }
  178. void ImageTest::testColorImage()
  179. {
  180. ColorImage image(4,3);
  181. CPPUNIT_ASSERT_EQUAL(4, image.width());
  182. CPPUNIT_ASSERT_EQUAL(3, image.height());
  183. CPPUNIT_ASSERT_THROW(image.setPixel(4, 2, 1, 11), ImageException);
  184. CPPUNIT_ASSERT_THROW(image.setPixel(3, 3, 2, 12), ImageException);
  185. CPPUNIT_ASSERT_NO_THROW(image.setPixelSave(4, 2, 11, 12, 13));
  186. CPPUNIT_ASSERT_NO_THROW(image.setPixelSave(3, 3, 11, 12, 13));
  187. CPPUNIT_ASSERT_THROW(image.getPixel(4, 2, 1), ImageException);
  188. CPPUNIT_ASSERT_THROW(image.getPixel(3, 3, 2), ImageException);
  189. image.setPixel(0, 0, 11, 12, 13);
  190. image.setPixel(3, 2, 25, 26, 27);
  191. CPPUNIT_ASSERT_EQUAL(11, (int) image.getPixel(0, 0, 0));
  192. CPPUNIT_ASSERT_EQUAL(12, (int) image.getPixel(0, 0, 1));
  193. CPPUNIT_ASSERT_EQUAL(13, (int) image.getPixel(0, 0, 2));
  194. CPPUNIT_ASSERT_EQUAL(25, (int) image.getPixel(3, 2, 0));
  195. CPPUNIT_ASSERT_EQUAL(26, (int) image.getPixel(3, 2, 1));
  196. CPPUNIT_ASSERT_EQUAL(27, (int) image.getPixel(3, 2, 2));
  197. CPPUNIT_ASSERT_EQUAL(25, (int) *image.getPixelPointerXY(3, 2));
  198. ColorImage image2(image, GrayColorImageCommonImplementation::noAlignment);
  199. CPPUNIT_ASSERT_EQUAL(26, (int) image.getPixel(3, 2, 1));
  200. CPPUNIT_ASSERT_EQUAL(26, (int) image2.getPixel(3, 2, 1));
  201. // set
  202. ColorImage image3(10,10);
  203. image3.set(15,64,253);
  204. for(int y=0; y<image3.height(); ++y)
  205. for(int x=0; x<image3.width(); ++x)
  206. {
  207. CPPUNIT_ASSERT_EQUAL( 15, static_cast<int>(image3.getPixelQuick(x,y,0)));
  208. CPPUNIT_ASSERT_EQUAL( 64, static_cast<int>(image3.getPixelQuick(x,y,1)));
  209. CPPUNIT_ASSERT_EQUAL(253, static_cast<int>(image3.getPixelQuick(x,y,2)));
  210. }
  211. // operator =, ==, !=
  212. {
  213. ColorImage img(2,2);
  214. img.set(0,0,0);
  215. img.setPixelQuick(1,1,0,133);
  216. ColorImage fimg(3,2);
  217. CPPUNIT_ASSERT_THROW(fimg==img, ImageException);
  218. CPPUNIT_ASSERT_THROW(fimg!=img, ImageException);
  219. ColorImage timg;
  220. timg = img;
  221. CPPUNIT_ASSERT_NO_THROW(img==timg);
  222. CPPUNIT_ASSERT_EQUAL(true, img==timg);
  223. CPPUNIT_ASSERT_EQUAL(false, img!=timg);
  224. timg.setPixelQuick(0,0,3,99);
  225. CPPUNIT_ASSERT_NO_THROW(img!=timg);
  226. CPPUNIT_ASSERT_EQUAL(true, img!=timg);
  227. CPPUNIT_ASSERT_EQUAL(false, img==timg);
  228. }
  229. // Kontruktor: create a ColorImageT from 3 Channel Images ImageT
  230. {
  231. // exception
  232. {
  233. Image chan1, chan2, chan3;
  234. chan1 = Image(5,6);
  235. chan2 = Image(6,7);
  236. chan3 = Image(7,8);
  237. CPPUNIT_ASSERT_THROW(ColorImage c(chan1,chan2,chan3), ImageException);
  238. }
  239. // <Ipp8u>
  240. {
  241. Image chan1(5,5), chan2(5,5), chan3(5,5);
  242. chan1.set(100);
  243. chan2.set(150);
  244. chan3.set(200);
  245. for(int y=0; y<chan1.height(); ++y)
  246. for(int x=0; x<chan1.width(); ++x)
  247. {
  248. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(chan1.getPixelQuick(x,y)));
  249. CPPUNIT_ASSERT_EQUAL(150, static_cast<int>(chan2.getPixelQuick(x,y)));
  250. CPPUNIT_ASSERT_EQUAL(200, static_cast<int>(chan3.getPixelQuick(x,y)));
  251. }
  252. ColorImage c(chan1,chan2,chan3);
  253. CPPUNIT_ASSERT_EQUAL(static_cast<int>(c.width()), static_cast<int>(chan1.width()));
  254. CPPUNIT_ASSERT_EQUAL(static_cast<int>(c.height()), static_cast<int>(chan1.height()));
  255. for(int y=0; y<c.height(); ++y)
  256. for(int x=0; x<c.width(); ++x)
  257. {
  258. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(c.getPixelQuick(x,y,0)));
  259. CPPUNIT_ASSERT_EQUAL(150, static_cast<int>(c.getPixelQuick(x,y,1)));
  260. CPPUNIT_ASSERT_EQUAL(200, static_cast<int>(c.getPixelQuick(x,y,2)));
  261. }
  262. }
  263. // FloatImage
  264. {
  265. FloatImage chan1(5,5), chan2(5,5), chan3(5,5);
  266. chan1.set( -50.0);
  267. chan2.set(1000.0);
  268. chan3.set( 1.0);
  269. for(int y=0; y<chan1.height(); ++y)
  270. for(int x=0; x<chan1.width(); ++x)
  271. {
  272. CPPUNIT_ASSERT_EQUAL( -50.0, static_cast<double>(chan1.getPixelQuick(x,y)));
  273. CPPUNIT_ASSERT_EQUAL(1000.0, static_cast<double>(chan2.getPixelQuick(x,y)));
  274. CPPUNIT_ASSERT_EQUAL( 1.0, static_cast<double>(chan3.getPixelQuick(x,y)));
  275. }
  276. ColorImageT<float> c(chan1,chan2,chan3);
  277. for(int y=0; y<c.height(); ++y)
  278. for(int x=0; x<c.width(); ++x)
  279. {
  280. CPPUNIT_ASSERT_DOUBLES_EQUAL( -50.0, static_cast<double>(c.getPixelQuick(x,y,0)), 0.0);
  281. CPPUNIT_ASSERT_DOUBLES_EQUAL(1000.0, static_cast<double>(c.getPixelQuick(x,y,1)), 0.0);
  282. CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, static_cast<double>(c.getPixelQuick(x,y,2)), 0.0);
  283. }
  284. }
  285. // Ipp16s
  286. {
  287. ImageT<Ipp16s> chan1(5,5), chan2(5,5), chan3(5,5);
  288. chan1.set(-255);
  289. chan2.set(+255);
  290. chan3.set( 0);
  291. for(int y=0; y<chan1.height(); ++y)
  292. for(int x=0; x<chan1.width(); ++x)
  293. {
  294. CPPUNIT_ASSERT_EQUAL(-255, static_cast<int>(chan1.getPixelQuick(x,y)));
  295. CPPUNIT_ASSERT_EQUAL(+255, static_cast<int>(chan2.getPixelQuick(x,y)));
  296. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(chan3.getPixelQuick(x,y)));
  297. }
  298. ColorImageT<Ipp16s> c(chan1,chan2,chan3);
  299. for(int y=0; y<c.height(); ++y)
  300. for(int x=0; x<c.width(); ++x)
  301. {
  302. CPPUNIT_ASSERT_EQUAL(-255, static_cast<int>(c.getPixelQuick(x,y,0)));
  303. CPPUNIT_ASSERT_EQUAL(+255, static_cast<int>(c.getPixelQuick(x,y,1)));
  304. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(c.getPixelQuick(x,y,2)));
  305. }
  306. }
  307. }
  308. // getChannel
  309. {
  310. // exception
  311. {
  312. ColorImage c(5,5);
  313. CPPUNIT_ASSERT_NO_THROW(c.getChannel(0));
  314. CPPUNIT_ASSERT_NO_THROW(c.getChannel(1));
  315. CPPUNIT_ASSERT_NO_THROW(c.getChannel(2));
  316. CPPUNIT_ASSERT_THROW(c.getChannel( 3), ImageException);
  317. CPPUNIT_ASSERT_THROW(c.getChannel( 4), ImageException);
  318. }
  319. // <Ipp8u>
  320. {
  321. ColorImage c(5,5);
  322. for(int y=0; y<c.height(); ++y)
  323. for(int x=0; x<c.width(); ++x)
  324. c.setPixelQuick(x,y, 100,150,200);
  325. Image* g0 = c.getChannel(0);
  326. Image* g1 = c.getChannel(1);
  327. Image* g2 = c.getChannel(2);
  328. for(int y=0; y<c.height(); ++y)
  329. for(int x=0; x<c.width(); ++x)
  330. {
  331. CPPUNIT_ASSERT_EQUAL(100, static_cast<int>(g0->getPixelQuick(x,y)));
  332. CPPUNIT_ASSERT_EQUAL(150, static_cast<int>(g1->getPixelQuick(x,y)));
  333. CPPUNIT_ASSERT_EQUAL(200, static_cast<int>(g2->getPixelQuick(x,y)));
  334. }
  335. }
  336. // FloatImage
  337. {
  338. ColorImageT<float> c(5,5);
  339. for(int y=0; y<c.height(); ++y)
  340. for(int x=0; x<c.width(); ++x)
  341. c.setPixelQuick(x,y, -1000.125, 1.32678, +999.999);
  342. FloatImage* g0 = c.getChannel(0);
  343. FloatImage* g1 = c.getChannel(1);
  344. FloatImage* g2 = c.getChannel(2);
  345. for(int y=0; y<c.height(); ++y)
  346. for(int x=0; x<c.width(); ++x)
  347. {
  348. CPPUNIT_ASSERT_DOUBLES_EQUAL(-1000.125, static_cast<double>(g0->getPixelQuick(x,y)), 0.001);
  349. CPPUNIT_ASSERT_DOUBLES_EQUAL(1.32678 , static_cast<double>(g1->getPixelQuick(x,y)), 0.00001);
  350. CPPUNIT_ASSERT_DOUBLES_EQUAL(999.999 , static_cast<double>(g2->getPixelQuick(x,y)), 0.001);
  351. }
  352. }
  353. // <Ipp16s>
  354. {
  355. ColorImageT<Ipp16s> c(5,5);
  356. for(int y=0; y<c.height(); ++y)
  357. for(int x=0; x<c.width(); ++x)
  358. c.setPixelQuick(x,y, -255, 0, +255);
  359. GrayImage16s* g0 = c.getChannel(0);
  360. GrayImage16s* g1 = c.getChannel(1);
  361. GrayImage16s* g2 = c.getChannel(2);
  362. for(int y=0; y<c.height(); ++y)
  363. for(int x=0; x<c.width(); ++x)
  364. {
  365. CPPUNIT_ASSERT_EQUAL(-255, static_cast<int>(g0->getPixelQuick(x,y)));
  366. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(g1->getPixelQuick(x,y)));
  367. CPPUNIT_ASSERT_EQUAL(+255, static_cast<int>(g2->getPixelQuick(x,y)));
  368. }
  369. }
  370. }
  371. // mirror
  372. ColorImage image4(5,5);
  373. for(int y=0; y<image4.height(); ++y)
  374. for(int x=0; x<image4.width(); ++x)
  375. image4.setPixelQuick(x,y,1*(x+1+y*5),3*(x+1+y*5),6*(x+1+y*5));
  376. image4.mirror(ippAxsHorizontal);
  377. CPPUNIT_ASSERT_EQUAL( 21, static_cast<int>(image4.getPixelQuick(0,0,0)));
  378. CPPUNIT_ASSERT_EQUAL( 16, static_cast<int>(image4.getPixelQuick(0,1,0)));
  379. CPPUNIT_ASSERT_EQUAL( 11, static_cast<int>(image4.getPixelQuick(0,2,0)));
  380. CPPUNIT_ASSERT_EQUAL( 6, static_cast<int>(image4.getPixelQuick(0,3,0)));
  381. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(image4.getPixelQuick(0,4,0)));
  382. CPPUNIT_ASSERT_EQUAL( 22, static_cast<int>(image4.getPixelQuick(1,0,0)));
  383. CPPUNIT_ASSERT_EQUAL( 17, static_cast<int>(image4.getPixelQuick(1,1,0)));
  384. CPPUNIT_ASSERT_EQUAL( 12, static_cast<int>(image4.getPixelQuick(1,2,0)));
  385. CPPUNIT_ASSERT_EQUAL( 7, static_cast<int>(image4.getPixelQuick(1,3,0)));
  386. CPPUNIT_ASSERT_EQUAL( 2, static_cast<int>(image4.getPixelQuick(1,4,0)));
  387. image4.mirror(ippAxsHorizontal);
  388. image4.mirror(ippAxsVertical);
  389. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(image4.getPixelQuick(0,0,0)));
  390. CPPUNIT_ASSERT_EQUAL( 10, static_cast<int>(image4.getPixelQuick(0,1,0)));
  391. CPPUNIT_ASSERT_EQUAL( 15, static_cast<int>(image4.getPixelQuick(0,2,0)));
  392. CPPUNIT_ASSERT_EQUAL( 20, static_cast<int>(image4.getPixelQuick(0,3,0)));
  393. CPPUNIT_ASSERT_EQUAL( 25, static_cast<int>(image4.getPixelQuick(0,4,0)));
  394. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(image4.getPixelQuick(1,0,0)));
  395. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(image4.getPixelQuick(1,1,0)));
  396. CPPUNIT_ASSERT_EQUAL( 14, static_cast<int>(image4.getPixelQuick(1,2,0)));
  397. CPPUNIT_ASSERT_EQUAL( 19, static_cast<int>(image4.getPixelQuick(1,3,0)));
  398. CPPUNIT_ASSERT_EQUAL( 24, static_cast<int>(image4.getPixelQuick(1,4,0)));
  399. image4.mirror(ippAxsVertical);
  400. image4.mirror(ippAxsBoth);
  401. CPPUNIT_ASSERT_EQUAL( 25, static_cast<int>(image4.getPixelQuick(0,0,0)));
  402. CPPUNIT_ASSERT_EQUAL( 19, static_cast<int>(image4.getPixelQuick(1,1,0)));
  403. CPPUNIT_ASSERT_EQUAL( 13, static_cast<int>(image4.getPixelQuick(2,2,0)));
  404. CPPUNIT_ASSERT_EQUAL( 7, static_cast<int>(image4.getPixelQuick(3,3,0)));
  405. CPPUNIT_ASSERT_EQUAL( 1, static_cast<int>(image4.getPixelQuick(4,4,0)));
  406. CPPUNIT_ASSERT_EQUAL( 21, static_cast<int>(image4.getPixelQuick(4,0,0)));
  407. CPPUNIT_ASSERT_EQUAL( 17, static_cast<int>(image4.getPixelQuick(3,1,0)));
  408. CPPUNIT_ASSERT_EQUAL( 13, static_cast<int>(image4.getPixelQuick(2,2,0)));
  409. CPPUNIT_ASSERT_EQUAL( 9, static_cast<int>(image4.getPixelQuick(1,3,0)));
  410. CPPUNIT_ASSERT_EQUAL( 5, static_cast<int>(image4.getPixelQuick(0,4,0)));
  411. image4.mirror(ippAxsBoth);
  412. // transpose
  413. image4.transpose();
  414. for(int y=0; y<image4.height(); ++y)
  415. for(int x=0; x<image4.width(); ++x)
  416. {
  417. CPPUNIT_ASSERT_EQUAL( 1*(y+1+x*5), static_cast<int>(image4.getPixelQuick(x,y,0)));
  418. CPPUNIT_ASSERT_EQUAL( 3*(y+1+x*5), static_cast<int>(image4.getPixelQuick(x,y,1)));
  419. CPPUNIT_ASSERT_EQUAL( 6*(y+1+x*5), static_cast<int>(image4.getPixelQuick(x,y,2)));
  420. }
  421. // copyRect
  422. image4 = ColorImage(10,10);
  423. for(int y=0; y<image4.width(); ++y)
  424. for(int x=0; x<image4.width(); ++x)
  425. image4.setPixelQuick(x,y,x+1+y*image4.width(),(x+1+y*image4.width())/2,(x+1+y*image4.width())/3);
  426. ColorImage* imgRect = image4.copyRect(Rect(2,3,4,3));
  427. CPPUNIT_ASSERT_EQUAL(4, static_cast<int>(imgRect->width()));
  428. CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(imgRect->height()));
  429. for(int y=0; y<imgRect->height(); ++y)
  430. for(int x=0; x<imgRect->width(); ++x)
  431. {
  432. CPPUNIT_ASSERT_EQUAL(((x+3)+(y+3)*image4.width())/1, static_cast<int>(imgRect->getPixelQuick(x,y,0)));
  433. CPPUNIT_ASSERT_EQUAL(((x+3)+(y+3)*image4.width())/2, static_cast<int>(imgRect->getPixelQuick(x,y,1)));
  434. CPPUNIT_ASSERT_EQUAL(((x+3)+(y+3)*image4.width())/3, static_cast<int>(imgRect->getPixelQuick(x,y,2)));
  435. }
  436. imgRect = image4.copyRect(Rect(7,6,10,10));
  437. CPPUNIT_ASSERT_EQUAL( 3, static_cast<int>(imgRect->width()));
  438. CPPUNIT_ASSERT_EQUAL( 4, static_cast<int>(imgRect->height()));
  439. CPPUNIT_ASSERT_EQUAL( 68/1, static_cast<int>(imgRect->getPixelQuick(0,0,0)));
  440. CPPUNIT_ASSERT_EQUAL( 68/2, static_cast<int>(imgRect->getPixelQuick(0,0,1)));
  441. CPPUNIT_ASSERT_EQUAL( 68/3, static_cast<int>(imgRect->getPixelQuick(0,0,2)));
  442. CPPUNIT_ASSERT_EQUAL( 69/1, static_cast<int>(imgRect->getPixelQuick(1,0,0)));
  443. CPPUNIT_ASSERT_EQUAL( 69/2, static_cast<int>(imgRect->getPixelQuick(1,0,1)));
  444. CPPUNIT_ASSERT_EQUAL( 69/3, static_cast<int>(imgRect->getPixelQuick(1,0,2)));
  445. CPPUNIT_ASSERT_EQUAL( 70/1, static_cast<int>(imgRect->getPixelQuick(2,0,0)));
  446. CPPUNIT_ASSERT_EQUAL( 70/2, static_cast<int>(imgRect->getPixelQuick(2,0,1)));
  447. CPPUNIT_ASSERT_EQUAL( 70/3, static_cast<int>(imgRect->getPixelQuick(2,0,2)));
  448. CPPUNIT_ASSERT_EQUAL( 98/1, static_cast<int>(imgRect->getPixelQuick(0,3,0)));
  449. CPPUNIT_ASSERT_EQUAL( 98/2, static_cast<int>(imgRect->getPixelQuick(0,3,1)));
  450. CPPUNIT_ASSERT_EQUAL( 98/3, static_cast<int>(imgRect->getPixelQuick(0,3,2)));
  451. CPPUNIT_ASSERT_EQUAL( 99/1, static_cast<int>(imgRect->getPixelQuick(1,3,0)));
  452. CPPUNIT_ASSERT_EQUAL( 99/2, static_cast<int>(imgRect->getPixelQuick(1,3,1)));
  453. CPPUNIT_ASSERT_EQUAL( 99/3, static_cast<int>(imgRect->getPixelQuick(1,3,2)));
  454. CPPUNIT_ASSERT_EQUAL(100/1, static_cast<int>(imgRect->getPixelQuick(2,3,0)));
  455. CPPUNIT_ASSERT_EQUAL(100/2, static_cast<int>(imgRect->getPixelQuick(2,3,1)));
  456. CPPUNIT_ASSERT_EQUAL(100/3, static_cast<int>(imgRect->getPixelQuick(2,3,2)));
  457. }
  458. void ImageTest::testImageTools()
  459. {
  460. Image image(2,3);
  461. image.setPixel(0,0, 50);
  462. image.setPixel(1,0, 66);
  463. image.setPixel(0,1,100);
  464. image.setPixel(1,1,111);
  465. image.setPixel(0,2,200);
  466. image.setPixel(1,2,211);
  467. // min, max, minmax
  468. CPPUNIT_ASSERT_EQUAL(50 , static_cast<int>(image.min()));
  469. CPPUNIT_ASSERT_EQUAL(211, static_cast<int>(image.max()));
  470. Ipp8u min = 0;
  471. Ipp8u max = 0;
  472. image.minmax(min,max);
  473. CPPUNIT_ASSERT_EQUAL(50 , static_cast<int>(min));
  474. CPPUNIT_ASSERT_EQUAL(211, static_cast<int>(max));
  475. // minIndex, maxIndex, minmaxIndex
  476. Coord IMin = image.minIndex();
  477. Coord IMax = image.maxIndex();
  478. CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(IMin.x));
  479. CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(IMin.y));
  480. CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(IMax.x));
  481. CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(IMax.y));
  482. image.minmaxIndex(IMin,IMax);
  483. CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(IMin.x));
  484. CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(IMin.y));
  485. CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(IMax.x));
  486. CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(IMax.y));
  487. // sum,mean,meanStdDev
  488. CPPUNIT_ASSERT_EQUAL(738, static_cast<int>(image.sum()));
  489. CPPUNIT_ASSERT_EQUAL(123, static_cast<int>(image.mean()));
  490. double mean, stddev;
  491. image.meanStdDev(mean, stddev);
  492. CPPUNIT_ASSERT_EQUAL(123, static_cast<int>(mean));
  493. CPPUNIT_ASSERT_DOUBLES_EQUAL(61.811542, stddev, 0.01);
  494. // transpose
  495. image = Image(3,4);
  496. CPPUNIT_ASSERT_THROW(image.transpose(), ImageException);
  497. for(int s=1; s<=8; ++s)
  498. {
  499. image = Image(s,s);
  500. for(int j=0; j<image.height(); ++j)
  501. for(int i=0; i<image.width(); ++i)
  502. image.setPixel(i,j, (i+1)+j*(image.width()));
  503. image.transpose();
  504. for(int j=0; j<image.height(); ++j)
  505. for(int i=0; i<image.width(); ++i)
  506. CPPUNIT_ASSERT_EQUAL(static_cast<int>((j+1)+i*(image.width())), static_cast<int>(image.getPixel(i,j)));
  507. }
  508. // abs
  509. GrayImage16s* img16s = new GrayImage16s(2,3);
  510. img16s->setPixel(0,0, -50);
  511. img16s->setPixel(1,0, 33);
  512. img16s->setPixel(0,1, 0);
  513. img16s->setPixel(1,1, -0);
  514. img16s->setPixel(0,2, 255);
  515. img16s->setPixel(1,2,-255);
  516. img16s->abs();
  517. CPPUNIT_ASSERT_EQUAL( 50, static_cast<int>(img16s->getPixel(0,0)));
  518. CPPUNIT_ASSERT_EQUAL( 33, static_cast<int>(img16s->getPixel(1,0)));
  519. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(img16s->getPixel(0,1)));
  520. CPPUNIT_ASSERT_EQUAL( 0, static_cast<int>(img16s->getPixel(1,1)));
  521. CPPUNIT_ASSERT_EQUAL(255, static_cast<int>(img16s->getPixel(0,2)));
  522. CPPUNIT_ASSERT_EQUAL(255, static_cast<int>(img16s->getPixel(1,2)));
  523. }
  524. void ImageTest::testGrayImageBilinear()
  525. {
  526. Image image(4,3);
  527. for (int y = 0; y < image.height(); y++) {
  528. for (int x = 0; x < image.width(); x++) {
  529. image.setPixel(x, y, y * image.width() + x);
  530. }
  531. }
  532. for (int y = 0; y < image.height(); y++) {
  533. for (int x = 0; x < image.width(); x++) {
  534. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(double(y * image.width() + x),
  535. image.getPixelBilinear(x, y), 1E-20);
  536. }
  537. }
  538. for (int y = 0; y < image.height()-1; y++) {
  539. for (int x = 0; x < image.width()-1; x++) {
  540. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(
  541. double(y * image.width() + x) + 0.5,
  542. image.getPixelBilinear(float(x)+0.5, y), 1E-20);
  543. CPPUNIT_ASSERT_DOUBLES_EQUAL_NOT_NAN(
  544. double(y * image.width() + x) + double(image.width()) / 2.0,
  545. image.getPixelBilinear(x, float(y) + 0.5), 1E-20);
  546. }
  547. }
  548. }