Dynamic Programming Implementation of Snakes

IUE Objects Used; IUE Objects Modified; Related Code;
	int   l, i, j, k, m, i, min_position, min_final_position
	float min_energy, energy, min_final_energy
	point nextNode , currNode, 
	      snaxel[NUM_SNAXELS], neighbor[NUM_NEIGHBORS]

	/* initialize first column of energy matrix */
	for (l=0;l<NUM_NEIGHBORS;l++) 
		energyMtx[0][l]=0.0;

001	for (i=0;i<NUM_SNAXELS;i++)
002	{
003	    for (j=0;j<NUM_NEIGHBORS;j++) /* for all neighbors of next node */
004	    {
005	        min_energy = BIG
006	        for (k=0;k<NUM_NEIGHBORS;k++) /*for all neighors of curr node*/
		Related Equation in Tutorial
007	        {
008	            nextNode = snaxel[i+1] + neighbor[j] 
009	            currNode = snaxel[i]   + neighbor[k]
010	            energy = energyMtx[i-1][k] + E(currNode, nextNode)
011	            if (energy < min_energy)
012	            {
013	                min_energy = energy
014	                min_position = k
015	            }
016	        }
017	        /* Store minimum energy into table */
018	        energyMtx[i][j] = min_energy
019	        posMtx[i][j] = min_position
020	    }
021	}
022	
023	/* search final column for minimum energy */ 
024	min_final_energy = BIG
025	for (m=0;m<NUM_NEIGHBORS;m++)
026	{
027	    if(energyMtx[n-1][m] < min_final_energy)
028	    {
029	        min_final_energy = energyMtx[n-1][m]
030	        min_final_position = m
031	    }       
032	}
033	pos = min_final_position
034	
035	/* search backwards through table to find optimum postions */
036	for(i=NUM_SNAXELS-1;i>0;i--)
037	{
038	    snaxel[i] = snaxel[i] + neighbor[pos]
039	    pos = posMtx[i-1][pos]
040	}
041	
042	redraw snake