VisMap.h
上传用户:weixiumei
上传日期:2008-05-15
资源大小:1769k
文件大小:8k
开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////
  2. //
  3. // NAME
  4. //  VisMap.h -- image mapping functions, based on function objects (~STL)
  5. //
  6. // SPECIFICATION
  7. //  template <class OPERATOR, class PIXELTYPE1, ..., class PIXELTYPEn>
  8. //  void VisMapn(OPERATOR& fn,
  9. //               CVisImage<PIXELTYPE1> img1, ... ,
  10. //               CVisImage<PIXELTYPEn> imgn);
  11. //
  12. //  or
  13. //
  14. //  template <class OPERATOR, class PIXELTYPE1, ..., class PIXELTYPEn>
  15. //  void VisMapn(const RECT& refrect, OPERATOR& fn,
  16. //               CVisImage<PIXELTYPE1> img1, ... ,
  17. //               CVisImage<PIXELTYPEn> imgn);
  18. //
  19. //
  20. // PARAMETERS
  21. //  refrect optional RECT giving coordinates of pixels used
  22. //  fn                  instance of OPERATOR class which defines operator()
  23. //  img0..imgn          input/output images
  24. //
  25. //
  26. // DESCRIPTION
  27. //  These routines are used to iterate over a collection of images,
  28. //  applying the same function to all pixels.  Because the function is
  29. //  passed in as a function object, the optimized (Release) version of
  30. //  the code should be very efficient.
  31. //
  32. //  The OPERATOR class should look something like:
  33. //      struct SampleFn1 {
  34. //          inline void operator()(byte& out, float& in)
  35. //              { out = __max(0, __min(255, int(in))); }
  36. //      };
  37. //
  38. //  This function could then be called using
  39. //      VisMap2(SampleFn1(), byte_img, float_img);
  40. //
  41. //  Note that it is also possible to pass non-image (scalar) parameters
  42. //  to the inner function by making them member variables
  43. //      struct SampleFn2 {
  44. //          const float scale;
  45. //          inline SampleFn2(float s) : scale(s) {};
  46. //          inline void operator()(byte& out, float& in)
  47. //              { out = __max(0, __min(255, int(in * scale))); }
  48. //      };
  49. //      VisMap2(SampleFn2(0.5f), byte_img, float_img);
  50. //
  51. //  This same style can be used to create functions with side-effects,
  52. //  e.g., functions which (almost) return a value:
  53. //      struct SumFn1 {
  54. //          double sum;
  55. //          inline SumFn1() : sum(0.0) {};
  56. //          inline void operator()(float in)
  57. //              { sum += in; }
  58. //      };
  59. //      SumFn1 op1;
  60. //      VisMap2(op1, float_img);
  61. //      double result = op1.sum;
  62. //  
  63. //  A RECT specifying the coordinates whose pixels should be passed to
  64. //  the function operator can be passed as an optional first argument to
  65. //  the VisMap functions.  If a RECT is not specified, the intersection
  66. //  of the (active) image RECTs is used.
  67. //
  68. //
  69. // SEE ALSO
  70. //  VisImage.h        definition of image class library
  71. //
  72. //
  73. // BUGS
  74. //  
  75. //
  76. // DESIGN
  77. //  LATER:
  78. //  This is just a first pass at the desired functionality.  In
  79. //  particular, we don't currently handle the non-safe regions,
  80. //  or have support for window (neighborhood) operations.
  81. //
  82. //  LATER:
  83. //  The current design uses indices when enumerating the pixels in an
  84. //  image row.  This is efficient for byte and 4-byte RGBA pixel values,
  85. //  but it may be better to use pointers that are incremented as we go
  86. //  through rows containing non-standard pixel values.
  87. //
  88. //
  89. // Copyright