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