📄 gsn.h
字号:
/* I/O routines */ int write( char *filename ); CONTOUR *duplicate(CONTOUR *target=NULL, short snx=0); int expand( double ratio, int spacing = 0 ); /* transformation routines */ void affineTransform( double sx, double sy, double rt, double tx, double ty, double idx, double idy ); void rotate( double angle ) { affineTransform( 1, 1, RADIAN(angle), 0, 0, 0, 0 ); } void translate( int dx, int dy ) { affineTransform( 1, 1, 0, dx, dy, 0, 0 ); } void scale( double sx, double sy ) { affineTransform( sx, sy, 0, 0, 0, 0, 0 ); } void dilate(double idx, double idy) { affineTransform(1,1,0,0,0,idx,idy); } /* compute contour shape */ void computeShape(); /* learn shape parameters */ void computeCG(); /* compute center of gravity */ void computeZ() ; /* compute norm. constant Z */ double computeAvgLength(); /* compute average length */ int regenerate(); /* regenerate contour from A */ void contourCentered() ; /* V to U coordinate */ void imageCentered() ; /* U to V coordinate */ /* interface */ void print(); SNAXEL *getHead(void) { return head; } SNAXEL *getTail(void) { return tail; } SNAKEMODE getMode(void) { return mode; } short getNumSnaxel(void) { return numsnaxel; } double getSigNuSqr(void) { return sig_nu_sqr; } double getZ(void) { return Z ; } double getCgRow(void) { return cg_row; } double getCgCol(void) { return cg_col; } void putCgRow(double _row) { cg_row = _row;} void putCgCol(double _col) { cg_col = _col;} void putMode(SNAKEMODE _mode) { mode = _mode; } void putNumSnaxel(short _numsnaxel) {numsnaxel = _numsnaxel; } void putSigNuSqr(double _sig_nu_sqr){ sig_nu_sqr = _sig_nu_sqr; } void putDirection(short _direction){ direction = _direction; } void putZ(double _Z) { Z = _Z ; }};class LOCATIONS { protected : short numpts; /* number of points */ short numlocs; /* number of assigned locations */ double **row; /* possible location to move around */ double **col; double **OldSum;/* for classification purpose */ double **NewSum; double **OldMax; /* Energy minimisation purpose */ double **NewMax; short ***MaxInd; /* for backtracking purpose */ short *MI; double *normalX; /* normal vector */ double *normalY; public : LOCATIONS(void) {;} ~LOCATIONS(void) ; int init(short _numpts, short _numlocs); void clearLoc(); void generateLoc( SNAKEMODE mode, SNAXEL *head, SNAXEL *tail, int NhoodX, int NhoodY, int spacing, int rotate,short verbose =0 ); /* get interface */ short getNumLoc(void) { return numlocs; } double getRow( short i, short j ) { return row[i][j]; } double getCol( short i, short j ) { return col[i][j]; } double getOldSum( short i, short j ) { return OldSum[i][j]; } double getNewSum( short i, short j ) { return NewSum[i][j]; } double getOldMax( short i, short j ) { return OldMax[i][j]; } double getNewMax( short i, short j ) { return NewMax[i][j]; } double getNormalX( short i ) { return normalX[i]; } double getNormalY( short i ) { return normalY[i]; } short getMI( short i ) { return MI[i]; } short getMaxInd( short i, short j, short k ) { return MaxInd[i][j][k]; } /* put interface */ void putRow( short i, short j, double val ) { row[i][j] = val; } void putCol( short i, short j, double val ) { col[i][j] = val; } void putOldSum( short i, short j, double val ) { OldSum[i][j] = val; } void putNewSum( short i, short j, double val ) { NewSum[i][j] = val; } void putOldMax( short i, short j, double val ) { OldMax[i][j] = val; } void putNewMax( short i, short j, double val ) { NewMax[i][j] = val; } void putnormalX( short i, double val ) { normalX[i] = val; } void putnormalY( short i, double val ) { normalY[i] = val; } void putMI( short i, short val ) { MI[i] = val; } void putMaxInd( short i, short j, short k, short val ) { MaxInd[i][j][k] = val; }};class GHOUGH { protected : IMAGE **Planes; /* Planes of accumulator cells */ CONTOUR **Template; /* Templates under transformations */ double **Angle; /* desired gradient angles */ int NumPlane; /* actual # of planes */ int Qx, Qy; /* X, Y resolutions of planes */ double QR; /* scale resolutions */ double Qt; /* theta resolutions */ /* dilation resolutions */ int NR, Nt; /* # of cells in each of the axis */ /* scaling factor */ double THETA; /* initial angle for ref. line angle */ int plane_max; /* store index for blanking */ int row_max; int col_max; protected : int init(int row, int col); void transform(CONTOUR *reference, char comAngleFlag=1); void correlate(EDGE *edgeMap); void correlate(IMAGE *gaussImg); CONTOUR *getMax(void); reset(void) ; public : GHOUGH(int _Qx=1, int _Qy=1, int _NR=5, double _QR=0.25, int _Nt=5, double _Qt=RADIAN(10), double _THETA=0.0); ~GHOUGH(); /* find one contour */ CONTOUR *localize(CONTOUR *reference, IMAGE *img) ; CONTOUR *localize(CONTOUR *reference, EDGE *edgeMap); /* find multiple contours */ CONTOUR **localize(CONTOUR *reference, IMAGE *img, int numFind) ; CONTOUR **localize(CONTOUR *reference, EDGE *edgeMap, int numFind);};class GSNAKE : public PYRAMID, public CONTOUR { protected : double global_lambda; /* global regularization parameters */ double Eint; /* Total internal energy of snake */ double Eext; /* Total external energy of snake */ double Esnake; /* Total snake energy */ EEXTTYPE EextType; /* external energy type */ EDGE *EdgeMap; /* edge map in current pyramid level */ IMAGE *GaussImg; /* gaussImg in current pyramid level */ protected : /* dynamic programming */ int mn_dymprog( short level, int search_spacing, int nhood, unsigned char blowup = 1, int verbose = 0, int showImg = 1, int img_Xoffset = 0, int img_Yoffset = 0); double dymprog(int spacing, LOCATIONS *searchLocs, int classify = 0); void move( GSNAKE *old_gssnake, int pt_Xoffset = 0, int pt_Yoffset = 0); /* regularization. To compute Epoint based on current regularization policy */ void regularize( SNAXEL *sxptr, double *Emodel, double *Eimage, double *Epoint ); double EEdge( SNAXEL *now, EDGE *edgeMap ); double EInten( SNAXEL *now, IMAGE *gaussImg ); double EMag( SNAXEL *now, EDGE *edgeMap ); double ESnaxel( SNAXEL *sxptr, int pt_ind, int loc_ind, int spacing, LOCATIONS *searchLocs, int verbose = 0 ); public : GSNAKE(EEXTTYPE etype = _EDGE, double glambda=_LOCAL_MINMAX); ~GSNAKE(void); void reset(void); /* generate pyramid */ genPyramid(short level, short verbose) ; /* compute energy routines */ double ESnake( short level, int verbose = 0 ); double ESnaxel( SNAXEL *sxptr, BOOLEAN store = FALSE, int verbose = 0 ); double EInternal(SNAXEL *now); double EExternal(SNAXEL *now); /* localize gsnake routines */ int localize(int _Qx=1, int _Qy=1, int _NR=1, double _QR=0.25, int _Nrxy=1, double _Qrxy=0.1, int _Nt=1, double _Qt=RADIAN(10), int _Ndx=1, double _Qdx=0.1, int _Ndy=1, double _Qdy=0.1, double _R=1.0, double _THETA=0.0); void fineLocalize( int _qx = 3, int _qy = 3, int _cg_col = 0, int _cg_row = 0 ); /* minimization routines */ int minimize( int segmentSpacing = 5, int numSearchSegment = 5, int snaxelSpacing = 5, unsigned char blowup = 1, int verbose = 0, double theLambda = _DEFINED_LAMBDA, int showImg = 1, int img_Xoffset = 0, int img_Yoffset = 0 ); /* marginalization routine */ double marginalize(int nhoodTangent=5, int nhoodNormal=3) ; /* interface */ GSNAKE *duplicate(GSNAKE *target=NULL); void deform( unsigned char blowup=1, short expand=1 ); void showLine( unsigned char blowup=1, int Xoffset = 0, int Yoffset = 0 ); void show( unsigned char blowup =1,short expand = 1, int showImg = 1, int img_Xoffset = 0, int img_Yoffset = 0, int pt_Xoffset = 0, int pt_Yoffset = 0 ); double getEint(void) {return Eint;} double getEext(void) {return Eext;} double getEsnake(void) { return Esnake;} EEXTTYPE getEextType( void ) { return EextType; } double getGLambda( void ) { return global_lambda; } void putGLambda(double _lambda) { global_lambda = _lambda; }};class MODEL : public GSNAKE { protected : short deformSample; /* # sample of learn deform */ short shapeSample; /* # sample of learn shape */ protected : int init( GSNAKE *sample ); int initShape( GSNAKE *sample ); int initDeform( GSNAKE * sample ); public : MODEL(void); ~MODEL(void) {;} int LearnShape( GSNAKE *sample ); int LearnDeform( GSNAKE *sample ); GSNAKE *getModel(void) { return this; }};class CLASSIFY { protected : int numClass ; /* number of class */ EEXTTYPE Eexttype ; /* type of external energy */ CONTOUR **templates ; /* reference templates */ char **labels ; double *Margin_Prob; double *Rigid_Match ; double *Deform_Match ; double *Deform_Prob ; /* these localization and minimization parameters are made public so that modifying them can be easy */ public : int Qx, Qy ; /* GHT Image Cell Resolutions */ int NR, Nrxy, Nt, Ndx, Ndy ; /* GHT ranges */ double QR, Qrxy, Qt, Qdx, Qdy; /* GHT Resolutions */ double R, THETA ; /* GHT Constants */ int numSearchSegment ; /* number of search segments */ int segmentSpacing ; /* spacing between segments */ int numLevel ; /* number of pyramid levels */ int verbose ; /* verbose mode */ int nhoodTangent, nhoodNormal; /* neighborhood used in marginaliz-n */ protected : int init(void) ; public : CLASSIFY(EEXTTYPE _Eexttype = _EDGE); ~CLASSIFY(void); int read( CONTOUR *contour ); int read( char *filename ); int classify(IMAGE *testimg, CLASSTYPE ClassType = _MARGIN_PROB) ; int getNumClass( void ) { return numClass ; } double getScore( int template_id, CLASSTYPE ClassType = _MARGIN_PROB); int selectMax( CLASSTYPE ClassType = _MARGIN_PROB); char *getLabel(short class_id) ; void dump(char *imgName, FILE *stream = stdout) ;};#endif#if !defined( _RANDOM_H_ )#define _RANDOM_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -