亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dymprog.c

?? snake算法
?? C
字號(hào):
/*************************************************************************
 File Name  : dymprog.c
 Purpose    : provides enumerative algorithm to compute energies
              for deformable classification or energy minimization
 Release    : Version 1.0
 Date	    : Aug 31,1995

GSNAKE API is jointly developed by the Information Technology Institute (ITI), Singapore, and the School of Applied Science, Nanyang Technological
University (NTU), Singapore. 

These software programs are available to the user without any license or royalty fees. Permission is hereby granted to use, copy, modify, and distribute this software and its documentation for any purpose. ITI and NTU gives no warranty, express, implied, or statuary for the software and/or documentation provided, including, without limitation, waranty of merchantibility and warranty of fitness for a particular purpose. The software provided hereunder is on an "as is"  basis, and ITI and NTU has no obligation to provide maintenance, support, updates, enhancements, or modifications.

GSNAKE API is available for any UNIX compatible system. User feedback, bugs, or software and manual suggestions should be sent via electronic mail to one of the following, who may or may not act on them as he/she desires :

		asschan@ntu.ac.sg
		kflai@iti.gov.sg
************************************************************************/

#include "gsnake.h"
#include "xwindow.h"

/*
 * dynamic programming. Returns NOERROR if successfully performed, MEMORYERROR if otherwise 
 */
int  GSNAKE::mn_dymprog(    short level,	  /* current level */
		            int segmentSpacing,	  /* search spacing */
		            int numSearchSegment, /* search neighborhood */
                            unsigned char blowup, /* blow up ratio */
                            int verbose,	  /* verbose on / off */
			    int showImg,	  /* show image ? */
		            int img_Xoffset,	  /* image offset */
			    int img_Yoffset
			     )
{

	double Jold, Jnew;	/* energy term */
	int numiteration = 1;
	int numcycle;
	int spacing;
	int rotate;
	int numloc;
	int nhoodY;
	short expand;
	GSNAKE *gsnake;
	int pt_Xoffset, pt_Yoffset;
	LOCATIONS searchLocs;
	
	/* use odd number as number of search segments */
	numSearchSegment =  2*((int)numSearchSegment/2) + 1 ;

	/* show gsnake */
	if ( !rawImg )
	{
		printf("\nNo root image in PYRAMID. Unable to minimise.\n");
		return PARAMERROR;
	}
	  
	expand = ROUNDOFF( LEVEL(level) );
	pt_Xoffset = img_Xoffset;
	pt_Yoffset = img_Yoffset;
	
	pt_Xoffset /=  expand ;
        pt_Yoffset /=  expand ; /* removeblowup */
	
	if (showImg)  GSNAKE::show(blowup, expand, showImg, 
			      img_Xoffset, img_Yoffset, 
			      pt_Xoffset, pt_Yoffset); 
			

	if( verbose ) {

		if( global_lambda < 0 )
                    fprintf(stdout, "\n(LOCAL MINMAX) ==>") ;
                else if ( global_lambda  > 1 )
                    fprintf(stdout, "\n(LOCAL LAMBDA's) ==>") ;
                else
                    fprintf(stdout, "\n(LAMBDA = %.3f) ==>",
                                global_lambda) ;
		fprintf(stdout," level : %d\n\n", level );
                fflush(stdout) ;
        }


	/* allocate memory for possible location to move */
	if ( searchLocs.init(numsnaxel, numSearchSegment) == MEMORYERROR ) {
	    fprintf(stderr, 
		"ERROR : <GSNAKE::dymprog> memory allocation error\n");

	    return MEMORYERROR;
	}

	for (numcycle = 1; numcycle <= 3; numcycle++) {

           spacing = (numcycle == 1) ? segmentSpacing : 1 ;
           rotate = (numcycle == 3) ? 1 : 0 ;

           computeAvgLength();

	   /* compute gsnake energy */
	   Jnew = ESnake( level );

	   gsnake = new GSNAKE ;
	   do {

		/* duplicate gsnake */
		duplicate(gsnake);

		/* get all possible location */
		searchLocs.generateLoc( mode, head, tail,
			numSearchSegment/2, 0, spacing, rotate ); 

		/* invoke dynamic programming */
		dymprog(spacing, &searchLocs);

		Jold = Jnew;

		/* compute new energy */
		Jnew = ESnake( level );

		if (showImg)
			GSNAKE::move( gsnake, pt_Xoffset, pt_Yoffset);  
		
                if (verbose ) {
	
                    fprintf(stdout, "  %s",  (!direction) ? " " :
                        ( (direction > 0) ? "+" : "-" ) ) ;
                    fprintf(stdout, "(dp:%d:%d:%d) E = %.5f\n",
                                numcycle, numSearchSegment, numiteration,
                                Jnew);
                    fflush(stdout) ;

		    /* display the new location */

                }

		numiteration ++;

	   } while ( Jnew < Jold );

	   /* copy to original snake */
	   gsnake->duplicate(this);
	   delete gsnake ;
	 
	} /* end for */

	if (showImg) GSNAKE::show(blowup, expand, showImg, img_Xoffset, 
			      img_Yoffset, pt_Xoffset, pt_Yoffset ); 

	if(verbose)
                fprintf(stdout, "  Ext = %.3f, E = %.3f\n",
                        Eext, Esnake) ;

        return NOERROR ;
}

