/** Author: Kanma This heuristic computes the histogram of the region of interest, in grayscale format*/#include <mash/heuristic.h>#include <memory.h>#include <assert.h>usingnamespaceMash;/******************************* HISTOGRAM CLASS ******************************///------------------------------------------------------------------------------// Declaration of a histogram class specialized in grayscale images//------------------------------------------------------------------------------classGrayscaleHistogram{//_____ Construction / Destruction __________public:GrayscaleHistogram(unsignedintnbBins);~GrayscaleHistogram();//_____ Methods __________public:voidcompute(Image*pImage,unsignedintstart_x,unsignedintstart_y,unsignedintwidth,unsignedintheight,boolbClear=true);voidclear();inlineunsignedint*bins(){return_bins;}inlineunsignedintnbBins(){return_nbBins;}//_____ Attributes __________private:unsignedint_nbBins;unsignedint*_bins;unsignedint_lookup[256];};GrayscaleHistogram::GrayscaleHistogram(unsignedintnbBins):_nbBins(nbBins),_bins(0){// Assertionsassert(nbBins>0);_bins=newunsignedint[nbBins];clear();unsignedintbin_size=256/nbBins;for(unsignedinti=0;i<256;++i)_lookup[i]=i/bin_size;}GrayscaleHistogram::~GrayscaleHistogram(){delete[]_bins;}voidGrayscaleHistogram::compute(Image*pImage,unsignedintstart_x,unsignedintstart_y,unsignedintwidth,unsignedintheight,boolbClear){// Assertionsassert(pImage);assert(width>0);assert(height>0);assert(start_x<pImage->width());assert(start_y<pImage->height());assert(width+start_x<=pImage->width());assert(height+start_y<=pImage->height());assert(_nbBins>0);assert(_bins);if(bClear)clear();byte_t**pLines=pImage->grayLines();for(unsignedinty=0;y<height;++y){for(unsignedintx=0;x<width;++x){unsignedintindex=_lookup[pLines[start_y+y][start_x+x]];_bins[index]++;}}}voidGrayscaleHistogram::clear(){// Assertionsassert(_nbBins>0);assert(_bins);memset(_bins,0,_nbBins*sizeof(unsignedint));}/******************************* HEURISTIC CLASS ******************************///------------------------------------------------------------------------------// Declaration of the heuristic class//------------------------------------------------------------------------------classGrayscaleHistogramHeuristic:publicHeuristic{//_____ Construction / Destruction __________public:GrayscaleHistogramHeuristic();virtual~GrayscaleHistogramHeuristic();//_____ Implementation of Heuristic __________public:virtualunsignedintdim();virtualvoidprepareForCoordinates();virtualscalar_tcomputeFeature(unsignedintfeature_index);//_____ Attributes __________protected:GrayscaleHistogram_histogram;};//------------------------------------------------------------------------------// Creation function of the heuristic//------------------------------------------------------------------------------extern"C"Heuristic*new_heuristic(){returnnewGrayscaleHistogramHeuristic();}GrayscaleHistogramHeuristic::GrayscaleHistogramHeuristic():_histogram(256){}GrayscaleHistogramHeuristic::~GrayscaleHistogramHeuristic(){}unsignedintGrayscaleHistogramHeuristic::dim(){return_histogram.nbBins();}voidGrayscaleHistogramHeuristic::prepareForCoordinates(){// Compute the coordinates of the region of interestunsignedintx0=coordinates.x-roi_extent;unsignedinty0=coordinates.y-roi_extent;unsignedintroi_size=roi_extent*2+1;// Compute the histogram_histogram.compute(image,x0,y0,roi_size,roi_size,true);}scalar_tGrayscaleHistogramHeuristic::computeFeature(unsignedintfeature_index){return_histogram.bins()[feature_index];}