www.pudn.com > Snakes.rar > SnakesApp.CPP


#include "stdafx.h" 
#include "dibapi.h" 
#include"SnakesApp.H" 
#include"math.h" 
#include"fstream.h" 
	// this function helps to locate neighboring node in node buffer.  
CSnakes::CSnakes(HDIB m_hDIB) 
{ 
	int numColors,n; 
	hDIB=m_hDIB; 
	LPSTR	lpDIB; 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);	 
	lWidth = ::DIBWidth(lpDIB);		 
	// 获取图像高度 
	lHeight = ::DIBHeight(lpDIB);	 
	//灰度映射表 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);	 
	lpbmi = (LPBITMAPINFO)lpDIB; 
	numColors=0; 
	numColors=lpbmi->bmiHeader.biBitCount/8; 
	// 计算图像每行的字节数 
	lLineBytes = WIDTHBYTES(lWidth * 8*numColors); 
	BYTE *lpSrc; 
	ImageData=new double[lWidth*lHeight]; 
	//fstream of; 
	//of.open("tt.txt",ios::out); 
	for(int i = 0; i255)lp=255; 
			if(lp<0)lp=0; 
			n=j+i*lWidth; 
			ImageData[n]=lp; 
		 
					 
		} 
	} 
 
} 
double CSnakes::squ(double x,double y) 
{ 
	double val=0; 
	val=(double)(x*x+y*y); 
	return val; 
} 
//梯度变换 
void CSnakes::Gradient() 
{ 
	// 指向DIB象素的指针 
	double lpSrc[9]; 
 
	int	i,j,index,k,x,y,n; 
	// 每行 
	double Ix,Iy; 
	double G,MaxG; 
	MaxG=0; 
	fG=new Grad[lHeight*lWidth]; 
	grad_mag=new double[lHeight*lWidth]; 
	for(i = 0; i1) 
		{ 
pDC->MoveTo(p_OldPos); 
		pDC->LineTo(point.x,point.y); 
		 
		p_NumPos++; 
		CString cs; 
		cs.Format("%d",p_NumPos); 
		 
		p=new(Node); 
		p->point=point; 
		p->next=top; 
		top=p; 
 
		pDC->TextOut(100,100,cs); 
		pp=0; 
			p_OldPos=point; 
		} 
		no_of_snake_points=p_NumPos; 
	 
	} 
 
 
} 
void CSnakes::LButtonDown(CPoint point,CDC*pDC) 
{ 
	Is_StartDraw=true; 
} 
void CSnakes::LButtonUp(CPoint point,CDC*pDC) 
{ 
	long num=0; 
	pos=new CPoint[p_NumPos]; 
	while(top!=NULL) 
	{ 
		p=top; 
		pos[num]=p->point;		 
		num++; 
		//pDC->LineTo(p->point.x+100,p->point.y); 
		top=p->next; 
		delete(p); 
	} 
	Is_StartDraw=false; 
} 
void CSnakes::DrawGV(CDC*pDC) 
{ 
		CPoint NewPos[8],pos; 
		int k=0,n,m; 
		double g; 
		double x,y; 
	for(int i = 1; iMoveTo(pos.x*8,pos.y*8);		 
			n=j+i*lWidth; 
			x=pos.x+fG[n].Ix/(fG[n].G+10e-10); 
			y=pos.y+fG[n].Iy/(fG[n].G+10e-10); 
 
			pDC->LineTo(x*8,y*8); 
			pDC->Ellipse(x*8-2,y*8-2,x*8+2,y*8+2); 
		} 
	} 
 
 
} 
void CSnakes::Snake_algorithm() 
{ 
	double avg_distance=0.0, max_curvature; 
    int j,movement,iteration=0;      
	bool flag_change; 
    int Max_Iterations=1; 
	alpha=new double[no_of_snake_points]; 
	beta=new double[no_of_snake_points]; 
	gamma=new double[no_of_snake_points]; 
	curvature=new double[no_of_snake_points]; 
	termination_point=false; 
	neighbor3by3=true; 
	CPoint temp; 
	//初始化参数 
	m_Cols=lWidth; 
	m_Rows=lHeight; 
	Snake_points=pos; 
 
 
	for(int i=0;icurvature[(i+1)%no_of_snake_points]&&curvature[i]>curvature[(i-1+no_of_snake_points)%no_of_snake_points]) 
				*(beta+i)=0; 
		} 
		if(movementMax_Iterations) 
			termination_point=true; 
	} 
	delete alpha; 
	delete beta; 
	delete gamma; 
	delete curvature; 
//Snake_interp(); 
 
 
 
 
} 
void CSnakes::Snake_interp() 
{ 
	int i,k,n; 
	double dis_ptp; 
	dmin=1; 
	dmax=5; 
	n=no_of_snake_points; 
 
	  for(i=0;idmax) 
			{ 
				CPoint *tp;//创建新的临时数组 
				tp=new CPoint[no_of_snake_points+1]; 
				//前面数据的导出 
				for(k=0;k=m_Rows)//判断是否超出图像的范围 
			p.y=m_Rows-1; 
		for(j=-limit;j<=limit;j++) 
		{ 
			p.x=point.x+j; 
			if(p.x<0)//判断是否超出图像的范围 
				p.x=0; 
			if(p.x>=m_Cols) 
				p.x=m_Cols-1; 
			curvatures[i+limit][j+limit]=find_curvature(no, p); //This code can cause problem near 
			continuities[i+limit][j+limit]=find_continuity(no,p,avg_distance);	//border of image 
			internal_energies[i+limit][j+limit]=(double)grad_mag[p.x+p.y*m_Rows]; 
			max_curvature=max(max_curvature,curvatures[i+limit][j+limit]); 
			max_continuity=max(max_continuity,continuities[i+limit][j+limit]); 
            max_internal=max(max_internal,internal_energies[i+limit][j+limit]); 
			min_internal=min(min_internal,internal_energies[i+limit][j+limit]); 
			 
		} 
	} 
	for(i=0;i<=2*limit;i++) 
	{ 
		for(j=0;j<=2*limit;j++) 
		{ 
			curvatures[i][j]=curvatures[i][j]/max_curvature; 
			continuities[i][j]=continuities[i][j]/max_continuity; 
			internal_energies[i][j]=(internal_energies[i][j]-min_internal)/(max_internal-min_internal); 
		} 
	} 
	min_point.x=-limit; 
	min_point.y=-limit; 
	min_energy=1000000000000.0; 
	for(i=-limit;i<=limit;i++) 
	{ 
		for(j=-limit;j<=limit;j++) 
		{ 
			energy=*(alpha+no)*continuities[i+limit][j+limit]+*(beta+no)*curvatures[i+limit][j+limit]-*(gamma+no)*internal_energies[i+limit][j+limit]; 
			if(energy