/*
 * main function to invoke dynamic proogramming
 */
double GSNAKE::dymprog( int spacing, 	  	/* desire spacing */
			LOCATIONS *searchLocs,  /* search locations */
		        int marginalize	  	/* classification */
		        )  
{
	double Jnow = 0;	/* current energy */
	double MinPath = 0;	/* minimun energy path */
	double peak = 0;	/* compute peak summation  for 
				   classification purpose */
	double term;
	double path;

	register int i0, i1, i2;
	int index, ind_1, ind_2;
	SNAXEL *prev, *now, *next;

	computeAvgLength();		/* av. length */

	/* set initial value */
	searchLocs->clearLoc();
	
	for (index=0,prev=head; index<numsnaxel-2 ;
		index++, prev=prev->getNext()){

	    ind_1 = (index+1)%(numsnaxel);	/* now */
	    ind_2 = (index+2)%(numsnaxel);	/* next */

	    now = prev->getNext( mode, head );
	    next = now->getNext( mode, head );

	    for (i1=0; i1<searchLocs->getNumLoc(); i1++) {	/* now */

		 now->putCol( searchLocs->getCol( ind_1, i1 ) );
		 now->putRow( searchLocs->getRow( ind_1, i1 ) );

		 for ( i2=0; i2<searchLocs->getNumLoc(); i2++) { /* next */

		    next->putCol( searchLocs->getCol( ind_2, i2 ) );
		    next->putRow( searchLocs->getRow( ind_2, i2 ) );

		    searchLocs->putNewSum( i1, i2, 0 );
		    searchLocs->putNewMax( i1, i2, -VERY_BIG );

		    for (i0=0; i0<searchLocs->getNumLoc(); i0++) { /* prev */

			prev->putCol( searchLocs->getCol( index, i0 ) );
			prev->putRow( searchLocs->getRow( index, i0 ) );

			/* compute energy of current point */
			Jnow = -1*ESnaxel( now, ind_1, i1, spacing, searchLocs);  

			/* if first snaxel, add energy of 1st snaxel */
			if ( index == 0 )
			   Jnow -= ESnaxel( prev, index, i0, spacing, 
			   			searchLocs);

			/* if last snaxel, add energy of last snaxel */
			else if (ind_2 == numsnaxel - 1)
			   Jnow -= ESnaxel(next, ind_2, i2, spacing, 
			   			searchLocs);

			if (marginalize) {
				searchLocs->putNewSum( i1, i2,   
					searchLocs->getNewSum( i1, i2 ) + 
					exp(Jnow/sig_nu_sqr) *
					searchLocs->getOldSum( i0, i1 ) );
			}

			if ( (term = Jnow + searchLocs->getOldMax( i0, i1 )) > 
				searchLocs->getNewMax( i1, i2 ) ) {

				searchLocs->putNewMax( i1, i2, term );
				searchLocs->putMaxInd( index, i1, i2, i0 );
			}

		    } /*i0 */
		} /* i2 */
	    } /* i1 */

	    for ( i1 = 0; i1 < searchLocs->getNumLoc(); i1++ )
		for (i2 = 0; i2 < searchLocs->getNumLoc(); i2++ ) {

		   if ( marginalize ) {
			searchLocs->putOldSum( i1, i2, 
				searchLocs->getNewSum( i1, i2 ) );
		   }

		   searchLocs->putOldMax( i1, i2, 
				searchLocs->getNewMax( i1, i2 ) );
	    }

	} /* end for */

	/* perform backtracking */
	for ( i1 = 0; i1<searchLocs->getNumLoc(); i1++)
	   for ( i2 = 0; i2<searchLocs->getNumLoc(); i2++) {
		peak += searchLocs->getNewSum( i1, i2 );
		if ( (path=exp(searchLocs->getNewMax( i1, i2 ))) > MinPath ) {
			MinPath = path;
			searchLocs->putMI( ind_1, i1 );
			searchLocs->putMI( ind_2, i2 );
		}
	}

	/* look for best path */
	for ( i0 = ind_1 - 1; i0 >= 0; i0-- )
	{
		searchLocs->putMI( i0, 
			searchLocs->getMaxInd( i0, 
				searchLocs->getMI( i0+1 ),
				searchLocs->getMI( i0+2 ) ) );
	}

	/* update snake */
	for (now = head, i0 = 0; now && i0 < numsnaxel;
		now = now->getNext(), i0++ ) {
		now->putCol( searchLocs->getCol(i0, searchLocs->getMI( i0 ) ) );
		now->putRow( searchLocs->getRow(i0, searchLocs->getMI( i0 ) ) );
	}

	return peak;
}

