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