123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /**
- * @file FastFilter.cpp
- * @brief color gradient
- * @author Erik Rodner
- * @date 07/22/2008
- */
- #include <iostream>
- #include <math.h>
- #include "core/basics/FastMath.h"
- #include "FastFilter.h"
- using namespace std;
- using namespace NICE;
- using namespace OBJREC;
- /** global lookup tables */
- template <class SrcValueType, class DstValueType>
- void FastFilter::calcGradientX ( const SrcValueType *img, int xsize, int ysize, DstValueType *d )
- {
- int k = 0;
- for ( int y = 0 ; y < ysize ; y++ )
- {
- d[k] = 0.0;
- k++;
- for ( int x = 1 ; x < xsize-1 ; x++,k++ )
- d[k] = - img[k-1] + img[k+1];
- d[k] = 0.0;
- k++;
- }
- }
- template <class SrcValueType, class DstValueType>
- void FastFilter::calcGradientY ( const SrcValueType *img, int xsize, int ysize, DstValueType *d )
- {
- int k = xsize;
- for ( int x = 0 ; x < xsize ; x++ )
- d[x] = 0.0;
- for ( int x = 0 ; x < xsize ; x++ )
- d[x+xsize*(ysize-1)] = 0.0;
- for ( int y = 1 ; y < ysize-1; y++ )
- for ( int x = 0 ; x < xsize ; x++,k++ )
- d[k] = - img[k-xsize] + img[k+xsize];
- }
- template <class GrayValueType, class GradientMagnitudeType, class GradientDirectionType>
- void FastFilter::calcColorGradient (
- const GrayValueType *r,
- const GrayValueType *g,
- const GrayValueType *b,
- int xsize, int ysize,
- GradientMagnitudeType *gradient,
- GradientDirectionType *dir,
- int numBins,
- bool usesigned )
- {
- double *atan2Table = FastMath::getSingleton().atan2Table;
- double *sqrtTable = FastMath::getSingleton().sqrtTable;
- double *rgx = new double[xsize*ysize];
- calcGradientX ( r, xsize, ysize, rgx );
- double *rgy = new double[xsize*ysize];
- calcGradientY ( r, xsize, ysize, rgy );
- double *ggx = new double[xsize*ysize];
- calcGradientX ( g, xsize, ysize, ggx );
- double *ggy = new double[xsize*ysize];
- calcGradientY ( g, xsize, ysize, ggy );
- double *bgx = new double[xsize*ysize];
- calcGradientX ( b, xsize, ysize, bgx );
- double *bgy = new double[xsize*ysize];
- calcGradientY ( b, xsize, ysize, bgy );
- double binq = usesigned ? 2*M_PI / numBins : M_PI / numBins;
- int k = 0;
- for ( int y = 0 ; y < ysize ; y++ )
- for ( int x = 0 ; x < xsize ; x++,k++ )
- {
- double rx = rgx[k];
- double ry = rgy[k];
- //GradientMagnitudeType g = (GradientMagnitudeType)sqrt ( rx*rx + ry*ry );
- GradientMagnitudeType g = (GradientMagnitudeType)sqrtTable [ (int)(rx*rx + ry*ry) ];
- double max = g;
- double mrx = rx;
- double mry = ry;
- rx = ggx[k];
- ry = ggy[k];
- g = sqrt ( rx*rx + ry*ry );
- if ( g > max ) { max = g; mrx = rx ; mry = ry; };
- rx = bgx[k];
- ry = bgy[k];
- g = sqrt ( rx*rx + ry*ry );
- if ( g > max ) { max = g; mrx = rx ; mry = ry; };
- gradient[k] = max;
- int a_index = ((int)ry+255)*(255*2+1) + ((int)rx+255);
- double angle = atan2Table[ a_index ];
- if ( usesigned ) {
- if ( angle < 0 )
- angle = 2*M_PI + angle;
- } else {
- if ( angle < 0 )
- angle = M_PI + angle;
- }
- GradientDirectionType bin = (GradientDirectionType)(angle / binq);
- dir[k] = bin < numBins ? bin : numBins - 1;
- }
- delete [] rgx;
- delete [] rgy;
- delete [] ggx;
- delete [] ggy;
- delete [] bgx;
- delete [] bgy;
- }
- template <class GrayValueType, class GradientMagnitudeType, class GradientDirectionType>
- void FastFilter::calcGradient ( const GrayValueType *gray,
- int xsize, int ysize,
- GradientMagnitudeType *gradient,
- GradientDirectionType *dir,
- int numBins,
- bool usesigned )
- {
- double *gx = new double[xsize*ysize];
- calcGradientX ( gray, xsize, ysize, gx );
- double *gy = new double[xsize*ysize];
- calcGradientY ( gray, xsize, ysize, gy );
- double *atan2Table = FastMath::getSingleton().atan2Table;
- double *sqrtTable = FastMath::getSingleton().sqrtTable;
- double binq = usesigned ? 2*M_PI / numBins : M_PI / numBins;
- int k = 0;
- for ( int y = 0 ; y < ysize ; y++ )
- for ( int x = 0 ; x < xsize ; x++,k++ )
- {
- double rx = gx[k];
- double ry = gy[k];
- //GradientMagnitudeType g = (GradientMagnitudeType)sqrt ( rx*rx + ry*ry );
- GradientMagnitudeType g = (GradientMagnitudeType)sqrtTable [ (int)(rx*rx + ry*ry) ];
- gradient[k] = g;
- int a_index = ((int)ry+255)*(255*2+1) + ((int)rx+255);
- double angle = atan2Table[ a_index ];
- if ( usesigned ) {
- if ( angle < 0 )
- angle = 2*M_PI + angle;
- } else {
- if ( angle < 0 )
- angle = M_PI + angle;
- }
- GradientDirectionType bin = (GradientDirectionType)(angle / binq);
- dir[k] = bin < numBins ? bin : numBins - 1;
- }
- delete [] gx;
- delete [] gy;
- }
|