LOCATIONS::~LOCATIONS( void )
{
	register short i0, i1;

	for (i0=0; i0<numpts; i0++)
	   for (i1=0; i1<numlocs; i1++) 

		_iMemFree( MaxInd[i0][i1] );

	for (i0=0; i0<numlocs; i0++) {

	     _iMemFree( OldSum[i0] );
	     _iMemFree( NewSum[i0] );
	     _iMemFree( OldMax[i0] );
	     _iMemFree( NewMax[i0] );

	}

	for (i0=0; i0<numpts; i0++) {

	     _iMemFree( row[i0] );
	     _iMemFree( col[i0] );
	     _iMemFree( MaxInd[i0] );
		
	}
	
	

	_iMemFree( OldSum );
        _iMemFree( NewSum );
        _iMemFree( OldMax );
        _iMemFree( NewMax );
	_iMemFree( row );
        _iMemFree( col );
        _iMemFree( MaxInd );
	_iMemFree( MI ); MI = NULL;
	_iMemFree( normalX ); normalX = NULL;
	_iMemFree( normalY ); normalY = NULL;
}
	

/*
 * generateLoc by linear search algorithm
 */
void  LOCATIONS::generateLoc( SNAKEMODE mode,	/* opened / closed snake */
			     SNAXEL *head,	/* head od snake */
			     SNAXEL *tail,	/* tail of snake */
			     int NhoodX,	/* region(x) to move */
			     int NhoodY,	/* region(y) to move */
			     int spacing,
			     int rotate,
			     short verbose )	/* rotate */
{
	register int i, j, k;
	double len;
	SNAXEL *sxptr;

	/* compute possible location */
	for ( sxptr=head, i=0; sxptr; i++, sxptr = sxptr->getNext() ) {

	   /* get normal vector */
	   sxptr->getNormalVec( mode, head, tail, &normalX[i], &normalY[i] );

	   if (rotate) { /* do not use normal vector */

		double dx = normalX[i];
		double dy = normalY[i];

		/* rotate by 90 degree */

		normalX[i] = -dy;
		normalY[i] = dx;

	   }

	   /* assign the location */
	   for ( j=-NhoodX; j<=NhoodX; j++)
	      for (k=-NhoodY; k<=NhoodY; k++) {

		int index = (j+NhoodX)*(2*NhoodY+1) + (k+NhoodY);
		row[i][index] = sxptr->getRow() + 
			spacing * (j*normalY[i]-k*normalX[i]);
		col[i][index] = sxptr->getCol() + 
			spacing * (j*normalX[i]+k*normalY[i]);

		if (verbose)
			xwin_DrawPoint(ROUNDOFF(row[i][index]), 
				ROUNDOFF( col[i][index] )); 
	   }

	}
}

/* 
 * allocate memory for  dynamic programming parameters
 */
