www.pudn.com > backmode824.rar > KCluster.cpp


// KCluster.cpp: implementation of the CKCluster class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "backmodel.h" 
#include "KCluster.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CKCluster::CKCluster() 
{ 
 
} 
 
CKCluster::~CKCluster() 
{ 
 
} 
void  CKCluster::InitData( LPBITMAPINFOHEADER lpMapHeader, 
	  	                   LPBYTE lpImage,LPBYTE lpDMap, 
			 		       LPBYTE lpHMap,LPBYTE lpSMap ) 
{ 
	m_lpMapHeader=lpMapHeader;m_lpImage=lpImage; 
	m_lpDMap=lpDMap;m_lpHMap=lpHMap;m_lpSMap=lpSMap; 
	return; 
} 
/************************************************ 
 *  函数:KClusterHS() 
 *  参数: 
 *  double  *lpMeanValue //聚类中心指针 
 *  int     ClusterNum   //聚类中心数量						   
 *  int     IterativeNum //聚类迭代次数 
 *  double  error        //聚类中心值变化允许偏差 
 *  返回值: TRUE  or FALSE 
 *************************************************/ 
BOOL CKCluster::KClusterHS( 
						  double  *lpMeanValue, 
						  int     ClusterNum,						   
						  int     IterativeNum, 
						  double  error 
						  ) 
{ 
	int w,h,w1,h1; 
 
    w=m_lpMapHeader->biWidth; 
	h=m_lpMapHeader->biHeight; 
	w1=w;//-MARGIN 
	h1=h;//-MARGIN; 
	if(!m_lpSMap||!m_lpHMap||!m_lpDMap||!lpMeanValue) 
	return FALSE; 
	if(ClusterNum<1)        return FALSE; 
	if((ClusterNum<=0)||(ClusterNum>255)) 
	{ 
		AfxMessageBox("聚类类数在1-255之间。",MB_OK,NULL); 
		return FALSE; 
	} 
	 
	double *lpPreMeanValue; 
	long   *lpKAreaNum; 
	LPBYTE lpr,lpg,lpb;; 
	lpPreMeanValue=(double* )malloc(ClusterNum*2*sizeof(double)); 
	if(!lpPreMeanValue)   	return FALSE; 
	lpKAreaNum=(long* )malloc(ClusterNum*sizeof(long)); 
    if(!lpKAreaNum) 
	{	free(lpPreMeanValue);return FALSE;} 
	lpb=(LPBYTE)malloc(ClusterNum*sizeof(BYTE)*3); 
    if(!lpb) 
	{	free(lpKAreaNum); 
	    free(lpPreMeanValue); 
		return FALSE;} 
	lpg=(LPBYTE)((DWORD)lpb+ClusterNum); 
	lpr=(LPBYTE)((DWORD)lpg+ClusterNum); 
 
	long   i,j,k,l; 
	double data[2]; 
	double MinDiff,f,f1; 
	int    Index,nflag; 
	bool   bContinue; 
 
	for(i=0;if) 
				{ 
					MinDiff=f;Index=l;; 
				} 
			} 
			 
			*(m_lpDMap+(j*w+i)*BITS)=*(lpb+Index); 
			*(m_lpDMap+(j*w+i)*BITS+1)=*(lpg+Index); 
			*(m_lpDMap+(j*w+i)*BITS+2)=*(lpr+Index); 
			lpKAreaNum[Index]++;			 
			*(lpPreMeanValue+Index*2)+=data[0]; 
			*(lpPreMeanValue+Index*2+1)+=data[1]; 
		} 
 
		nflag=0; 
		for(i=0;ibiWidth; 
	h=m_lpMapHeader->biHeight; 
	w1=w;//-MARGIN 
	h1=h;//-MARGIN 
	if(!m_lpSMap||!m_lpHMap||!m_lpDMap||!lpMeanValue) 
	return FALSE; 
	if(ClusterNum<1)        return FALSE; 
	if((ClusterNum<=0)||(ClusterNum>255)) 
	{ 
		AfxMessageBox("聚类类数在1-255之间。",MB_OK,NULL); 
		return FALSE; 
	} 
	 
	double *lpPreMeanValue; 
	long   *lpKAreaNum; 
	LPBYTE lpr,lpg,lpb; 
 
	//分配存储空间 
	lpPreMeanValue=(double* )malloc(ClusterNum*3*sizeof(double)); 
	if(!lpPreMeanValue)   	return FALSE; 
	lpKAreaNum=(long* )malloc(ClusterNum*sizeof(long)); 
    if(!lpKAreaNum) 
	{	free(lpPreMeanValue);return FALSE;} 
	lpb=(LPBYTE)malloc(ClusterNum*sizeof(BYTE)*3); 
    if(!lpb) 
	{	free(lpKAreaNum); 
	    free(lpPreMeanValue); 
		return FALSE;} 
	lpg=(LPBYTE)((DWORD)lpb+ClusterNum); 
	lpr=(LPBYTE)((DWORD)lpg+ClusterNum); 
 
	long   i,j,k,l; 
	double data[3]; 
	double MinDiff,f,f1,f2; 
	int    Index,nflag; 
	bool   bContinue; 
	//初始化各类的颜色表 
	for(i=0;if) 
				{ 
					MinDiff=f;Index=l;; 
				} 
			} 
			//目标图上该点上色 
			*(m_lpDMap+(j*w+i)*BITS)=*(lpb+Index); 
			*(m_lpDMap+(j*w+i)*BITS+1)=*(lpg+Index); 
			*(m_lpDMap+(j*w+i)*BITS+2)=*(lpr+Index); 
			lpKAreaNum[Index]++;//距离最近类数量增一			 
			//计算各类数据和 
			*(lpPreMeanValue+Index*3)+=data[0]; 
			*(lpPreMeanValue+Index*3+1)+=data[1]; 
			*(lpPreMeanValue+Index*3+2)+=data[2]; 
		} 
 
		nflag=0; 
		//更新类中心 
		for(i=0;i