00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #include "CINNIC/CINNICstatsRun.H"
00046
00047 #include "Util/Assert.H"
00048 #include "Image/DrawOps.H"
00049 #include "Image/MathOps.H"
00050 #include "Image/Transforms.H"
00051
00052 #include <fstream>
00053
00054 CINNICstatsRun::CINNICstatsRun()
00055 {
00056 }
00057
00058 CINNICstatsRun::~CINNICstatsRun()
00059 {
00060 }
00061
00062
00063
00064 void CINNICstatsRun::setConfig(readConfig &config, readConfig &config2)
00065 {
00066
00067
00068
00069
00070 LINFO("READING CONFIG VALUES");
00071 decSize = (int)config.getItemValueF("decSize");
00072 unEvenDec = (int)config.getItemValueF("unEvenDec");
00073 lowThresh = (int)config.getItemValueF("lowThresh");
00074 highThresh = (int)config.getItemValueF("highThresh");
00075 chopVal = (int)config.getItemValueF("chopVal");
00076 pointsNum = (int)config.getItemValueF("pointsNum");
00077 circRad = (int)config.getItemValueF("circRad");
00078 floodThresh = config.getItemValueF("floodThresh");
00079 floodVal = config.getItemValueF("floodVal");
00080 qualityImage = (int)config.getItemValueF("qualityImage");
00081 qChop = (int)config.getItemValueF("qChop");
00082 doResize = (int)config.getItemValueF("doResize");
00083 rankThresh = (int)config.getItemValueF("rankThresh");
00084 preProcessPNF = (int)config.getItemValueF("preProcessPNF");
00085 useDrawDisk = (int)config.getItemValueF("useDrawDisk");
00086 diskSize = (int)config.getItemValueF("diskSize");
00087 statsFile = config.getItemValueS("statsFile");
00088 monoColor = (int)config.getItemValueF("monoColor");
00089 PSError = config2.getItemValueF("PSError");
00090 centerOffset = (int)config.getItemValueF("centerOffset");
00091 edgeAtten = (int)config.getItemValueF("edgeAtten");
00092 }
00093
00094 void CINNICstatsRun::setStuff(readConfig &fileList)
00095 {
00096 tempImage1c.resize(1,1);
00097 tempImage2.resize(1,1);
00098 salMap.resize(1,1);
00099 point2D = new Point2D<int>;
00100 pointVec.resize(5,*point2D);
00101 maxPointList.resize(fileList.itemCount(),pointVec);
00102 postChamferVal.resize(fileList.itemCount(),0.0F);
00103 errorCount.resize(fileList.itemCount(),0);
00104 totCount.resize(fileList.itemCount(),0);
00105 totalVal.resize(fileList.itemCount(),0.0F);
00106 errorRatio.resize(fileList.itemCount(),0.0F);
00107 testMean.resize(fileList.itemCount(),0.0F);
00108 testStd.resize(fileList.itemCount(),0.0F);
00109 compMean.resize(fileList.itemCount(),0.0F);
00110 compStd.resize(fileList.itemCount(),0.0F);
00111 regression.resize(fileList.itemCount(),0.0F);
00112 eucDist.resize(fileList.itemCount(),0.0F);
00113 pointsFound.resize(fileList.itemCount(),0);
00114 pointsFoundNum.resize(pointsNum,0);
00115 pointRank.resize(fileList.itemCount(),-1);
00116 pointRankNum.resize(pointsNum,0);
00117 candPixels.resize(pointsNum,0);
00118 realPixels.resize(pointsNum,0);
00119 strikeP.resize(pointsNum,0.0F);
00120 bernoulliP.resize(pointsNum,0.0F);
00121 totalErrorRatio = 0; maxMean = 0; minMean = 1;
00122 totEucDist = 0; maxEuc = 0 ; minEuc = 1;
00123 totReg = 0; maxReg = 0; minReg = 1;
00124 zeroCount = 0;
00125 foundTotal = 0.0F; rankTotal = 0.0F;
00126 foundMean = 0.0F; rankMean = 0.0F;
00127 }
00128
00129 void CINNICstatsRun::setStuff()
00130 {
00131 tempImage1c.resize(1,1);
00132 tempImage2.resize(1,1);
00133 salMap.resize(1,1);
00134 point2D = new Point2D<int>;
00135 pointVec.resize(5,*point2D);
00136 pointRankNum.resize(pointsNum,0);
00137 totalErrorRatio = 0; maxMean = 0; minMean = 1;
00138 totEucDist = 0; maxEuc = 0 ; minEuc = 1;
00139 totReg = 0; maxReg = 0; minReg = 1;
00140 zeroCount = 0;
00141 foundTotal = 0.0F; rankTotal = 0.0F;
00142 foundMean = 0.0F; rankMean = 0.0F;
00143 pointsFoundNum.resize(pointsNum,0);
00144 }
00145
00146 void CINNICstatsRun::runStandardStats(readConfig &fileList)
00147 {
00148
00149
00150 imageCount = fileList.itemCount();
00151 const char* inCompImage;
00152
00153
00154 for(int i = 0; fileList.readFileTrue(i); i++)
00155 {
00156
00157 LINFO("PAIR %d",i);
00158
00159 fileList.readFileValueNameC(i);
00160 inCompImage = fileList.readFileValueC(i);
00161
00162 tempImage1c = Raster::ReadRGB(fileList.readFileValueNameC(i), RASFMT_PNM);
00163 LINFO("DONE");
00164 tempImage2 = Raster::ReadGray(fileList.readFileValueC(i), RASFMT_PNM);
00165 LINFO("DONE");
00166
00167 checkSize();
00168
00169
00170 tempImage1cf = tempImage1c;
00171 testImage = luminance(tempImage1cf);
00172 inplaceAttenuateBorders(testImage, edgeAtten);
00173 compImage = tempImage2;
00174
00175
00176 preProcess();
00177
00178
00179 testImageVector.assign(testImage.begin(), testImage.end());
00180 compImageVector.assign(compImage.begin(), compImage.end());
00181 testMean[i] = Stats.mean(testImageVector);
00182 testStd[i] = Stats.findS(testImageVector,testMean[i]);
00183 LINFO("testMean is %f std %f",testMean[i],testStd[i]);
00184 compMean[i] = Stats.mean(compImageVector);
00185 compStd[i] = Stats.findS(compImageVector,compMean[i]);
00186 LINFO("compMean is %f std %f",compMean[i],compStd[i]);
00187 regression[i] = Stats.rRegression(testImageVector,compImageVector);
00188
00189
00190
00191 for(int x = 0; x < testImage.getWidth(); x++)
00192 {
00193 for(int y = 0; y < testImage.getHeight(); y++)
00194 {
00195 eucDist[i] += pow((testImage.getVal(x,y) - compImage.getVal(x,y)),2);
00196 }
00197 }
00198
00199
00200 float hold = (1.0F/(testImage.getWidth()*testImage.getHeight()));
00201 eucDist[i] = hold*sqrt(eucDist[i]);
00202
00203
00204 for(int x = 0; x < testImage.getWidth(); x++)
00205 {
00206 for(int y = 0; y < testImage.getHeight(); y++)
00207 {
00208 if(testImage.getVal(x,y) < testMean[i])
00209 {
00210 testImage.setVal(x,y,0.0F);
00211 }
00212 else
00213 {
00214 testImage.setVal(x,y,254.0F);
00215 }
00216 }
00217 }
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 for(int x = 0; x < compImage.getWidth(); x++)
00232 {
00233 for(int y = 0; y < compImage.getHeight(); y++)
00234 {
00235 if(testImage.getVal(x,y) > 1)
00236 {
00237 totCount[i]++;
00238 if(compImage.getVal(x,y) < 1)
00239 {
00240 errorCount[i]++;
00241 }
00242 }
00243 }
00244 }
00245
00246 if((errorCount[i] != 0) && (totCount[i] != 0))
00247 {
00248 errorRatio[i] = (float)errorCount[i]/(float)totCount[i];
00249 }
00250 else
00251 {
00252 errorRatio[i] = 0.0F;
00253 zeroCount++;
00254 }
00255
00256 LINFO("Error count for %s is %d",inCompImage,errorCount[i]);
00257 LINFO("Total count for %s is %d",inCompImage,totCount[i]);
00258 LINFO("Error Ratio is %f",errorRatio[i]);
00259 LINFO("Euclidian distance is %f", eucDist[i]);
00260 LINFO("Regression %f",regression[i]);
00261
00262 totEucDist += eucDist[i];
00263 totalErrorRatio += errorRatio[i];
00264 totReg += regression[i];
00265
00266 if(eucDist[i] > maxEuc){maxEuc = eucDist[i];}
00267 if(eucDist[i] < minEuc){minEuc = eucDist[i];}
00268 if(errorRatio[i] > maxMean){maxMean = errorRatio[i];}
00269 if(errorRatio[i] < minMean){minMean = errorRatio[i];}
00270 if(regression[i] > maxReg){maxReg = regression[i];}
00271 if(regression[i] < minReg){minReg = regression[i];}
00272 }
00273 meanEucDist = totEucDist/imageCount;
00274 totalMeanError = totalErrorRatio/(imageCount-zeroCount);
00275 meanReg = totReg/imageCount;
00276
00277 stdEucDist = dStats.findS(eucDist, meanEucDist);
00278 totalStdError = Stats.findS(errorRatio, totalMeanError);
00279 stdReg = Stats.findS(regression, meanReg);
00280
00281 LINFO("Total Images Run %d",imageCount);
00282 LINFO("Total Error Ratio %f",totalErrorRatio);
00283 LINFO("Total Mean Error %f :S %f",totalMeanError,totalStdError);
00284 LINFO("Max %f Min %f",maxMean,minMean);
00285 LINFO("Total Mean Euclidian Distance %f :S %f",meanEucDist,stdEucDist);
00286 LINFO("Max %f Min %f",maxEuc,minEuc);
00287 LINFO("Total Mean Regression %f :S %f",meanReg,stdReg);
00288 LINFO("Max %f Min %f",maxReg,minReg);
00289 LINFO("Zero Count %d",zeroCount);
00290 }
00291
00292 void CINNICstatsRun::runPointAndFlood(readConfig &fileList,const char* param)
00293 {
00294 std::ofstream outfile(statsFile.c_str(),std::ios::app);
00295
00296 LINFO("STARTING Point and Flood");
00297 int N = 0;
00298 for(int i = 0; fileList.readFileTrue(i); i++)
00299 {
00300 maskImage.resize(compImage.getWidth(),compImage.getHeight(),true);
00301 N = i;
00302 fileList.readFileValueC(i);
00303 fileList.readFileValueNameC(i);
00304
00305 tempImage1c = Raster::ReadRGB(fileList.readFileValueNameC(i), RASFMT_PNM);
00306
00307 tempImage2 = Raster::ReadGray(fileList.readFileValueC(i), RASFMT_PNM);
00308
00309
00310 checkSize();
00311
00312 tempImage1cf = tempImage1c;
00313 testImage = luminance(tempImage1cf);
00314 inplaceAttenuateBorders(testImage, edgeAtten);
00315 compImage = tempImage2;
00316 salMap.resize(tempImage1c.getWidth(),tempImage1c.getHeight());
00317 outImageTemplate = compImage;
00318 outImageSource = testImage;
00319
00320
00321
00322
00323 if(preProcessPNF == 1)
00324 preProcess();
00325
00326
00327 pointAndFlood(fileList.readFileValueNameC(i),i,false);
00328 }
00329
00330 for(int n = 0; n < pointsNum; n++)
00331 {
00332 strikeP[n] = (float)candPixels[n]/(float)realPixels[n];
00333 candPixels[n] = candPixels[n]/N;
00334 realPixels[n] = realPixels[n]/N;
00335
00336 if(n > 0)
00337 {
00338 bernoulliP[n] = (1-bernoulliP[n-1])*strikeP[n] + bernoulliP[n-1];
00339 }
00340 else
00341 {
00342 bernoulliP[n] = strikeP[n];
00343 }
00344 }
00345
00346 rankMean = rankTotal/N;
00347 rankSTD = Stats.findS(pointRank,rankMean);
00348 foundMean = foundTotal/N;
00349 foundSTD = Stats.findS(pointsFound,foundMean);
00350
00351 LINFO("#################FINAL#################");
00352 LINFO("rank mean %f std %f",rankMean,rankSTD);
00353 LINFO("found mean %f std %f",foundMean,foundSTD);
00354 outfile << param << "\t";
00355 outfile << rankMean << "\t" << rankSTD << "\t";
00356 outfile << foundMean << "\t" << foundSTD << "\t";
00357 for(int i = 0; i < pointsNum; i++)
00358 {
00359 LINFO("AT rank %d = %d",i,pointRankNum[i]);
00360 outfile << pointRankNum[i] << "\t";
00361 }
00362 for(int i = 0; i <= pointsNum; i++)
00363 {
00364 LINFO("FOUND number %d = %d",i,pointsFoundNum[i]);
00365 outfile << pointsFoundNum[i] << "\t";
00366 }
00367 LINFO("General Stats:");
00368 for(int i = 0; i < pointsNum; i++)
00369 {
00370 LINFO("[%d] REAL %ld CANDIDATE %ld STRIKE %f BERNOULLI %f",i,realPixels[i]
00371 ,candPixels[i],strikeP[i],bernoulliP[i]);
00372 outfile << realPixels[i] << "\t" << candPixels[i] << "\t"
00373 << strikeP[i] << "\t" << bernoulliP[i] << "\t";
00374 }
00375
00376 outfile << "\n";
00377 outfile.close();
00378
00379 }
00380
00381 void CINNICstatsRun::randomMatch(float *likelyhood,
00382 long *posRegionCount, long *totalCount)
00383 {
00384 long pRC = 0, tC = 0;
00385 float lh;
00386
00387 for(int i = 0; i < compImage.getWidth(); i++)
00388 {
00389 for(int j = 0; j < compImage.getHeight(); j++)
00390 {
00391 if(maskImage.getVal(i,j) < 10.0F)
00392 {
00393 tC++;
00394 if(compImage.getVal(i,j) > rankThresh)
00395 {
00396 pRC++;
00397 }
00398 }
00399 }
00400 }
00401 lh = pRC/tC;
00402 *posRegionCount = pRC;
00403 *totalCount = tC;
00404 *likelyhood = lh;
00405 }
00406
00407 void CINNICstatsRun::preProcess()
00408 {
00409 if(qualityImage == 0)
00410 {
00411 compImage = rescale(compImage,unEvenDec,unEvenDec);
00412
00413 compImage = lowPass5(compImage);
00414
00415
00416 for(int x = 0; x < compImage.getWidth(); x++)
00417 {
00418 for(int y = 0; y < compImage.getHeight(); y++)
00419 {
00420 if(compImage.getVal(x,y) < highThresh){compImage.setVal(x,y,255.0F);}
00421 else{compImage.setVal(x,y,0.0F);}
00422 }
00423 }
00424 compImage =\
00425 rescale(compImage,testImage.getWidth(),testImage.getHeight());
00426
00427
00428
00429
00430
00431 for(int x = 0; x < compImage.getWidth(); x++)
00432 {
00433 for(int y = 0; y < compImage.getHeight(); y++)
00434 {
00435 if(compImage.getVal(x,y) < chopVal){compImage.setVal(x,y,0.0F);}
00436 if(testImage.getVal(x,y) < chopVal){testImage.setVal(x,y,0.0F);}
00437 }
00438 }
00439 }
00440 else
00441 {
00442 for(int x = 0; x < compImage.getWidth(); x++)
00443 {
00444 for(int y = 0; y < compImage.getHeight(); y++)
00445 {
00446 if(compImage.getVal(x,y) < qChop){compImage.setVal(x,y,0.0F);}
00447 }
00448 }
00449 }
00450 }
00451
00452 void CINNICstatsRun::checkSize()
00453 {
00454 if(doResize == 0)
00455 {
00456 ASSERT(tempImage1c.getWidth() == tempImage2.getWidth());
00457 ASSERT(tempImage1c.getHeight() == tempImage2.getHeight());
00458 }
00459 else
00460 {
00461 if(tempImage1c.getWidth() != tempImage2.getWidth())
00462 {
00463 if(tempImage1c.getHeight() != tempImage2.getHeight())
00464 {
00465 tempImage2 =\
00466 rescale(tempImage2,tempImage1c.getWidth(),tempImage1c.getHeight());
00467 }
00468 else
00469 {
00470 ASSERT("skew detected, cannot resize");
00471 }
00472 }
00473 }
00474 }
00475
00476 PixRGB<float> CINNICstatsRun::colorTable(int i)
00477 {
00478 PixRGB<float> pix;
00479 pix.setRed(0.0F);
00480 pix.setGreen(0.0F);
00481 pix.setBlue(0.0F);
00482 switch(i)
00483 {
00484 case 0:
00485 pix.setRed(255.0F);
00486 break;
00487 case 1:
00488 pix.setGreen(128.0F);
00489 pix.setRed(255.0F);
00490 break;
00491 case 2:
00492 pix.setRed(255.0F);
00493 pix.setGreen(255.0F);
00494 break;
00495 case 3:
00496 pix.setGreen(255.0F);
00497 break;
00498 case 4:
00499 pix.setBlue(255.0F);
00500 break;
00501 case 5:
00502 pix.setRed(255.0F);
00503 pix.setBlue(255.0F);
00504 break;
00505 default:
00506 pix.setRed(255.0F);
00507 pix.setGreen(255.0F);
00508 pix.setBlue(255.0F);
00509 }
00510 return pix;
00511 }
00512
00513 void CINNICstatsRun::pointAndFloodImage(Image<float> test_image,
00514 Image<float> sal_map
00515 ,int points,char* filename,
00516 float floodv,float floodt)
00517 {
00518 monoColor = 0;
00519 pointsNum = points;
00520 useDrawDisk = 0;
00521 floodThresh = floodt;
00522 floodVal = floodv;
00523 circRad = 15;
00524 pointAndFloodImage(test_image,sal_map,filename);
00525 }
00526
00527 void CINNICstatsRun::pointAndFloodImage(Image<float> test_image,
00528 Image<float> sal_map
00529 ,char* filename)
00530 {
00531 LINFO("running POINT and FLOOD for %s",filename);
00532 point2D = new Point2D<int>;
00533 testImage = sal_map;
00534 maskImage.resize(sal_map.getWidth(),sal_map.getHeight(),true);
00535 outImageTemplate = test_image;
00536 outImageSource = sal_map;
00537 salMap.resize(sal_map.getWidth(),sal_map.getHeight(),true);
00538 pointAndFlood(filename,0,true);
00539 }
00540
00541 void CINNICstatsRun::pointAndFlood(const char* filename,int i,bool standalone)
00542 {
00543 Image<float> storeImage;
00544 for(int n = 0; n < pointsNum; n++)
00545 {
00546 if(!(standalone))
00547 {
00548 float strike = 0.0F;
00549 long cand = 0 ,real = 0;
00550 randomMatch(&strike,&cand,&real);
00551 candPixels[n] += cand;
00552 realPixels[n] += real;
00553 }
00554
00555 float maxVal;
00556 findMax(testImage, *point2D,maxVal);
00557 salMap.setVal(*point2D,255.0F);
00558
00559 if(!(standalone))
00560 {
00561 if(compImage.getVal(*point2D) > rankThresh)
00562 {
00563 pointsFound[i]++;
00564 if(pointRank[i] == -1)
00565 {
00566 pointRank[i] = n;
00567 rankTotal += n;
00568 pointRankNum[(int)pointRank[i]]++;
00569 LINFO("Setting %d as rank %f",i,pointRank[i]);
00570 }
00571 }
00572 }
00573
00574 pixRGB = colorTable(n);
00575 if(n > 0)
00576 {
00577 Point2D<int> *oldPoint = new Point2D<int>(ii,jj);
00578
00579 if(monoColor != 1)
00580 {
00581 drawArrow(outImageTemplate, *oldPoint,*point2D,pixRGB);
00582 drawArrow(outImageSource, *oldPoint,*point2D,pixRGB);
00583 }
00584 else
00585 {
00586 pixRGB = colorTable(-1);
00587 drawArrow(outImageTemplate, *oldPoint,*point2D,pixRGB,2);
00588 drawArrow(outImageSource, *oldPoint,*point2D,pixRGB,2);
00589 }
00590 }
00591 ii = point2D->i;
00592 jj = point2D->j;
00593 if(monoColor != 1)
00594 {
00595 drawCircle(outImageTemplate, *point2D,circRad,pixRGB);
00596 drawCircle(outImageSource, *point2D,circRad,pixRGB);
00597 }
00598 else
00599 {
00600
00601 pixRGB = colorTable(-1);
00602 drawCircle(outImageTemplate, *point2D,circRad,pixRGB,2);
00603 drawCircle(outImageSource, *point2D,circRad,pixRGB,2);
00604 }
00605 if(useDrawDisk != 1)
00606 {
00607 flood(testImage, storeImage,*point2D,floodThresh,floodVal);
00608 testImage -= storeImage;
00609 }
00610 else
00611 {
00612 drawDisk(testImage, *point2D,diskSize,0.0F);
00613 drawDisk(maskImage, *point2D,diskSize,255.0F);
00614 }
00615
00616 }
00617 if(!(standalone))
00618 {
00619 foundTotal += (int)pointsFound[i];
00620 pointsFoundNum[(int)pointsFound[i]]++;
00621 LINFO("Number Found %f / %d",pointsFound[i],pointsNum);
00622 }
00623 LINFO("writing %s.salPoint",filename);
00624
00625 Image<PixRGB <byte> > thisBytes = outImageTemplate;
00626 Raster::WriteRGB(thisBytes,sformat("%s.salPoint.ppm",filename));
00627 thisBytes = outImageSource;
00628 Raster::WriteRGB(thisBytes,sformat("%s,salPointSource.ppm",filename));
00629 }
00630
00631 float CINNICstatsRun::polatSagi2AFC(Image<float> targetImage,
00632 Image<float> notargetImage)
00633 {
00634 ASSERT(targetImage.getHeight() == notargetImage.getHeight());
00635 ASSERT(targetImage.getWidth() == notargetImage.getWidth());
00636 int Xcenter = (targetImage.getWidth()/2)+centerOffset;
00637 int Ycenter = (targetImage.getHeight()/2)+centerOffset;
00638 mu1 = PSError + targetImage.getVal(Xcenter,Ycenter);
00639 mu2 = PSError + notargetImage.getVal(Xcenter,Ycenter);
00640 float sigma1 = sqrt(mu1);
00641 float sigma2 = sqrt(mu2);
00642 return Stats.getErrorGGC_2AFC(mu1,mu2,sigma1,sigma2);
00643 }
00644
00645 float CINNICstatsRun::getMu1()
00646 {
00647 return mu1;
00648 }
00649
00650 float CINNICstatsRun::getMu2()
00651 {
00652 return mu2;
00653 }
00654
00655
00656
00657
00658
00659