wavelet_utils.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:12k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: wavelet_utils.h,v 1.2 2005/01/30 05:11:40 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Thomas Davies (Original Author), Scott R Ladd
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #ifndef _WAVELET_UTILS_H_
  38. #define _WAVELET_UTILS_H_
  39. #include <libdirac_common/arrays.h>
  40. #include <libdirac_common/common.h>
  41. #include <vector>
  42. #include <cmath>
  43. #include <iostream>
  44. namespace dirac
  45. {
  46.     //utilities for subband and wavelet transforms
  47.     //Includes fast transform using lifting
  48.     class PicArray;
  49.     //! Class encapsulating all the metadata relating to a wavelet subband
  50.     class Subband
  51.     {
  52.     public:
  53.         //! Default constructor
  54.         Subband();
  55.         //! Constructor
  56.         /*!
  57.             The constructor parameters are
  58.             param    xpos    the xposition of the subband when packed into a big array with all the others
  59.             param    ypos    the xposition of the subband
  60.             param    xlen    the width of the subband
  61.             param    ylen    the height of the subband
  62.          */    
  63.         Subband(int xpos, int ypos, int xlen, int ylen);
  64.         //! Constructor
  65.         /*!
  66.             The constructor parameters are
  67.             param    xpos    the xposition of the subband when packed into a big array with all the others
  68.             param    ypos    the xposition of the subband
  69.             param    xlen    the width of the subband
  70.             param    ylen    the height of the subband
  71.             param    d        the depth of the subband in the wavelet transform
  72.          */    
  73.         Subband(int xpos, int ypos, int xlen, int ylen, int d);
  74.         //! Destructor
  75.         ~Subband();
  76.         //Default (shallow) copy constructor and operator= used
  77.         //! Return the width of the subband
  78.         int Xl() const {return xln;}
  79.         
  80.         //! Return the horizontal position of the subband
  81.         int Xp() const {return xps;}
  82.         
  83.         //! Return the height of the subband
  84.         int Yl() const {return yln;}
  85.         
  86.         //! Return the vertical position of the subband
  87.         int Yp() const {return yps;}
  88.         
  89.         //! Return the index of the maximum bit of the largest coefficient
  90.         int Max() const {return max_bit;}
  91.         
  92.         //! Return the subband perceptual weight
  93.         double Wt() const {return wgt;}
  94.         
  95.         //! Return the depth of the subband in the transform
  96.         int Depth() const {return dpth;}
  97.         
  98.         //! Return the scale of the subband, viewed as a subsampled version of the picture
  99.         int Scale() const {return (1<<dpth);}
  100.         
  101.         //! Return a quantisation factor
  102.         int Qf(int n) const {return qfac[n];}
  103.         
  104.         //! Return the index of the parent subband
  105.         int Parent() const {return prt;}
  106.         
  107.         //! Return the indices of any child subbands
  108.         std::vector<int> Children() const {return childvec;}
  109.         
  110.         int Child(int n) const {return childvec[n];}
  111.         // ... and sets
  112.         //! Set the perceptual weight
  113.         void SetQf(int n, int q)
  114.         {
  115.             if (n >= qfac.First() && n<=qfac.Last() )
  116.                 qfac[n]=q;
  117.         }
  118.         
  119.         //! Set the perceptual weight
  120.         void SetWt(float w){wgt=w;}
  121.         
  122.         //! Set the parent index
  123.         void SetParent(int p){prt=p;}
  124.         
  125.         //! Set the subband depth
  126.         void SetDepth(int d){dpth=d;}
  127.         
  128.         //! Set the index of the maximum bit of the largest coefficient
  129.         void SetMax(int m){max_bit=m;};
  130.         
  131.         //! Set the indices of the children of the subband
  132.         void SetChildren(std::vector<int>& clist){childvec=clist;}
  133.         
  134.         //! Add a child to the list of child subbands
  135.         void AddChild(int c){childvec.push_back(c);}
  136.     private:
  137.         int xps,yps,xln,yln;        //subband bounds
  138.         double wgt;                    //perceptual weight for quantisation
  139.         int dpth;                    //depth in the transform
  140.         OneDArray<int> qfac;        //quantisers
  141.         int prt;                    //position of parent in a subband list
  142.         std::vector<int> childvec;    //positions of children in the subband list
  143.         int max_bit;                //position of the MSB of the largest absolute value
  144.     };
  145.     //!    A class encapulating all the subbands produced by a transform
  146.     class SubbandList
  147.     {
  148.     public:
  149.         //! Constructor
  150.         SubbandList(){}
  151.         //! Destructor
  152.         ~SubbandList(){}
  153.         //Default (shallow) copy constructor and operator= used
  154.         //! Initialise the list
  155.         void Init(const int depth,const int xlen,const int ylen);
  156.         
  157.         //! Return the length of the subband list    
  158.         int Length() const {return bands.size();}
  159.         
  160.         //! Return the subband at position n (1<=n<=length)
  161.         Subband& operator()(int n){return bands[n-1];}
  162.         
  163.         //! Return the subband at position n (1<=n<=length)    
  164.         const Subband& operator()(int n) const {return bands[n-1];}    
  165.         
  166.         //! Add a band to the list
  167.         void AddBand(Subband& b){bands.push_back(b);}
  168.         
  169.         //! Remove all the bands from the list    
  170.         void Clear(){bands.clear();}
  171.         
  172.     private:    
  173.         std::vector<Subband> bands;
  174.     };
  175.     //! Class to do two-tap prediction lifting step
  176.     template <int gain> class PredictStep
  177.     {
  178.     public:
  179.         //! Constructor
  180.         PredictStep(){}
  181.         // Assume default copy constructor, assignment= and destructor //
  182.         //! Do the filtering
  183.         /*
  184.             Do the filtering.
  185.             param   in_val   the value being predicted
  186.             param   val1   the first value being used for prediction
  187.             param   val2   the second value being used for prediction
  188.         */
  189.         void Filter(ValueType& in_val, const ValueType& val1, const ValueType& val2) const;
  190.     private:
  191.     }; 
  192.     template <int gain>
  193.     inline void  PredictStep<gain>::Filter( ValueType& in_val, 
  194.                                                 const ValueType& val1, 
  195.                                                 const ValueType& val2) const
  196.     {
  197.         in_val -= static_cast< ValueType >( (gain * static_cast< int >( val1 + val2 )) >>12 );
  198.     }
  199.     //! Class to do two-tap updating lifting step
  200.     template <int gain> class UpdateStep
  201.     {
  202.     public:
  203.         //! Constructor
  204.         UpdateStep(){}
  205.         //! Do the filtering
  206.         /*
  207.             Do the filtering.
  208.             param   in_val   the value being updated
  209.             param   val1   the first value being used for updating
  210.             param   val2   the second value being used for updating
  211.         */
  212.         void Filter(ValueType& in_val, const ValueType& val1, const ValueType& val2) const;
  213.     private:
  214.     };  
  215.     template <int gain>
  216.     inline void UpdateStep<gain>::Filter(ValueType& in_val,
  217.                                               const ValueType& val1, 
  218.                                               const ValueType& val2) const
  219.     {
  220.         in_val += static_cast< ValueType >( (gain * static_cast< int >( val1 + val2 )) >>12 );
  221.     }
  222.     //! A class to do wavelet transforms
  223.     /*!
  224.         A class to do forward and backward wavelet transforms by iteratively 
  225.         splitting or merging the lowest frequency band.
  226.     */
  227.     class WaveletTransform
  228.     {
  229.     public:
  230.         //! Constructor
  231.         // WaveletTransform(WaveletTransformParams p);
  232.         WaveletTransform(int d = 4, WltFilter f = DAUB);
  233.             
  234.         //! Destructor
  235.         virtual ~WaveletTransform();
  236.         //! Transforms the data to and from the wavelet domain
  237.         /*!
  238.             Transforms the data to and from the wavelet domain.
  239.             param    d    the direction of the transform
  240.             param    pic_data    the data to be transformed
  241.         */
  242.         void Transform(const Direction d, PicArray& pic_data);
  243.         
  244.         //! Returns the set of subbands
  245.         SubbandList& BandList(){return band_list;}
  246.         
  247.         //! Returns the set of subbands
  248.         const SubbandList& BandList() const {return band_list;}
  249.         
  250.         //! Sets the subband weights
  251.         /*!
  252.             Sets perceptual weights for the subbands. Takes into account both 
  253.             perceptual factors (weight noise less at higher spatial 
  254.             frequencies) and the scaling needed for the wavelet transform. 
  255.             param    cpd    perctual factor - the number of cycles per degree
  256.             param    fsort    the frame sort (I, L1 or L2)
  257.             param    cformat    the chroma format
  258.             param    csort    the component type (Y, U or V)  
  259.         */
  260.         void SetBandWeights (const float cpd, 
  261.                              const FrameSort& fsort,
  262.                              const ChromaFormat& cformat,
  263.                              const CompSort csort);
  264.     private:
  265.         //other private variables    
  266.         // WaveletTransformParams params;
  267.         SubbandList band_list;
  268.         //! Depth of the transform
  269.         int depth;
  270.         
  271.         //! The filter set to be used (only Daubechies supported at present)
  272.         WltFilter filt_sort;    
  273.         //functions
  274.         //!    Private, bodyless copy constructor: class should not be copied
  275.         WaveletTransform(const WaveletTransform& cpy);
  276.         
  277.         //! Private, bodyless copy operator=: class should not be assigned
  278.         WaveletTransform& operator=(const WaveletTransform& rhs);
  279.         //! Given x and y spatial frequencies in cycles per degree, returns a weighting value
  280.         float PerceptualWeight(float xf,float yf,CompSort cs);
  281.         //! Split a subband into 4
  282.         void VHSplit(const int xp, const int yp, const int xl, const int yl, PicArray&pic_data); 
  283.         //! Synthesise a picture from 4 subbands
  284.         void VHSynth(const int xp, const int yp, const int xl, const int yl, PicArray& pic_data);
  285. };
  286. } // namespace dirac
  287. #endif