int LOCATIONS::init( short _numpts, short _numlocs)
{
	register short i0, i1;

	/* get parameters */
	numpts = _numpts;
	numlocs= _numlocs;

	row = (double **) _iMemAlloc( numpts*sizeof(double *) );
	col = (double **) _iMemAlloc( numpts*sizeof(double *) );

	OldSum = (double **) _iMemAlloc( numlocs*sizeof(double *) );
	NewSum = (double **) _iMemAlloc( numlocs*sizeof(double *) );

	OldMax = (double **) _iMemAlloc( numlocs*sizeof(double *) );
	NewMax = (double **) _iMemAlloc( numlocs*sizeof(double *) );

	MaxInd = (short ***) _iMemAlloc( numpts*sizeof(short **) );
	MI = (short *) _iMemAlloc( numpts*sizeof(short) );

	normalX = (double *) _iMemAlloc( numpts*sizeof(double) );
	normalY = (double *) _iMemAlloc( numpts*sizeof(double) );

	if ( !row || !col || !OldSum || !NewSum || !OldMax || 
	     !NewMax || !MaxInd || !MI || !normalX || !normalY )

	     return MEMORYERROR;

	for (i0=0; i0<numlocs; i0++) {

	     OldSum[i0] = (double *) _iMemAlloc(numlocs*sizeof(double));
	     NewSum[i0] = (double *) _iMemAlloc(numlocs*sizeof(double));
	     OldMax[i0] = (double *) _iMemAlloc(numlocs*sizeof(double));
	     NewMax[i0] = (double *) _iMemAlloc(numlocs*sizeof(double));

	     if ( !OldSum[i0] || !NewSum[i0] || 
		!OldMax[i0] || !NewMax[i0] )

	     	return MEMORYERROR;

	}

	for (i0=0; i0<numpts; i0++) {

	     row[i0] = (double *) _iMemAlloc(numlocs*sizeof(double));
	     col[i0] = (double *) _iMemAlloc(numlocs*sizeof(double));
	     MaxInd[i0] = (short **)_iMemAlloc(numlocs*sizeof(short *));
		
	     if ( !row[i0] || !col[i0] || !MaxInd[i0] )

	     	return MEMORYERROR;
	}
	
	for (i0=0; i0<numpts; i0++)
	   for (i1=0; i1<numlocs; i1++) {

		MaxInd[i0][i1] = (short *) _iMemAlloc(numlocs*sizeof(short));

		if ( !MaxInd[i0][i1] )
		     return MEMORYERROR;
	}

	return NOERROR;
}

