00001 #include "Image/Image.H"
00002 #include "Image/ImageSet.H"
00003 #include "Image/PyramidOps.H"
00004 #include "Image/LowPass.H"
00005 #include "Image/Pixels.H"
00006 #include "Image/ColorOps.H"
00007 #include "Image/MathOps.H"
00008 #include "Image/FilterOps.H"
00009 #include "Image/Kernels.H"
00010 #include "Image/ShapeOps.H"
00011 #include "Image/DrawOps.H"
00012 #include "Image/Transforms.H"
00013 #include "Image/Convolutions.H"
00014 #include "Image/fancynorm.H"
00015 #include "Image/CutPaste.H"
00016 #include "Image/PyrBuilder.H"
00017 #include "Raster/Raster.H"
00018 #include "Raster/PngWriter.H"
00019 #include "CUDA/CudaImage.H"
00020
00021 #include "wrap_c_cuda.h"
00022 #include "CUDA/cutil.h"
00023 #include "CUDA/CudaColorOps.H"
00024 #include "CUDA/CudaLowPass.H"
00025 #include "CUDA/CudaDevices.H"
00026 #include "CUDA/CudaImageSet.H"
00027 #include "CUDA/CudaImageSetOps.H"
00028 #include "CUDA/CudaPyramidOps.H"
00029 #include "CUDA/CudaMathOps.H"
00030 #include "CUDA/CudaFilterOps.H"
00031 #include "CUDA/CudaKernels.H"
00032 #include "CUDA/CudaShapeOps.H"
00033 #include "CUDA/CudaDrawOps.H"
00034 #include "CUDA/CudaRandom.H"
00035 #include "CUDA/CudaTransforms.H"
00036 #include "CUDA/CudaConvolutions.H"
00037 #include "CUDA/CudaNorm.H"
00038 #include "CUDA/CudaHmaxFL.H"
00039 #include "CUDA/CudaCutPaste.H"
00040 #include "CUDA/CudaPyrBuilder.H"
00041 #include "Util/fpu.H"
00042 #include "Util/Timer.H"
00043 #include <cmath>
00044
00045
00046 #define ROUNDOFF_MARGIN 0.000115//0.00005
00047
00048 #define HIGHER_ROUNDOFF_MARGIN 0.0025
00049
00050 #define BIAS_MARGIN 0.000195//0.000001
00051
00052
00053 void compareregions(const Image<float> &c, const Image<float> &g, const uint rowStart, const uint rowStop, const uint colStart, const uint colStop)
00054 {
00055 uint w,h;
00056 w = c.getWidth();
00057 h = c.getHeight();
00058 if(w != (uint) g.getWidth() || h != (uint) g.getHeight())
00059 {
00060 LINFO("Images are not the same size");
00061 return;
00062 }
00063 if(rowStart > rowStop || colStart > colStop || rowStop > h || colStop > w)
00064 {
00065 LINFO("Invalid regions to compare");
00066 return;
00067 }
00068 for(uint j=rowStart;j<rowStop;j++)
00069 {
00070 printf("\nC[%d]: ",j);
00071 for(uint i=colStart;i<colStop;i++)
00072 {
00073 printf("%.3f ",c.getVal(i,j));
00074 }
00075 printf("\nG[%d]: ",j);
00076 for(uint i=colStart;i<colStop;i++)
00077 {
00078 printf("%.3f ",g.getVal(i,j));
00079 }
00080 }
00081 printf("\n");
00082
00083 }
00084
00085 void calculateCudaSaliency(const CudaImage<PixRGB<float> > &input, const int cudaDeviceNum)
00086 {
00087
00088 CudaImage<PixRGB<float> > cudainput = CudaImage<PixRGB<float> >(input,GLOBAL_DEVICE_MEMORY,cudaDeviceNum);
00089 CudaImage<float> red, green, blue;
00090
00091 cudaGetComponents(cudainput,red,green,blue);
00092
00093 CudaImage<float> lumin = cudaLuminance(cudainput);
00094 }
00095
00096
00097 void printImage(const Image<float> &in)
00098 {
00099 int cnt=0;
00100 printf("******* IMAGE *********\n");
00101 for(int i=0;i<in.getWidth();i++)
00102 {
00103 for(int j=0;j<in.getHeight();j++)
00104 {
00105 printf("%g ",in.getVal(i,j));
00106 cnt++;
00107 if(cnt==30)
00108 {
00109 printf("\n");
00110 cnt=0;
00111 }
00112 }
00113 }
00114 printf("\n");
00115 }
00116
00117 void writeImage(const Image<float> &in)
00118 {
00119 PngWriter::writeGray(in,std::string("tmp.png"));
00120 }
00121
00122 void printImages(const Image<float> &in1, const Image<float> &in2)
00123 {
00124 int w,h;
00125 w = in1.getWidth(); h = in2.getHeight();
00126 if(in2.getWidth() != w || in2.getHeight() != h)
00127 LFATAL("Cannot compare two different image sizes im1[%dx%d] im2[%dx%d]",
00128 in1.getWidth(),in1.getHeight(),in2.getWidth(),in2.getHeight());
00129 for(int i=0;i<in1.getWidth();i++)
00130 {
00131 for(int j=0;j<in1.getHeight();j++)
00132 {
00133 printf("At [%d,%d] Im1 = %f Im2 = %f\n",i,j,in1.getVal(i,j),in2.getVal(i,j));
00134 }
00135 }
00136 }
00137
00138 void testDiff(const float in1, const float in2, float rounderr=ROUNDOFF_MARGIN)
00139 {
00140 float diff = in1-in2;
00141 bool acceptable = fabs(diff) < rounderr;
00142 LINFO("%s: %ux%u floats, #1 - #2: diff = [%f]",
00143 in1 == in2 ? "MATCH" : (acceptable ? "ACCEPT" : "FAIL"), 1, 1, diff);
00144 }
00145
00146 void testDiff(const Image<float> in1, const Image<float> in2, float rounderr=ROUNDOFF_MARGIN)
00147 {
00148 Image<float> diff = in1-in2;
00149 Point2D<int> p;
00150 float mi, ma, av;
00151 int w,h;
00152 w = in1.getWidth(); h = in2.getHeight();
00153 if(in2.getWidth() != w || in2.getHeight() != h)
00154 LFATAL("Cannot compare two different image sizes im1[%dx%d] im2[%dx%d]",
00155 in1.getWidth(),in1.getHeight(),in2.getWidth(),in2.getHeight());
00156 getMinMaxAvg(diff,mi,ma,av);
00157 bool acceptable = mi> -rounderr && ma< rounderr && std::abs(av) < BIAS_MARGIN;
00158 LINFO("%s: %ux%u image, #1 - #2: avg=%f, diff = [%f .. %f]",
00159 mi == ma && ma == 0.0F ? "MATCH" : (acceptable ? "ACCEPT" : "FAIL"), w, h, av, mi, ma);
00160 if(!acceptable)
00161 {
00162 if(fabs(ma) > fabs(mi))
00163 {
00164 findMax(diff,p,ma);
00165 LINFO("Maximum difference %f is located at %dx%d",ma,p.i,p.j);
00166 }
00167 else
00168 {
00169 findMin(diff,p,mi);
00170 LINFO("Minimum difference %f is located at %dx%d",mi,p.i,p.j);
00171 }
00172 getMinMaxAvg(in1,mi,ma,av);
00173 LINFO("Image 1 [%dx%d]: avg=%f, diff = [%f .. %f]",
00174 w, h, av, mi, ma);
00175 getMinMaxAvg(in2,mi,ma,av);
00176 LINFO("Image 2 [%dx%d]: avg=%f, diff = [%f .. %f]",
00177 w, h, av, mi, ma);
00178 compareregions(in1,in2,std::max(0,p.j-5),std::min(h,p.j+5),std::max(0,p.i-5),std::min(w,p.i+5));
00179 writeImage(diff);
00180 }
00181
00182
00183 }
00184
00185 void cmpNoise(const Image<float> in1, const Image<float> in2)
00186 {
00187 Image<float> diff = in1-in2;
00188 float mi, ma, av;
00189 int w,h;
00190 w = in1.getWidth(); h = in2.getHeight();
00191
00192 if(in2.getWidth() != w || in2.getHeight() != h)
00193 LFATAL("Cannot compare two different image sizes im1[%dx%d] im2[%dx%d]",
00194 in1.getWidth(),in1.getHeight(),in2.getWidth(),in2.getHeight());
00195 getMinMaxAvg(diff,mi,ma,av);
00196 LINFO("NOISE CHECK: %ux%u image, #1 - #2: avg=%f, diff = [%f .. %f]", w, h, av, mi, ma);
00197
00198 }
00199
00200 void test_minmaxavgnorm(Image<float> im, MemoryPolicy mp, int dev)
00201 {
00202 float mi,ma,av;
00203 Timer tim;
00204 printf("Testing global min/max/avg\n");
00205 tim.reset();
00206 getMinMaxAvg(im,mi,ma,av);
00207 LINFO("CPU done! %fms", tim.getSecs() * 1000.0F);
00208 CudaImage<float> cmin, cmax,cavg,cbuf;
00209 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00210 cbuf = CudaImage<float>(im.getWidth()/2,im.getHeight()/2,NO_INIT,mp,dev);
00211 cmin = CudaImage<float>(1,1,NO_INIT,mp,dev);
00212 cmax = CudaImage<float>(1,1,NO_INIT,mp,dev);
00213 cavg = CudaImage<float>(1,1,NO_INIT,mp,dev);
00214
00215
00216 tim.reset();
00217 cudaGetMinMaxAvg(cim,cmin,cmax,cavg,&cbuf);
00218 LINFO("GPU done! %fms", tim.getSecs() * 1000.0F);
00219 Image<float> hmin = cmin.exportToImage();
00220 Image<float> hmax = cmax.exportToImage();
00221 Image<float> havg = cavg.exportToImage();
00222 printf("image min %f max %f avg %f, cuda min %f max %f avg %f\n",mi,ma,av,
00223 hmin.getVal(0),hmax.getVal(0),havg.getVal(0));
00224
00225 inplaceNormalize(im,0.0F,10.0F);
00226 cudaInplaceNormalize(cim,0.0F,10.0F);
00227 Image<float> hnorm = cim.exportToImage();
00228 printf("Testing inplace normalization\n");
00229 testDiff(im,hnorm);
00230
00231
00232
00233
00234 }
00235
00236 void test_find(Image<float> im, MemoryPolicy mp, int dev)
00237 {
00238 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00239 Point2D<int> p1,p2;
00240 float ftmp,ftmp2;
00241 findMin(im,p1,ftmp);
00242 cudaFindMin(cim,p2,ftmp2);
00243 printf("Testing Find of Minimum Location on Image = %s [CPU idx:%s,val:%f GPU idx:%s,val:%f]\n",(p1==p2) ? "ACCEPT" : "FAIL",convertToString(p1).c_str(),ftmp,convertToString(p2).c_str(),ftmp2);
00244 findMax(im,p1,ftmp);
00245 cudaFindMax(cim,p2,ftmp2);
00246 printf("Testing Find of Maximum Location on Image = %s [CPU idx:%s,val:%f GPU idx:%s,val:%f]\n",(p1==p2) ? "ACCEPT" : "FAIL",convertToString(p1).c_str(),ftmp,convertToString(p2).c_str(),ftmp2);
00247
00248 }
00249
00250 void test_math(Image<float> im, MemoryPolicy mp, int dev)
00251 {
00252 float val = 1.2345F;
00253 Image<float> scalaradd = im + val;
00254 Image<float> scalarsub = im - val;
00255 Image<float> scalarmul = im * val;
00256 Image<float> scalardiv = im / val;
00257 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00258
00259 CudaImage<float> cval = CudaImage<float>(1,1,NO_INIT,mp,dev);
00260 cudaClear(cval,val);
00261
00262 Image<float> test = Image<float>(im.getDims(),NO_INIT);
00263 test.clear(val);
00264 CudaImage<float> ctest = CudaImage<float>(test,mp,dev);
00265 Image<float> imageadd = im + test;
00266 Image<float> imagesub = im - test;
00267 Image<float> imagemul = im * test;
00268 Image<float> imagediv = im / test;
00269
00270 CudaImage<float> cscalaradd = cim + cval;
00271 CudaImage<float> cscalarsub = cim - cval;
00272 CudaImage<float> cscalarmul = cim * cval;
00273 CudaImage<float> cscalardiv = cim / cval;
00274 Image<float> hscalaradd = cscalaradd.exportToImage();
00275 Image<float> hscalarsub = cscalarsub.exportToImage();
00276 Image<float> hscalarmul = cscalarmul.exportToImage();
00277 Image<float> hscalardiv = cscalardiv.exportToImage();
00278 printf("Testing add/subtract/multiply/divide device scalars\n");
00279 testDiff(scalaradd,hscalaradd);
00280 testDiff(scalarsub,hscalarsub);
00281 testDiff(scalarmul,hscalarmul);
00282 testDiff(scalardiv,hscalardiv);
00283 cscalaradd = cscalarsub = cscalarmul = cscalardiv = cim;
00284 cscalaradd += cval;
00285 cscalarsub -= cval;
00286 cscalarmul *= cval;
00287 cscalardiv /= cval;
00288 hscalaradd = cscalaradd.exportToImage();
00289 hscalarsub = cscalarsub.exportToImage();
00290 hscalarmul = cscalarmul.exportToImage();
00291 hscalardiv = cscalardiv.exportToImage();
00292 printf("Testing inplace add/subtract/multiply/divide device scalars\n");
00293 testDiff(scalaradd,hscalaradd);
00294 testDiff(scalarsub,hscalarsub);
00295 testDiff(scalarmul,hscalarmul);
00296 testDiff(scalardiv,hscalardiv);
00297
00298 cscalaradd = cim + val;
00299 cscalarsub = cim - val;
00300 cscalarmul = cim * val;
00301 cscalardiv = cim / val;
00302 hscalaradd = cscalaradd.exportToImage();
00303 hscalarsub = cscalarsub.exportToImage();
00304 hscalarmul = cscalarmul.exportToImage();
00305 hscalardiv = cscalardiv.exportToImage();
00306 printf("Testing add/subtract/multiply/divide host scalars\n");
00307 testDiff(scalaradd,hscalaradd);
00308 testDiff(scalarsub,hscalarsub);
00309 testDiff(scalarmul,hscalarmul);
00310 testDiff(scalardiv,hscalardiv);
00311 cscalaradd = cscalarsub = cscalarmul = cscalardiv = cim;
00312 cscalaradd += val;
00313 cscalarsub -= val;
00314 cscalarmul *= val;
00315 cscalardiv /= val;
00316 hscalaradd = cscalaradd.exportToImage();
00317 hscalarsub = cscalarsub.exportToImage();
00318 hscalarmul = cscalarmul.exportToImage();
00319 hscalardiv = cscalardiv.exportToImage();
00320 printf("Testing inplace add/subtract/multiply/divide host scalars\n");
00321 testDiff(scalaradd,hscalaradd);
00322 testDiff(scalarsub,hscalarsub);
00323 testDiff(scalarmul,hscalarmul);
00324 testDiff(scalardiv,hscalardiv);
00325
00326 CudaImage<float> cimageadd = cim;
00327 CudaImage<float> cimagesub = cim;
00328 CudaImage<float> cimagemul = cim;
00329 CudaImage<float> cimagediv = cim;
00330 cimageadd += ctest;
00331 cimagesub -= ctest;
00332 cimagemul *= ctest;
00333 cimagediv /= ctest;
00334 Image<float> himageadd = cimageadd.exportToImage();
00335 Image<float> himagesub = cimagesub.exportToImage();
00336 Image<float> himagemul = cimagemul.exportToImage();
00337 Image<float> himagediv = cimagediv.exportToImage();
00338 printf("Testing inplace add/subtract/multiply/divide images\n");
00339 testDiff(imageadd,himageadd);
00340 testDiff(imagesub,himagesub);
00341 testDiff(imagemul,himagemul);
00342 testDiff(imagediv,himagediv);
00343
00344 cimageadd = cim + ctest;
00345 cimagesub = cim - ctest;
00346 cimagemul = cim * ctest;
00347 cimagediv = cim / ctest;
00348 himageadd = cimageadd.exportToImage();
00349 himagesub = cimagesub.exportToImage();
00350 himagemul = cimagemul.exportToImage();
00351 himagediv = cimagediv.exportToImage();
00352 printf("Testing add/subtract/multiply/divide images\n");
00353 testDiff(imageadd,himageadd);
00354 testDiff(imagesub,himagesub);
00355 testDiff(imagemul,himagemul);
00356 testDiff(imagediv,himagediv);
00357 }
00358
00359 void comparePyramids(ImageSet<float> pyr, CudaImageSet<float> cpyr, float rnd_err=ROUNDOFF_MARGIN)
00360 {
00361 if(pyr.size() != cpyr.size())
00362 {
00363 LFATAL("Testing unequal pyramids\n");
00364 }
00365 for(uint i=0;i<pyr.size();i++)
00366 {
00367 Image<float> ctmp= cpyr[i].exportToImage();
00368 testDiff(ctmp,pyr[i],rnd_err);
00369 }
00370
00371 }
00372
00373 void test_pyramids(Image<float> im, MemoryPolicy mp, int dev)
00374 {
00375 const float rndErrMargin = HIGHER_ROUNDOFF_MARGIN;
00376
00377 const float trigErrMargin = 3*HIGHER_ROUNDOFF_MARGIN;
00378 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00379 printf("Testing 9 tap Gaussian pyramids\n");
00380 CudaImageSet<float> cgs = cudaBuildPyrGaussian(cim,0,9,9);
00381 ImageSet<float> gs = buildPyrGaussian(im,0,9,9);
00382 comparePyramids(gs,cgs);
00383
00384 printf("Testing 5 tap Gaussian pyramids\n");
00385 cgs = cudaBuildPyrGaussian(cim,0,9,5);
00386 gs = buildPyrGaussian(im,0,9,5);
00387 comparePyramids(gs,cgs);
00388
00389 printf("Testing 3 tap Gaussian pyramids\n");
00390 cgs = cudaBuildPyrGaussian(cim,0,9,3);
00391 gs = buildPyrGaussian(im,0,9,3);
00392 comparePyramids(gs,cgs);
00393
00394 printf("Testing 9 tap Laplacian pyramids\n");
00395 CudaImageSet<float> cls = cudaBuildPyrLaplacian(cim,0,9,9);
00396 ImageSet<float> ls = buildPyrLaplacian(im,0,9,9);
00397 comparePyramids(ls,cls);
00398
00399 printf("Testing 5 tap Laplacian pyramids\n");
00400 cls = cudaBuildPyrLaplacian(cim,0,9,5);
00401 ls = buildPyrLaplacian(im,0,9,5);
00402 comparePyramids(ls,cls);
00403
00404 printf("Testing 3 tap Laplacian pyramids\n");
00405 cls = cudaBuildPyrLaplacian(cim,0,9,3);
00406 ls = buildPyrLaplacian(im,0,9,3);
00407 comparePyramids(ls,cls);
00408
00409 printf("Testing Attenuated borders\n");
00410 CudaImage<float> ciat = cim;
00411 Image<float>iat = im;
00412 inplaceAttenuateBorders(iat,5);
00413 cudaInplaceAttenuateBorders(ciat,5);
00414 Image<float> hiat = ciat.exportToImage();
00415 testDiff(hiat,iat);
00416 printf("Testing Oriented Filter: RAISING ROUNDOFF ERROR TO %f\n",trigErrMargin);
00417 iat = orientedFilter(im,2.6F,0.0F,10.0F);
00418 ciat = cudaOrientedFilter(cim,2.6F,0.0F,10.0F);
00419 hiat = ciat.exportToImage();
00420 testDiff(hiat,iat,trigErrMargin);
00421 printf("Testing an Oriented Pyramid from a 9 tap Laplacian Pyramid: RAISING ROUNDOFF ERROR TO %f\n",trigErrMargin);
00422 ls = buildPyrLaplacian(im,0,9,9);
00423 cls = cudaBuildPyrLaplacian(cim,0,9,9);
00424 ImageSet<float> os = buildPyrOrientedFromLaplacian(ls,9,0);
00425 CudaImageSet<float> c_os = cudaBuildPyrOrientedFromLaplacian(cls,9,0);
00426 comparePyramids(os,c_os,trigErrMargin);
00427
00428 printf("Testing an Oriented Pyramid from scratch: RAISING ROUNDOFF ERROR TO %f\n",trigErrMargin);
00429 os = buildPyrOriented(im,0,9,9,0);
00430 c_os = cudaBuildPyrOriented(cim,0,9,9,0);
00431 comparePyramids(os,c_os,trigErrMargin);
00432
00433 printf("Testing a Quick Local Average Pyramid ONLY CALCULATES LAST IMAGE OF PYRAMID!!!!: RAISING ROUNDOFF ERROR TO %f\n",rndErrMargin);
00434 int depth = 7;
00435 os = buildPyrLocalAvg(im,depth);
00436 c_os = cudaBuildPyrLocalAvg(cim,depth);
00437 Image<float> h_os = c_os[depth-1].exportToImage();
00438 testDiff(os[depth-1],h_os,rndErrMargin);
00439
00440 printf("Testing a Quick Local Average Pyramid ONLY CALCULATES LAST IMAGE OF PYRAMID!!!!: RAISING ROUNDOFF ERROR TO %f\n",rndErrMargin);
00441 depth = 7;
00442 os = buildPyrLocalMax(im,depth);
00443 c_os = cudaBuildPyrLocalMax(cim,depth);
00444 h_os = c_os[depth-1].exportToImage();
00445 testDiff(os[depth-1],h_os,rndErrMargin);
00446
00447 printf("Testing Reichardt Pyramid: RAISING ROUNDOFF ERROR TO %f\n",trigErrMargin);
00448 float dx=12.5,dy=7.5;
00449 ReichardtPyrBuilder<float> reich = ReichardtPyrBuilder<float>(dx,dy,Gaussian5);
00450 os = reich.build(im,0,9);
00451 CudaReichardtPyrBuilder<float> creich = CudaReichardtPyrBuilder<float>(dx,dy,Gaussian5);
00452 c_os = creich.build(cim,0,9);
00453 comparePyramids(os,c_os,trigErrMargin);
00454 }
00455
00456 void test_centerSurround(Image<float> im, MemoryPolicy mp, int dev)
00457 {
00458 ImageSet<float> ims = buildPyrLaplacian(im,0,9,9);
00459 printf("Testing ImageSet conversion to CudaImageSet\n");
00460 CudaImageSet<float> cims = CudaImageSet<float>(ims,mp,dev);
00461 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00462 comparePyramids(ims,cims,HIGHER_ROUNDOFF_MARGIN);
00463
00464 printf("Testing Center Surround Absolute\n");
00465 Image<float> cmap(ims[3].getDims(),ZEROS);
00466 for (int delta = 3; delta <= 4; delta ++)
00467 {
00468 for (int lev = 0; lev <= 2; lev ++)
00469 {
00470 Image<float> tmp = centerSurround(ims, lev, lev + delta, true);
00471 CudaImage<float> ctmp = cudaCenterSurround(cims, lev, lev + delta, true);
00472 Image<float> htmp = ctmp.exportToImage();
00473 testDiff(tmp,htmp);
00474 }
00475 }
00476 printf("Testing Center Surround Clamped\n");
00477 cmap.clear(0);
00478 for (int delta = 3; delta <= 4; delta ++)
00479 {
00480 for (int lev = 0; lev <= 2; lev ++)
00481 {
00482 Image<float> tmp = centerSurround(ims, lev, lev + delta, false);
00483 CudaImage<float> ctmp = cudaCenterSurround(cims, lev, lev + delta, false);
00484 Image<float> htmp = ctmp.exportToImage();
00485 testDiff(tmp,htmp);
00486 }
00487 }
00488 printf("Testing Center Surround Directional\n");
00489 for (int delta = 3; delta <= 4; delta ++)
00490 {
00491 for (int lev = 0; lev <= 2; lev ++)
00492 {
00493 Image<float> tmppos, tmpneg;
00494 CudaImage<float> ctmppos,ctmpneg;
00495 centerSurround(ims, lev, lev + delta, tmppos, tmpneg);
00496 cudaCenterSurround(cims, lev, lev + delta, ctmppos, ctmpneg);
00497 Image<float> htmppos = ctmppos.exportToImage();
00498 Image<float> htmpneg = ctmpneg.exportToImage();
00499 testDiff(tmppos,htmppos);
00500 testDiff(tmpneg,htmpneg);
00501 }
00502 }
00503 printf("Testing Downsize\n");
00504 Image<float> dsz = downSize(im,im.getWidth()/3,im.getHeight()/3,5);
00505 CudaImage<float> cdsz = cudaDownSize(cim,cim.getWidth()/3,cim.getHeight()/3,5);
00506 Image<float> hdsz = cdsz.exportToImage();
00507 testDiff(dsz,hdsz);
00508
00509 printf("Testing Downsize clean with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00510 dsz = downSizeClean(im,Dims(im.getWidth()/3,im.getHeight()/3),5);
00511 cdsz = cudaDownSizeClean(cim,Dims(cim.getWidth()/3,cim.getHeight()/3),5);
00512 hdsz = cdsz.exportToImage();
00513 testDiff(dsz,hdsz,HIGHER_ROUNDOFF_MARGIN);
00514
00515 printf("Testing Bilinear Rescale with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00516 dsz = rescaleBilinear(im,im.getWidth()/3,im.getHeight()/3);
00517 cdsz = cudaRescaleBilinear(cim,cim.getWidth()/3,cim.getHeight()/3);
00518 hdsz = cdsz.exportToImage();
00519 testDiff(dsz,hdsz,HIGHER_ROUNDOFF_MARGIN);
00520
00521 printf("Testing RGB Bilinear Rescale with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00522 Image<PixRGB<float> > imc = toRGB(im);
00523 CudaImage<PixRGB<float> > cimc = CudaImage<PixRGB<float> >(imc,mp,dev);
00524 imc = rescaleBilinear(imc,imc.getWidth()/3,imc.getHeight()/3);
00525 cimc = cudaRescaleBilinear(cimc,cimc.getWidth()/3,cimc.getHeight()/3);
00526 Image<PixRGB<float> > himc = cimc.exportToImage();
00527 testDiff(luminance(imc),luminance(himc),HIGHER_ROUNDOFF_MARGIN);
00528 }
00529
00530 void test_localOperators(Image<float> im, MemoryPolicy mp, int dev)
00531 {
00532 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00533 printf("Test Quick Local Average\n");
00534 Image<float> la = quickLocalAvg(im,7);
00535 CudaImage<float> cla = cudaQuickLocalAvg(cim,7);
00536 Image<float> hla = cla.exportToImage();
00537 testDiff(la,hla);
00538 printf("Test Quick Local Average 2x2\n");
00539 la = quickLocalAvg2x2(im);
00540 cla = cudaQuickLocalAvg2x2(cim);
00541 hla = cla.exportToImage();
00542 testDiff(la,hla);
00543 printf("Test Quick Local Max\n");
00544 la = quickLocalMax(im,7);
00545 cla = cudaQuickLocalMax(cim,7);
00546 hla = cla.exportToImage();
00547 testDiff(la,hla);
00548 }
00549
00550 void test_kernels(Image<float> im, MemoryPolicy mp, int dev)
00551 {
00552 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00553 float mj_stdev=1.0F;
00554 float mi_stdev=0.8F;
00555 float period=1.0F;
00556 float phase=0.0F;
00557 float theta=0.0F;
00558 printf("Test Gabor Kernel Generation\n");
00559 Image<float> gf = gaborFilter3(mj_stdev,mi_stdev,period,phase,theta);
00560 CudaImage<float>cgf = cudaGaborFilter3(mp,dev,mj_stdev,mi_stdev,period,phase,theta,-1);
00561 Image<float> hgf = cgf.exportToImage();
00562 testDiff(gf,hgf);
00563 printf("Testing Optimized Convolution of a Gabor with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00564 Image<float> gcon = optConvolve(im,gf);
00565 CudaImage<float> cgcon = cudaOptConvolve(cim,cgf);
00566 Image<float> hgcon = cgcon.exportToImage();
00567 testDiff(gcon,hgcon,HIGHER_ROUNDOFF_MARGIN);
00568 printf("Testing Zero Boundary Convolution of a Gabor with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00569 gcon = convolve(im,gf,CONV_BOUNDARY_ZERO);
00570 cgcon = cudaConvolve(cim,cgf,CONV_BOUNDARY_ZERO);
00571 hgcon = cgcon.exportToImage();
00572 testDiff(gcon,hgcon,HIGHER_ROUNDOFF_MARGIN);
00573 printf("Testing Clean Boundary Convolution of a Gabor with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00574 gcon = convolve(im,gf,CONV_BOUNDARY_CLEAN);
00575 cgcon = cudaConvolve(cim,cgf,CONV_BOUNDARY_CLEAN);
00576 hgcon = cgcon.exportToImage();
00577 testDiff(gcon,hgcon,HIGHER_ROUNDOFF_MARGIN);
00578 printf("Test Gaussian 1D Kernel Generation\n");
00579 float coef=1.0F; float sigma = 2.0F; int maxhw = 20;
00580 gf = gaussian<float>(coef,sigma,maxhw);
00581 cgf = cudaGaussian(mp,dev,coef,sigma,maxhw);
00582 hgf = cgf.exportToImage();
00583 testDiff(gf,hgf);
00584 float rndOffErr = HIGHER_ROUNDOFF_MARGIN;
00585
00586 printf("Testing Optimized Zero Boundary Convolution of a separable Gaussian with higher roundoff tolerance %f\n",rndOffErr);
00587 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_ZERO);
00588 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_ZERO);
00589 hgcon = cgcon.exportToImage();
00590 testDiff(gcon,hgcon,rndOffErr);
00591 printf("Testing NonOptimized Zero Boundary Convolution of a separable Gaussian with higher roundoff tolerance %f\n",rndOffErr);
00592 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_ZERO);
00593 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_ZERO,false);
00594 hgcon = cgcon.exportToImage();
00595 testDiff(gcon,hgcon,rndOffErr);
00596 printf("Testing Optimized Clean Boundary Convolution of a separable Gaussian with higher roundoff tolerance %f\n",rndOffErr);
00597 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_CLEAN);
00598 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_CLEAN);
00599 hgcon = cgcon.exportToImage();
00600 testDiff(gcon,hgcon,rndOffErr);
00601 printf("Testing NonOptimized Clean Boundary Convolution of a separable Gaussian with higher roundoff tolerance %f\n",rndOffErr);
00602 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_CLEAN);
00603 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_CLEAN,false);
00604 hgcon = cgcon.exportToImage();
00605 testDiff(gcon,hgcon,rndOffErr);
00606 printf("Testing Optimized Replicate Boundary Convolution of a separable Gaussian with higher roundoff tolerance %f\n",rndOffErr);
00607 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_REPLICATE);
00608 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_REPLICATE);
00609 hgcon = cgcon.exportToImage();
00610 testDiff(gcon,hgcon,rndOffErr);
00611 printf("Testing NonOptimized Replicate Boundary Convolution of a separable Gaussian with higher roundoff tolerance %f\n",rndOffErr);
00612 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_REPLICATE);
00613 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_REPLICATE,false);
00614 hgcon = cgcon.exportToImage();
00615 testDiff(gcon,hgcon,rndOffErr);
00616 Timer tim;
00617 printf("Timing convolution\n");
00618 tim.reset();
00619 for(int i=0;i<1;i++)
00620 gcon = sepFilter(im,gf,gf,CONV_BOUNDARY_CLEAN);
00621 LINFO("CPU done! %fms", tim.getSecs() * 1000.0F);
00622 tim.reset();
00623 for(int i=0;i<1;i++)
00624 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_CLEAN,false);
00625 LINFO("GPU original done! %fms", tim.getSecs() * 1000.0F);
00626 tim.reset();
00627 for(int i=0;i<1;i++)
00628 cgcon = cudaSepFilter(cim,cgf,cgf,CONV_BOUNDARY_CLEAN);
00629 LINFO("GPU optimized done! %fms", tim.getSecs() * 1000.0F);
00630 }
00631
00632 void test_hmax(Image<float> im, MemoryPolicy mp, int dev)
00633 {
00634 float rndOffErr = HIGHER_ROUNDOFF_MARGIN;
00635 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00636
00637 float theta = 40.0F, gamma = 1.0F, div = 0.5F;
00638 int size = 13;
00639 Image<float> dg = dogFilterHmax<float>(theta,gamma,size,div);
00640 CudaImage<float> cdg = CudaImage<float>(dg,mp,dev);
00641 printf("Testing HMax Style image energy normalized convolution with higher roundoff tolerance %f\n",rndOffErr);
00642 Image<float> gcon = convolveHmax(im,dg);
00643 CudaImage<float> cgcon = cudaConvolveHmax(cim,cdg);
00644 Image<float> hgcon = cgcon.exportToImage();
00645 testDiff(gcon,hgcon,rndOffErr);
00646
00647 printf("Testing WindowedPatchDistance Convolution with higher roundoff tolerance %f\n",rndOffErr);
00648 cgcon = CudaImage<float>(gcon,mp,dev);
00649 Image<float> gwpd = convolve(im,dg,CONV_BOUNDARY_ZERO);
00650 CudaImage<float> cgwpd = cudaConvolve(cim,cdg,CONV_BOUNDARY_ZERO);
00651 Image<float> hgwpd = cgwpd.exportToImage();
00652 testDiff(gwpd,hgwpd,rndOffErr);
00653
00654 printf("Testing WindowedPatchDistance Convolution(Clean) with higher roundoff tolerance %f\n",rndOffErr);
00655 cgcon = CudaImage<float>(gcon,mp,dev);
00656 gwpd = convolve(im,dg,CONV_BOUNDARY_CLEAN);
00657 cgwpd = cudaConvolve(cim,cdg,CONV_BOUNDARY_CLEAN);
00658 hgwpd = cgwpd.exportToImage();
00659 testDiff(gwpd,hgwpd,rndOffErr);
00660
00661 Image<float> sp = spatialPoolMax(im,20,20,20,20);
00662 CudaImage<float> csp = cudaSpatialPoolMax(cim,20,20,20,20);
00663 Image<float> hsp = csp.exportToImage();
00664 printf("Testing spatial pool max with higher roundoff tolerance %f\n",rndOffErr);
00665 testDiff(sp,hsp,rndOffErr);
00666
00667 Image<float> imr = rotate(im,im.getWidth()/2,im.getHeight()/2,PI/2);
00668 CudaImage<float> cimr = CudaImage<float>(imr,mp,dev);
00669 Image<float> mx = takeMax<float>(im,imr);
00670 CudaImage<float> cmx = cudaTakeMax(cim,cimr);
00671 Image<float> hmx = cmx.exportToImage();
00672 printf("Testing pixel by pixel take max with higher roundoff tolerance %f\n",rndOffErr);
00673 testDiff(mx,hmx,rndOffErr);
00674
00675 float sm = sum(im);
00676 CudaImage<float> csm = cudaGetSum(cim);
00677 float hsm = cudaGetScalar(csm);
00678 printf("Testing sum of pixels\n");
00679 testDiff(sm,hsm);
00680
00681 dg = dogFilterHmax<float>(theta,gamma,size,div);
00682 cdg = cudaDogFilterHmax(mp,dev,theta,gamma,size,div);
00683 Image<float> hdg = cdg.exportToImage();
00684 printf("Testing DoG HMAX kernel generation\n");
00685 testDiff(dg,hdg);
00686
00687 float stddev = 2.0F;
00688 int halfsize=6;
00689 dg = dogFilter<float>(stddev,theta,halfsize);
00690 cdg = cudaDogFilter(mp,dev,stddev,theta,halfsize);
00691 hdg = cdg.exportToImage();
00692 printf("Testing DoG kernel generation\n");
00693 testDiff(dg,hdg);
00694 }
00695
00696 void test_additiveNoise(Image<float> im, MemoryPolicy mp, int dev)
00697 {
00698 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00699 CudaImage<float> rndBuf;
00700 cudaSetSeed(dev);
00701 cudaSizeRandomBuffer(rndBuf,mp,dev,cim.size());
00702 printf("Test Additive Noise\n");
00703 inplaceAddBGnoise(im,7);
00704 cudaRandomMT(rndBuf);
00705 Image<float> hrbf = rndBuf.exportToImage();
00706 float mi,ma,av; getMinMaxAvg(hrbf,mi,ma,av);
00707 LINFO("RANDOM NUMBER GENERATOR should be in 0-1 range,w%u h%u avg=%f, min=%f max=%f",hrbf.getWidth(),hrbf.getHeight(), av, mi, ma);
00708 cudaInplaceAddBGnoise(cim,7,rndBuf);
00709 Image<float> him = cim.exportToImage();
00710 cmpNoise(im,him);
00711 }
00712
00713 void test_separable(Image<float> im, MemoryPolicy mp, int dev)
00714 {
00715 int w = im.getWidth();
00716 int h = im.getHeight();
00717 printf("Testing separable filters with large kernels with higher roundoff tolerance %f\n",HIGHER_ROUNDOFF_MARGIN);
00718 int maxhw = std::max(0,std::min(w,h)/2-1);
00719 float isig = (std::max(w,h) * 25) * 0.01F;
00720 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00721 CudaImage<float> cg = cudaGaussian(mp,dev,1.5/(isig*sqrt(2.0*M_PI)),isig, maxhw);
00722 Image<float> g = gaussian<float>(1.5/(isig*sqrt(2.0*M_PI)),isig, maxhw);
00723 CudaImage<float> cxf = cudaXFilter(cim,cg,cg.size(),CONV_BOUNDARY_CLEAN);
00724 Image<float> tmp;
00725 Image<float> xf = sepFilter(im,g,tmp,CONV_BOUNDARY_CLEAN);
00726 Image<float> hxf = cxf.exportToImage();
00727 testDiff(xf,hxf,HIGHER_ROUNDOFF_MARGIN);
00728 }
00729
00730 void test_maxNormalize(Image<float> im, MemoryPolicy mp, int dev)
00731 {
00732 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00733 float rndOffErr = HIGHER_ROUNDOFF_MARGIN*3;
00734 printf("Testing Max Normalize with higher roundoff tolerance %f\n",rndOffErr);
00735 Image<float> mn = maxNormalize(im,MAXNORMMIN,MAXNORMMAX,VCXNORM_DEFAULT,1);
00736 CudaImage<float> cmn = cudaMaxNormalize(cim,MAXNORMMIN,MAXNORMMAX,VCXNORM_DEFAULT,1);
00737 Image<float> hmn = cmn.exportToImage();
00738 testDiff(mn,hmn,rndOffErr);
00739
00740 }
00741
00742 void test_compressing(Image<float> im, MemoryPolicy mp, int dev)
00743 {
00744 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00745 CudaImage<float> ccompress = cudaLowPass9Dec(cim,true,true);
00746 CudaImage<float> cbase = cudaDecY(cudaLowPass9y(cudaDecX(cudaLowPass9x(cim))));
00747 Image<float> base = decY(lowPass9y(decX(lowPass9x(im))));
00748 Image<float> hbase = cbase.exportToImage();
00749 Image<float> hcompress = ccompress.exportToImage();
00750 float rndOffErr = HIGHER_ROUNDOFF_MARGIN*3;
00751 printf("Testing Baseline lowpass & decimate 9%f\n",rndOffErr);
00752 testDiff(base,hbase,rndOffErr);
00753 printf("Testing Compressed lowpass & decimate 9%f\n",rndOffErr);
00754 testDiff(base,hcompress,rndOffErr);
00755
00756 }
00757
00758 void test_cutpaste(Image<float> im, MemoryPolicy mp, int dev)
00759 {
00760 Image<float> im_copy = im;
00761 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00762 Rectangle r = Rectangle::tlbrI(10,15,24,35);
00763 Image<float> crp = crop(im,r);
00764 CudaImage<float> ccrp = cudaCrop(cim,r);
00765 Image<float> hcrp = ccrp.exportToImage();
00766 printf("Testing Cropping\n");
00767 testDiff(crp,hcrp);
00768 float dx = 12.5, dy = 7.2;
00769 Image<float> sim = shiftImage(im,dx,dy);
00770 CudaImage<float> csim = cudaShiftImage(cim,dx,dy);
00771 Image<float> hsim = csim.exportToImage();
00772 printf("Test ShiftImage\n");
00773 testDiff(sim,hsim);
00774 Image<float> lit = rotate(crp,crp.getWidth()/2,crp.getHeight()/2,M_PI/4.0);
00775 CudaImage<float> clit = CudaImage<float>(lit,mp,dev);
00776 Point2D<int> p2 = Point2D<int>(30,20);
00777 inplacePaste(im,lit,p2);
00778 cudaInplacePaste(cim,clit,p2);
00779 Image<float> hpaste = cim.exportToImage();
00780 printf("Test Inplace Paste\n");
00781 testDiff(im,hpaste);
00782
00783 im = im_copy;
00784 Image<PixRGB<float> > im_color = toRGB(im);
00785 Image<PixRGB<float> > lit_color = toRGB(lit);
00786 CudaImage<PixRGB<float> > cim_color = CudaImage<PixRGB<float> >(im_color,mp,dev);
00787 CudaImage<PixRGB<float> > clit_color = CudaImage<PixRGB<float> >(lit_color,mp,dev);
00788 inplacePaste(im_color,lit_color,p2);
00789 cudaInplaceOverlay(cim_color,clit_color,p2);
00790 hpaste = (cudaLuminance(cim_color)).exportToImage();
00791 printf("Test Inplace Paste RGB\n");
00792 testDiff(luminance(im_color),hpaste);
00793
00794
00795 }
00796
00797 void test_drawing(Image<float> im, MemoryPolicy mp, int dev)
00798 {
00799 float intensity=127.254;
00800 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00801 Rectangle r = Rectangle::tlbrI(10,15,24,35);
00802 cudaDrawRect(cim,r,intensity,3);
00803 drawRect(im,r,intensity,3);
00804 Image<float> him = cim.exportToImage();
00805 printf("Test Inplace Draw Rectangular Border\n");
00806 testDiff(im,him);
00807 }
00808
00809 void test_lowpassOptimization(Image<float> im, MemoryPolicy mp, int dev)
00810 {
00811 Timer tim;
00812 Rectangle r = Rectangle::tlbrO(0,0,384,384);
00813 im = crop(im,r);
00814 CudaImage<float> cim = CudaImage<float>(im,mp,dev);
00815 CudaImage<float> cnorm, copt, crnd;
00816 CudaImage<float> ctmp = (cim+402.333F)/12.0F;
00817 printf("Testing low pass optimization\n");
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833 tim.reset();
00834 for(int i=0;i<1;i++)
00835 cnorm = cudaLowPass9Dec(cim,true,true);
00836 LINFO("Normal GPU lowpass done! %fms", tim.getSecs() * 1000.0F);
00837 tim.reset();
00838 for(int i=0;i<1;i++)
00839 copt = cudaLowPass9xyDec(cim);
00840 LINFO("Texture optimized GPU lowpass done! %fms", tim.getSecs() * 1000.0F);
00841 testDiff(cnorm.exportToImage(),copt.exportToImage());
00842 }
00843
00844 void unit_test(int argc, char **argv)
00845 {
00846 if (argc != 2) LFATAL("USAGE: %s <input.pgm>", argv[0]);
00847
00848 setFpuRoundingMode(FPU_ROUND_NEAR);
00849 int dev = 0;
00850 MemoryPolicy mp = GLOBAL_DEVICE_MEMORY;
00851 CudaDevices::displayProperties(dev);
00852
00853
00854 LINFO("Reading: %s", argv[1]);
00855 Image<PixRGB<float> > img = Raster::ReadRGB(argv[1]);
00856
00857
00858
00859 Image<float> normalLum = luminanceNTSC(img);
00860
00861
00862 CudaImage<PixRGB<float> > cimg = CudaImage<PixRGB<float> >(img,mp,dev);
00863
00864 CudaImage<float> cLum = cudaLuminanceNTSC(cimg);
00865 Image<float> hcLum = cLum.exportToImage();
00866 testDiff(normalLum,hcLum);
00867
00868
00869
00870
00871 testDiff(cudaLowPass9(cLum,true,true).exportToImage(), lowPass9(normalLum,true,true));
00872
00873 test_pyramids(normalLum,mp,dev);
00874
00875 test_minmaxavgnorm(normalLum,mp,dev);
00876
00877 test_kernels(normalLum,mp,dev);
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901 test_lowpassOptimization(normalLum,mp,dev);
00902 }
00903
00904
00905 void toytest()
00906 {
00907 int dev = 0;
00908 MemoryPolicy mp = GLOBAL_DEVICE_MEMORY;
00909 CudaDevices::displayProperties(dev);
00910 Image<float> img = Image<float>(10,10,NO_INIT);
00911 img.setVal(0,0,10.0F); img.setVal(0,1,20.0F); img.setVal(0,2,30.0F); img.setVal(0,3,40.0F); img.setVal(0,4,50.0F);
00912 img.setVal(0,5,20.0F); img.setVal(0,6,30.0F); img.setVal(0,7,40.0F); img.setVal(0,8,50.0F); img.setVal(0,9,60.0F);
00913 img.setVal(1,0,30.0F); img.setVal(1,1,40.0F); img.setVal(1,2,50.0F); img.setVal(1,3,60.0F); img.setVal(1,4,70.0F);
00914 img.setVal(1,5,40.0F); img.setVal(1,6,50.0F); img.setVal(1,7,60.0F); img.setVal(1,8,70.0F); img.setVal(1,9,80.0F);
00915 img.setVal(2,0,50.0F); img.setVal(2,1,60.0F); img.setVal(2,2,70.0F); img.setVal(2,3,80.0F); img.setVal(2,4,90.0F);
00916 img.setVal(2,5,60.0F); img.setVal(2,6,70.0F); img.setVal(2,7,80.0F); img.setVal(2,8,90.0F); img.setVal(2,9,100.F);
00917 img.setVal(3,0,70.0F); img.setVal(3,1,80.0F); img.setVal(3,2,90.0F); img.setVal(3,3,100.F); img.setVal(3,4,110.F);
00918 img.setVal(3,5,80.0F); img.setVal(3,6,90.0F); img.setVal(3,7,100.F); img.setVal(3,8,110.F); img.setVal(3,9,120.F);
00919 img.setVal(4,0,90.0F); img.setVal(4,1,100.F); img.setVal(4,2,110.F); img.setVal(4,3,120.F); img.setVal(4,4,130.F);
00920 img.setVal(4,5,80.0F); img.setVal(4,6,90.0F); img.setVal(4,7,100.F); img.setVal(4,8,110.F); img.setVal(4,9,120.F);
00921 img.setVal(5,0,70.0F); img.setVal(5,1,80.0F); img.setVal(5,2,90.0F); img.setVal(5,3,100.F); img.setVal(5,4,110.F);
00922 img.setVal(5,5,60.0F); img.setVal(5,6,70.0F); img.setVal(5,7,80.0F); img.setVal(5,8,90.0F); img.setVal(5,9,100.F);
00923 img.setVal(6,0,50.0F); img.setVal(6,1,60.0F); img.setVal(6,2,70.0F); img.setVal(6,3,80.0F); img.setVal(6,4,90.0F);
00924 img.setVal(6,5,40.0F); img.setVal(6,6,50.0F); img.setVal(6,7,60.0F); img.setVal(6,8,70.0F); img.setVal(6,9,80.0F);
00925 img.setVal(7,0,30.0F); img.setVal(7,1,40.0F); img.setVal(7,2,50.0F); img.setVal(7,3,60.0F); img.setVal(7,4,70.0F);
00926 img.setVal(7,5,20.0F); img.setVal(7,6,30.0F); img.setVal(7,7,40.0F); img.setVal(7,8,50.0F); img.setVal(7,9,60.0F);
00927 img.setVal(8,0,10.0F); img.setVal(8,1,20.0F); img.setVal(8,2,30.0F); img.setVal(8,3,40.0F); img.setVal(8,4,50.0F);
00928 img.setVal(8,5,00.0F); img.setVal(8,6,10.0F); img.setVal(8,7,20.0F); img.setVal(8,8,30.0F); img.setVal(8,9,40.0F);
00929 img.setVal(9,0,00.0F); img.setVal(9,1,00.0F); img.setVal(9,2,10.0F); img.setVal(9,3,20.0F); img.setVal(9,4,30.0F);
00930 img.setVal(9,5,00.0F); img.setVal(9,6,00.0F); img.setVal(9,7,00.0F); img.setVal(9,8,10.0F); img.setVal(9,9,20.0F);
00931
00932 CudaImage<float> cimg = CudaImage<float>(img,mp,dev);
00933 Image<float> cres = cudaLowPass5yDec(cimg).exportToImage();
00934 Image<float> normres = lowPass5yDecY(img);
00935 testDiff(normres,cres);
00936 test_minmaxavgnorm(img,mp,dev);
00937 test_kernels(img,mp,dev);
00938 test_math(img,mp,dev);
00939 test_localOperators(img,mp,dev);
00940 test_additiveNoise(img,mp,dev);
00941 test_separable(img,mp,dev);
00942 test_maxNormalize(img,mp,dev);
00943 test_compressing(img,mp,dev);
00944 test_hmax(img,mp,dev);
00945 test_cutpaste(img,mp,dev);
00946 test_drawing(img,mp,dev);
00947 test_find(img,mp,dev);
00948
00949 }
00950
00951
00952 int main(int argc, char **argv)
00953 {
00954 if(argc >= 2)
00955 {
00956 unit_test(argc,argv);
00957 }
00958 else
00959 toytest();
00960 }