画像tamuraフィーチャー抽出

5641 ワード

自分はCBIRに興味があり、cbirの重要な一環は特徴抽出です.ここでいいコードを共有します.
ここではまず,特徴に関連するC++クラスをいくつか用いた.
1、BaseFeature
最も根本的なクラスで、今後使用されるすべての特徴クラスが派生(または間接派生)します.
class BaseFeature {
protected:
  FeatureType type_;

public:
  
  BaseFeature() :type_(FT_BASE) {}

  virtual ~BaseFeature() {}
  virtual BaseFeature *clone() const=0;
  const FeatureType& type() const { return type_;}
  FeatureType& type() { return type_;}
  virtual bool load(const ::std::string &filename);
  virtual void save(const ::std::string &filename);  
  virtual bool read(::std:: istream & is)=0;  
  virtual bool readBinary(::std:: istream &){ERR << "Not supported for this featuretype." <<::std::endl return="" true="" change="" virtual="" void="" write="" os="" writebinary="" supported="" for="" this="" featuretype.="" const="" unsigned="" long="" int="" calcbinarysize="" basefeature="" operator-="(const" err="" implemented="" std::endl="" is="" necessary="" da="" factory="" template="" t="">
  static BaseFeature* create() {
    return new T();
  }

};

2、VectorFeature類
cbirでは,特徴抽出以降ベクトルとして用いられる.このクラスの直接派生はBaseFeatureと非常に重要なものである.
class VectorFeature : public BaseFeature {
protected:
  ::std::vector data_;
public:
  VectorFeature() : data_() {type_=FT_VEC;}
  VectorFeature(uint size) : data_(size) {type_=FT_VEC;}
  VectorFeature(const ::std::vector &in) : data_(in) {type_=FT_VEC;}
  virtual VectorFeature* clone() const {
    return new VectorFeature(*this);
  }

  virtual ~VectorFeature() {}
  VectorFeature operator-(const VectorFeature &v ) const;
  VectorFeature & operator-=(const VectorFeature &v );

  virtual bool read(::std:: istream & is);
  virtual bool readBinary(::std:: istream & is);
  virtual void write(::std::ostream & os);
  virtual void writeBinary(::std::ostream & os);

  virtual double operator[](uint idx) const {  return data_[idx];}
  virtual double& operator[](uint idx) {  return data_[idx];}

  virtual const uint size() const;
  virtual const unsigned long int calcBinarySize() const;

  virtual ::std::vector & data() {return data_;}
  virtual const ::std::vector & data() const {return data_;}

};

3、ImageFeature
これはVectorFeatureに派生し、最も広く使われているものです.定義
class ImageFeature : public VectorFeature {
protected:
  uint xsize_, ysize_, zsize_;

  ::std::vector< ::std::vector > data_;


#ifdef HAVE_IMAGE_MAGICK
  /// convert the image to the data structure used by image
  /// magick. This is needed for saving and displaying of images.
  Magick::Image makeMagickImage(const uint &idx1=0, const uint &idx2=1, const uint& idx3=2) const;
#else
#warning "no makeMagickImage without ImageMagick"
#endif

public:

  /*------------------------------------------------------------
    Constructor/Destructor
    ------------------------------------------------------------*/

  /// do nothing constructor
  ImageFeature();

  ImageFeature(uint xsize, uint ysize,uint zsize);

  ImageFeature(const ::std::vector &vec, uint x, uint y, uint z=1) {
    xsize_=x;
    ysize_=y;
    zsize_=z;
    data_.resize(z);
    for(uint c=0;c& pixels);
  virtual void display(const uint& idx1=0, const uint& idx2=1, const uint& idx3=2) const;

  /*------------------------------------------------------------
    Access to the data
    ------------------------------------------------------------*/
  virtual const uint size() const {  return xsize_*ysize_*zsize_;}
  virtual const unsigned long int calcBinarySize() const;
  virtual const uint xsize() const {  return xsize_;}
  virtual const uint ysize() const {  return ysize_;}
  virtual const uint zsize() const {  return zsize_;}
  virtual double operator[](uint idx) const {  return data_[idx%zsize_][idx/zsize_];}
  virtual double& operator[](const uint idx) {  return data_[idx%zsize_][idx/zsize_];} 
  virtual const ::std::vector operator()(uint x, uint y) const;  
  virtual double& operator()(uint x, uint y, uint c) {  return data_[c][y*xsize_+x];}  
  virtual const double& operator()(uint x, uint y, uint c) const {  return data_[c][y*xsize_+x];} 
  virtual void append(const ImageFeature& img);
  
  virtual const ImageFeature layer(const uint i) const;
  HSVPixel hsvPixel(int x, int y);
  ::std::string& filename() {return filename_;}
  const ::std::string& filename() const {return filename_;}

  virtual ::std::vector layerVector(const uint i) const {return data_[i];}
  virtual void resize(const uint width, const uint height, const uint depth) {
    xsize_=width; ysize_=height; zsize_=depth;
    data_.resize(zsize_);
    for(uint c=0;c