void LOCATIONS::clearLoc()
{
	register short i0, i1;

	for (i0=0; i0<numlocs; i0++)
	   for (i1=0; i1<numlocs; i1++) {

		OldMax[i0][i1] = 0;
		OldSum[i0][i1] = 1;
		NewMax[i0][i1] = 0;
		NewSum[i0][i1] = 0;

	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品一区二区久久| 91丨九色porny丨蝌蚪| 日韩免费观看2025年上映的电影| 五月天中文字幕一区二区| 日本韩国欧美三级| 亚洲国产精品影院| 日韩一区二区三区四区五区六区| 久久99蜜桃精品| 久久夜色精品国产噜噜av| 国产精品一区久久久久| 中文字幕在线播放不卡一区| 91免费视频网址| 五月激情六月综合| www欧美成人18+| 成人激情免费电影网址| 亚洲欧美一区二区三区国产精品 | 国产欧美一区二区在线| 丁香婷婷综合激情五月色| 亚洲色图另类专区| 欧美一区二区视频观看视频| 久久不见久久见免费视频7| 国产欧美一区二区精品仙草咪| 99视频一区二区三区| 午夜一区二区三区视频| 久久亚洲影视婷婷| 91行情网站电视在线观看高清版| 视频一区免费在线观看| 欧美国产精品一区二区三区| 欧美视频在线观看一区二区| 久久电影网站中文字幕| 亚洲欧美一区二区三区极速播放| 日韩一区二区免费高清| jlzzjlzz欧美大全| 蜜臀a∨国产成人精品| 亚洲色欲色欲www| 日韩视频在线你懂得| gogogo免费视频观看亚洲一| 免费欧美在线视频| 亚洲蜜臀av乱码久久精品| 日韩免费福利电影在线观看| 99国产欧美久久久精品| 久久国产精品无码网站| 一区二区三区四区在线| 久久久美女毛片| 欧美日韩美少妇| 91在线码无精品| 另类欧美日韩国产在线| 一二三区精品福利视频| 国产欧美1区2区3区| 欧美一级片在线看| 欧美特级限制片免费在线观看| 国产成人免费视频| 免费成人在线视频观看| 亚洲美女屁股眼交3| 欧美激情综合网| 精品国产一区a| 日韩午夜电影在线观看| 日韩午夜中文字幕| 欧美日韩国产片| 欧美午夜精品一区二区三区| 懂色av一区二区三区蜜臀| 国产一区二区三区在线观看免费| 视频一区在线视频| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品毛片高清在线完整版| 久久影院午夜论| 欧美成人乱码一区二区三区| 91精品国产综合久久精品app | 欧美亚男人的天堂| 在线亚洲人成电影网站色www| 成人性视频免费网站| 国产精品影音先锋| 国产福利精品一区| 国产一区二区福利视频| 韩日av一区二区| 国产做a爰片久久毛片| 精品无人区卡一卡二卡三乱码免费卡| 日日夜夜免费精品| 日韩中文字幕亚洲一区二区va在线 | 日韩精品一二三| 日韩精品电影在线| 日韩国产欧美一区二区三区| 亚洲国产人成综合网站| 午夜一区二区三区在线观看| 亚洲成人在线观看视频| 天天亚洲美女在线视频| 日韩中文字幕区一区有砖一区| 日韩精品免费专区| 日本三级亚洲精品| 国产一区二区三区免费| 国产精品中文字幕日韩精品| 国产成人免费在线视频| 成人av在线资源| 色一情一伦一子一伦一区| 欧美在线观看一二区| 欧美精品v日韩精品v韩国精品v| 欧美高清性hdvideosex| 欧美大片拔萝卜| 中文字幕成人网| 亚洲欧美日韩久久| 天天av天天翘天天综合网| 久久99精品国产.久久久久久| 国产一区二区h| 91看片淫黄大片一级在线观看| 欧美亚洲一区二区在线| 欧美一区二区三区四区久久| 久久久久久久久久久久久久久99| 亚洲国产精品黑人久久久| 一区二区三区日韩欧美精品 | 中文字幕欧美一| 午夜国产精品影院在线观看| 精品影院一区二区久久久| 国产不卡高清在线观看视频| 丰满少妇久久久久久久| 日本精品一级二级| 日韩精品一区二区三区视频播放 | 一区二区三区在线不卡| 天堂va蜜桃一区二区三区| 国产激情91久久精品导航| 日本韩国欧美一区| 久久久精品欧美丰满| 亚洲制服欧美中文字幕中文字幕| 麻豆91在线播放免费| 97精品电影院| wwww国产精品欧美| 亚洲一区二区三区在线| 风间由美一区二区av101| 3d动漫精品啪啪一区二区竹菊| 中文一区一区三区高中清不卡| 午夜精品国产更新| 99久久精品免费精品国产| 欧美一级午夜免费电影| 亚洲欧美日韩在线| 国产成人av电影在线观看| 欧美精品一卡二卡| 亚洲男女一区二区三区| 国产成人午夜精品影院观看视频| 欧美人妖巨大在线| 亚洲私人黄色宅男| 国产成人一级电影| 精品久久久久久综合日本欧美| 亚洲一区二区五区| av亚洲精华国产精华精华| 久久久亚洲午夜电影| 婷婷六月综合网| 在线亚洲欧美专区二区| 中文字幕一区二区三区视频| 狠狠色综合色综合网络| 69av一区二区三区| 亚洲永久精品大片| 色狠狠一区二区| 日韩一区中文字幕| 99麻豆久久久国产精品免费优播| 日韩一区二区三区在线| 五月婷婷欧美视频| 欧美日韩精品一区二区三区四区| 亚洲视频在线观看三级| 白白色 亚洲乱淫| 国产精品美女久久久久aⅴ| 国产寡妇亲子伦一区二区| 欧美成人女星排行榜| 九一九一国产精品| 日韩精品在线一区| 久久99精品久久久| 精品国产伦一区二区三区观看体验| 亚洲成a人片在线不卡一二三区| 97国产精品videossex| 自拍偷拍国产精品| 99久久99精品久久久久久| 亚洲欧洲日产国码二区| 成人性生交大合| 综合欧美亚洲日本| 欧美中文字幕不卡| 日韩激情av在线| 欧美大片在线观看一区| 精品一区二区三区欧美| 久久这里都是精品| 大尺度一区二区| 亚洲欧美一区二区三区久本道91 | 日韩一级完整毛片| 麻豆精品视频在线观看| 欧美不卡一区二区三区四区| 国产一区二区免费看| 国产精品毛片大码女人| 色一情一伦一子一伦一区| 亚洲大型综合色站| 欧美一级免费大片| 国产精品18久久久久久久网站| 国产欧美精品一区二区色综合 | 欧美电影一区二区| 麻豆精品精品国产自在97香蕉 | 欧美大白屁股肥臀xxxxxx| 国产激情精品久久久第一区二区| 国产精品国产三级国产aⅴ无密码| 色综合视频在线观看| 五月天欧美精品| 久久亚洲综合av| 91搞黄在线观看| 免费久久99精品国产| 国产喂奶挤奶一区二区三区|