www.pudn.com > wavelet-vc++6.rar > LBG.cpp


// LBG.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "wavelet.h" 
#include "LBG.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLBG dialog 
int N,K;           //K:码字维数,N:码本尺寸 
int W,H;           //图像的宽度和高度 
unsigned char TS0[256][256],YY[32][16];     //TSO数组用于存储训练集 
                                             //YY数组用于存储码本 
unsigned char level=8; 
 
CLBG::CLBG(CWnd* pParent /*=NULL*/) 
	: CDialog(CLBG::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CLBG) 
	m_codebook = 0; 
	m_infile = _T(""); 
	m_outfile = _T(""); 
	m_vector = 0; 
	m_eps = 0.0f; 
	//}}AFX_DATA_INIT 
} 
 
 
void CLBG::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CLBG) 
	DDX_Text(pDX, IDC_CODEBOOK, m_codebook); 
	DDX_Text(pDX, IDC_INFILEEDIT, m_infile); 
	DDX_Text(pDX, IDC_OUTFILEEDIT, m_outfile); 
	DDX_Text(pDX, IDC_VECTOR, m_vector); 
	DDX_Text(pDX, IDC_THRESHOLD, m_eps); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CLBG, CDialog) 
	//{{AFX_MSG_MAP(CLBG) 
	ON_BN_CLICKED(IDC_INFILELOOK, OnInfilelook) 
	ON_BN_CLICKED(IDC_OUTFILELOOK, OnOutfilelook) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLBG message handlers 
 
void CLBG::mainprogram() 
{ 
	unsigned M,j=0,l=0,n=0; 
	long  k=0;             
	unsigned char *TS,*q,*Y,*y,*p;      //定义指针,Y指向码本,TS指向训练集 
    readfile(); 
    M=(unsigned int)(SOI/(long)m_vector);   //m_vector:码字维数 
	TS=&TS0[0][0]; 
	q=&TS0[0][0]; 
	K=m_vector; 
	N=m_codebook; 
	for(k=0;keps) 
	{ 
		for(i=0;i<(unsigned)N;i++) 
		{ 
			if(YN[i]!=0) 
			{ 
				o=core(t,(int*)s,i,m);  //求出各个胞腔的形心,构成新码本 
				t=ts; 
				s=S; 
				vcpy(y,o); 
				y+=K; 
			} 
		} 
	D0=D1; 
	goto aa;  //如果不满足停止条件,转移至工业继续上述过程 
	} 
	if((fpo=fopen(m_outfile,"wb"))==NULL) 
	{ 
		AfxMessageBox("Can't output the file!"); 
		return; 
	} 
	putw(m_codebook,fpo);   //存入码本尺寸 
	putw(m_vector,fpo);     //存入码字维数 
	fputc(level,fpo); 
   //存入码本 
	for(i=0;i<(unsigned int)m_codebook;i++) 
	{ 
		y=Y+i*K; 
		for(int j=0;jz) 
		{ 
			min0=z; 
			r=i; 
		} 
	} 
	if(flag==1) return(min0); 
	else if(flag==0) return(r); 
} 
 
//计算两个向量的距离 
int CLBG::d(unsigned char *x,unsigned char *y) 
{ 
	int sum=0; 
    for(int i=0;i