PSSImageLevelPrior.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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::Image & result, NICE::MultiChannelImageT<double> & probabilities )
  29. {
  30. assert ( prior.size() == (int)probabilities.numChannels );
  31. int xsize = probabilities.xsize;
  32. int ysize = probabilities.ysize;
  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. int offset_s = 0;
  48. for ( int ys = 0 ; ys < ysize ; ys ++ )
  49. for ( int xs = 0 ; xs < xsize ; xs++,offset_s++ )
  50. {
  51. int maxindex = 0;
  52. double maxvalue = - numeric_limits<double>::max();
  53. double sum = 0.0;
  54. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  55. {
  56. if ( bestComponents.find(i) == bestComponents.end() )
  57. probabilities.data[i][offset_s] = 0.0;
  58. sum += probabilities.data[i][offset_s];
  59. if ( probabilities.data[i][offset_s] > maxvalue )
  60. {
  61. maxindex = i;
  62. maxvalue = probabilities.data[i][offset_s];
  63. }
  64. }
  65. if ( sum > 1e-11 )
  66. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  67. {
  68. probabilities.data[i][offset_s] /= sum;
  69. }
  70. result.setPixel(xs,ys,maxindex);
  71. }
  72. } else if ( imagePriorMethod == IMAGE_PRIOR_PSEUDOPROB ) {
  73. int offset_s = 0;
  74. for ( int ys = 0 ; ys < ysize ; ys ++ )
  75. for ( int xs = 0 ; xs < xsize ; xs++,offset_s++ )
  76. {
  77. int maxindex = 0;
  78. double maxvalue = - numeric_limits<double>::max();
  79. double sum = 0.0;
  80. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  81. {
  82. probabilities.data[i][offset_s] *= pow ( prior[i], alphaImagePrior );
  83. sum += probabilities.data[i][offset_s];
  84. if ( probabilities.data[i][offset_s] > maxvalue )
  85. {
  86. maxindex = i;
  87. maxvalue = probabilities.data[i][offset_s];
  88. }
  89. }
  90. if ( sum > 1e-11 )
  91. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  92. {
  93. probabilities.data[i][offset_s] /= sum;
  94. }
  95. result.setPixel(xs,ys,maxindex);
  96. }
  97. }
  98. }