PSSImageLevelPrior.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /**
  2. * @file PSSImageLevelPrior.cpp
  3. * @brief incorporate prior from image categorization method
  4. * @author Erik Rodner
  5. * @date 03/19/2009
  6. */
  7. #include <iostream>
  8. #include <set>
  9. #include <assert.h>
  10. #include <algorithm>
  11. #include "PSSImageLevelPrior.h"
  12. using namespace OBJREC;
  13. using namespace std;
  14. using namespace NICE;
  15. PSSImageLevelPrior::PSSImageLevelPrior ( int imagePriorMethod, int priorK, double alphaImagePrior )
  16. {
  17. this->imagePriorMethod = imagePriorMethod;
  18. this->priorK = priorK;
  19. this->alphaImagePrior = alphaImagePrior;
  20. }
  21. PSSImageLevelPrior::~PSSImageLevelPrior()
  22. {
  23. }
  24. void PSSImageLevelPrior::setPrior ( FullVector & prior )
  25. {
  26. this->prior = prior;
  27. }
  28. void PSSImageLevelPrior::postprocess ( NICE::ImageT<int> & result, NICE::MultiChannelImageT<double> & probabilities )
  29. {
  30. assert ( prior.size() == ( int ) probabilities.channels() );
  31. int xsize = probabilities.width();
  32. int ysize = probabilities.height();
  33. if ( imagePriorMethod == IMAGE_PRIOR_BEST_K )
  34. {
  35. vector<int> indices;
  36. prior.getSortedIndices ( indices );
  37. reverse ( indices.begin(), indices.end() );
  38. set<int> bestComponents;
  39. vector<int>::const_iterator j = indices.begin();
  40. if ( indices.size() > ( size_t ) priorK )
  41. advance ( j, priorK );
  42. else
  43. j = indices.end();
  44. for ( vector<int>::const_iterator jj = indices.begin();
  45. jj != j ; jj++ )
  46. bestComponents.insert ( *jj );
  47. for ( int ys = 0 ; ys < ysize ; ys ++ )
  48. for ( int xs = 0 ; xs < xsize ; xs++)
  49. {
  50. int maxindex = 0;
  51. double maxvalue = - numeric_limits<double>::max();
  52. double sum = 0.0;
  53. for ( int i = 0 ; i < ( int ) probabilities.channels() ; i++ )
  54. {
  55. if ( bestComponents.find ( i ) == bestComponents.end() )
  56. probabilities[i](xs,ys) = 0.0;
  57. sum += probabilities[i](xs,ys);
  58. if ( probabilities[i](xs,ys) > maxvalue )
  59. {
  60. maxindex = i;
  61. maxvalue = probabilities[i](xs,ys);
  62. }
  63. }
  64. if ( sum > 1e-11 )
  65. for ( int i = 0 ; i < ( int ) probabilities.channels() ; i++ )
  66. {
  67. probabilities[i](xs,ys) /= sum;
  68. }
  69. result.setPixel ( xs, ys, maxindex );
  70. }
  71. } else if ( imagePriorMethod == IMAGE_PRIOR_PSEUDOPROB ) {
  72. for ( int ys = 0 ; ys < ysize ; ys ++ )
  73. for ( int xs = 0 ; xs < xsize ; xs++)
  74. {
  75. int maxindex = 0;
  76. double maxvalue = - numeric_limits<double>::max();
  77. double sum = 0.0;
  78. for ( int i = 0 ; i < ( int ) probabilities.channels() ; i++ )
  79. {
  80. probabilities[i](xs,ys) *= pow ( prior[i], alphaImagePrior );
  81. sum += probabilities[i](xs,ys);
  82. if ( probabilities[i](xs,ys) > maxvalue )
  83. {
  84. maxindex = i;
  85. maxvalue = probabilities[i](xs,ys);
  86. }
  87. }
  88. if ( sum > 1e-11 )
  89. for ( int i = 0 ; i < ( int ) probabilities.channels() ; i++ )
  90. {
  91. probabilities[i](xs,ys) /= sum;
  92. }
  93. result.setPixel ( xs, ys, maxindex );
  94. }
  95. }
  96. }