画像tamuraフィーチャー抽出
5641 ワード
自分はCBIRに興味があり、cbirの重要な一環は特徴抽出です.ここでいいコードを共有します.
ここではまず,特徴に関連するC++クラスをいくつか用いた.
1、BaseFeature
最も根本的なクラスで、今後使用されるすべての特徴クラスが派生(または間接派生)します.
2、VectorFeature類
cbirでは,特徴抽出以降ベクトルとして用いられる.このクラスの直接派生はBaseFeatureと非常に重要なものである.
3、ImageFeature
これはVectorFeatureに派生し、最も広く使われているものです.定義
ここではまず,特徴に関連する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