📄 dibapi.cpp
字号:
if(d1>dd)
{
dd=d1;
m=i;
}
}
/* FILE * fp;
if( (fp = fopen( "数据.txt", "w+" )) != NULL)
{
fprintf(fp,"%lf ",dd);
fprintf(fp,"%d ",m);
fclose( fp );
}*/
for(l=0;l<n;l++)
{
Z.Add(image[m*n+l]);
image[m*n+l]=-5;
}
for(l=0;l<n;l++)
{
X1[l]=Z[l];
X2[l]=Z[n+l];
}
dd=k*Distence(X1,X2,n);
bool isfind=true;
while(isfind)
{
isfind=false;
double * Dis;
Dis=new double [width*height];
m=Z.GetSize()/n;
for(i=0;i<width*height;i++)
{
if(image[i*n+1]>0.0)
{
d1=99999999999;
for(j=0;j<m;j++)
{
for(l=0;l<n;l++)X1[l]=Z[j*n+l];
for(l=0;l<n;l++)X2[l]=image[i*n+l];
d2=Distence(X1,X2,n);
if(d1>d2) d1=d2;
}
Dis[i]=d1;
}
else
{
Dis[i]=0.0;
}
}
d1=0;
int ll;
for(i=0;i<width*height;i++)
{
if(Dis[i]>d1)
{
d1=Dis[i];
ll=i;
}
}
delete [] Dis;
if(d1>dd)
{
isfind=true;
for(l=0;l<n;l++)
{
Z.Add(image[ll*n+l]);
image[ll*n+l]=-5;
}
}
}
m=Z.GetSize()/n;
int ll;
for(i=0;i<width*height;i++)
{
d1=999999999999;
for(j=0;j<m;j++)
{
for(l=0;l<n;l++)X1[l]=Z[j*n+l];
for(l=0;l<n;l++)X2[l]=image1[i*n+l];
d2=Distence(X1,X2,n);
if(d2<d1)
{
ll=j+1;
d1=d2;
}
}
Y[i]=ll;
}
delete [] X1;
delete [] X2;
delete [] image1;
}
void WINAPI KMeanClustering(int * image,int *Y,int n,int width,int height)
{
CProgressDlg progdlg;
progdlg.Create();
progdlg.SetPos(0);
progdlg.SetStep(1);
progdlg.SetRange(0,100);
int M=4;
int i,j,l,k,ll,it=0;
char item[100];
double * YN,* Z,* Z1;
for(i=0;i<width*height;i++)Y[i]=0;
YN=new double [M];
for(i=0;i<M;i++)YN[i]=0.0;
Z=new double [M*n];
Z1=new double [M*n];
for(i=0;i<M;i++)
{
for(j=0;j<n;j++)
{
Z[i*n+j]=image[i*n+j];
}
Y[i]=i+1;
YN[i]+=1;
}
double *X1,*X2;
X1=new double [n];
X2=new double [n];
bool ischange=true;
while(ischange)
{
it++;
wsprintf(item,"第%d次迭代,请稍候 ...",it);
progdlg.SetStatus(item);
for(i=0;i<M*n;i++)Z1[i]=Z[i];
ischange=false;
double dd,d1;
for(i=0;i<width*height;i++)
{
for(l=0;l<n;l++)X1[l]=image[i*n+l];
dd=99999999999;
for(j=0;j<M;j++)
{
for(l=0;l<n;l++)X2[l]=Z[j*n+l];
d1=Distence(X1,X2,n);
if(d1!=0.0)
{
if(d1<dd)
{
dd=d1;
k=j;
}
}
}
if(Y[i]==0)
{
for(l=0;l<n;l++)
{
Z[k*n+l]=(Z[k*n+l]*YN[k]+image[i*n+l])/(YN[k]+1);
}
Y[i]=k+1;
YN[k]+=1;
}
else
{
if(Y[i]!=k+1)
{
ll=Y[i];
Y[i]=k+1;
YN[k]+=1;
for(l=0;l<n;l++)
{
Z[k*n+l]=(Z[k*n+l]*(YN[k]-1)+image[i*n+l])/YN[k];
}
YN[ll-1]-=1;
if(YN[ll-1]!=0.0)
{
for(l=0;l<n;l++)Z[(ll-1)*n+l]=(Z[(ll-1)*n+l]*(YN[ll-1]+1)-image[i*n+l])/YN[ll-1];
}
}
}
progdlg.SetPos((int)(((i+1)*100)/(width*height)));
}
dd=0.0;
for(i=0;i<M;i++)
{
for(l=0;l<n;l++)X1[l]=Z[i*n+l];
for(l=0;l<n;l++)X2[l]=Z1[i*n+l];
dd+=Distence(X1,X2,n);
}
if(dd>100)ischange=true;
}
j=0;
for(i=0;i<M;i++)
{
if(YN[i]!=0.0)
{
j+=1;
for(l=0;l<width*height;l++)
{
if(Y[k]==i+1)Y[k]=j;
}
}
}
delete [] X1;
delete [] X2;
delete [] YN;
delete [] Z;
delete [] Z1;
}
void WINAPI IsodataClustering(float * image,int *Y,int n,int width,int height)
{
CProgressDlg progdlg;
progdlg.Create();
progdlg.SetPos(0);
progdlg.SetStep(1);
progdlg.SetRange(0,100);
int i,j,l,k,kk;
//数据的类别标志
for(i=0;i<width*height;i++)Y[i]=0;
/* FILE * fp;
if( (fp = fopen( "数据.txt", "w+" )) != NULL)
{
fprintf(fp,"%d ",dd);
fclose( fp );
}*/
//每次迭代允许合并的类数
int L=3;
//初始聚类数
int C=4;
//一个聚类中的最少样本数
int ON=20;
//循环次数
int I=10;
//分散程度参数
double OS=2.0;
//期望得到的类别数
int K=6;
//合并参数类间距离参数
double OC=40;
//样本数
int cn=200;
double * YN;
YN=new double [cn];
//初始聚类中心
CArray<double,double> Z,Z1;
for(i=0;i<C;i++)
{
for(j=0;j<n;j++)Z1.Add(image[i*n+j]);
}
//开始分类样本 步骤2,3
char item[100];
double *X1,*X2;
X1=new double [n];
X2=new double [n];
for(k=0;k<I;k++)
{
wsprintf(item,"第%d次迭代,请稍候 ...",k+1);
progdlg.SetStatus(item);
for(i=0;i<cn;i++)YN[i]=0.0;
bool isfind=true;
while(isfind)
{
isfind=false;
for(i=0;i<width*height;i++)
{
double dd,d1;
dd=999999999999;
for(j=0;j<C;j++)
{
if(Z1[j*n+1]!=0.0)
{
for(l=0;l<n;l++)X1[l]=image[i*n+l];
for(l=0;l<n;l++)X2[l]=Z1[j*n+l];
d1=Distence(X1,X2,n);
if(d1<dd)
{
dd=d1;
kk=j;
}
}
}
Y[i]=kk+1;
YN[kk]+=1;
}
for(i=0;i<C;i++)
{
if(YN[i]<ON&&YN[i]!=0.0)
{
isfind=true;
YN[i]=0.0;
for(l=0;l<n;l++)Z1[i*n+l]=0.0;
}
}
}
progdlg.SetPos(20);
//更新均值向量 步骤4
for(i=0;i<C;i++)
{
if(YN[i]!=0.0)
{
double * s;
s=new double [n];
for(l=0;l<n;l++)s[l]=0.0;
for(j=0;j<width*height;j++)
{
if(Y[j]==i+1)
{
for(l=0;l<n;l++)s[l]+=image[j*n+l];
}
}
for(l=0;l<n;l++)Z1[i*n+l]=s[l]/YN[i];
delete [] s;
}
}
progdlg.SetPos(25);
//计算样本到中心的平均距离 步骤5
CArray<double,double> D;
for(i=0;i<C;i++)
{
if(YN[i]!=0.0)
{
double s;
s=0.0;
for(j=0;j<width*height;j++)
{
if(Y[j]==i+1)
{
for(l=0;l<n;l++)X1[l]=image[j*n+l];
for(l=0;l<n;l++)X2[l]=Z1[i*n+l];
s+=Distence(X1,X2,n);
}
}
s=s/YN[i];
D.Add(s);
}
else
{
D.Add(0.0);
}
}
progdlg.SetPos(35);
//计算平均距离 步骤6
double Dp=0.0;
for(i=0;i<C;i++)
{
Dp+=YN[i]*D[i];
}
Dp=Dp/(width*height);
//判断 步骤7
bool go11=false;
if(k==I-1)
{
OC=0.0;
go11=true;
}
else if(C<=int(K/2))
{
go11=false;
}
else if(C>=2*K||(k%2)==0)
{
go11=true;
}
progdlg.SetPos(40);
//求标准偏差 步骤8
CArray<double,double> OO;
bool go2=false;
if(!go11)
{
for(i=0;i<C;i++)
{
if(Z1[i*n+1]!=0.0)
{
double * s;
s=new double [n];
for(l=0;l<n;l++)
{
for(j=0;j<width*height;j++)
{
if(Y[j]==i+1)
{
s[l]+=pow((image[j*n+l]-Z1[i*n+l]),2);
}
}
}
for(l=0;l<n;l++)
{
s[l]=sqrt(s[l]/YN[i]);
OO.Add(s[l]);
}
delete [] s;
}
else
{
for(l=0;l<n;l++)OO.Add(0.0);
}
}
progdlg.SetPos(50);
//求具有最大标准偏差的分量 步骤9
CArray<double,double> OOmax;
for(i=0;i<C;i++)
{
double dmax=0.0;
for(l=0;l<n;l++)
{
if(OO[l]>dmax)dmax=OO[l];
}
OOmax.Add(dmax);
}
//判断分裂 步骤 10
for(i=0;i<C;i++)
{
if(OOmax[i]>OS&&(C<=int(K/2)||(D[i]>Dp&&YN[i]>2*(ON+1))))
{
C+=1;
for(l=0;l<n;l++)Z1[i*n+l]+=0.5*OOmax[i];
for(l=0;l<n;l++)Z1.Add(Z1[i*n+l]-0.5*OOmax[i]);
go2=true;
goto loop;
}
}
}
progdlg.SetPos(60);
//求聚类中心的距离 步骤11
loop: if(!go2)
{
double * DD;
DD=new double [C*C];
CArray<double,double> DDD;
for(i=0;i<C-1;i++)
for(j=i+1;j<C;j++)
{
if(Z1[i*n+1]!=0.0&&Z1[j*n+1]!=0.0)
{
for(l=0;l<n;l++)X1[l]=Z1[i*n+l];
for(l=0;l<n;l++)X2[l]=Z1[j*n+l];
DD[i*C+j]=Distence(X1,X2,n);
if(DD[i*C+j]<OC)
{
DDD.Add(DD[i*C+j]);
DDD.Add(i);
DDD.Add(j);
}
}
}
progdlg.SetPos(80);
//合并 步骤12 13
kk=DDD.GetSize();
if(kk!=0)
{
kk=kk/3;
if(kk>L)
{
//排序
for(i=0;i<kk-1;i++)
for(j=i+1;j<kk;j++)
{
if(DDD[j*3]<DDD[i*3])
{
double s[3];
for(l=0;l<3;l++)s[l]=DDD[i*3+l];
for(l=0;l<3;l++)DDD[i*3+l]=DDD[j*3+l];
for(l=0;l<3;l++)DDD[j*3+l]=s[l];
}
}
//合并 j1 to i1
for(i=0;i<L;i++)
{
if(Z1[int(DDD[i*3+1]*n)+1]!=0.0&&Z1[int(DDD[i*3+2]*n)+1]!=0.0)
{
for(l=0;l<n;l++)
{
Z1[int(DDD[i*3+1]*n+l)]=(YN[int(DDD[i*3+1])]*Z1[int(DDD[i*3+1]+l)]+YN[int(DDD[i*3+2])]*Z1[int(DDD[i*3+2]+l)])/(YN[int(DDD[i*3+1])]+YN[int(DDD[i*3+2])]);
}
for(l=0;l<n;l++)Z1[int(DDD[i*3+2]*n+l)]=0.0;
YN[int(DDD[i*3+1])]+=YN[int(DDD[i*3+2])];
YN[int(DDD[i*3+2])]=0.0;
for(l=0;l<width*height;l++)
{
if(Y[l]==(int)DDD[i*3+2])Y[l]=(int)DDD[i*3+1];
}
}
}
}
else
{
//合并 j1 to i1
for(i=0;i<kk;i++)
{
if(Z1[int(DDD[i*3+1]*n)+1]!=0.0&&Z1[int(DDD[i*3+2]*n)+1]!=0.0)
{
for(l=0;l<n;l++)
{
Z1[int(DDD[i*3+1]*n+l)]=(YN[int(DDD[i*3+1])]*Z1[int(DDD[i*3+1]+l)]+YN[int(DDD[i*3+2])]*Z1[int(DDD[i*3+2]+l)])/(YN[int(DDD[i*3+1])]+YN[int(DDD[i*3+2])]);
}
for(l=0;l<n;l++)Z1[int(DDD[i*3+2]*n+l)]=0.0;
YN[int(DDD[i*3+1])]+=YN[int(DDD[i*3+2])];
YN[int(DDD[i*3+2])]=0.0;
for(l=0;l<width*height;l++)
{
if(Y[l]==(int)DDD[i*3+2])Y[l]=(int)DDD[i*3+1];
}
}
}
}
}
}
progdlg.SetPos(100);
}
j=0;
for(i=0;i<C;i++)
{
if(Z1[i*n+1]!=0.0)
{
j+=1;
for(l=0;l<n;l++)Z.Add(Z1[i*n+l]);
for(l=0;l<width*height;l++)
{
if(Y[l]==i+1)Y[i]=j;
}
}
}
delete [] YN;
delete [] X1;
delete [] X2;
}
WORD DIBBitCount(LPSTR lpDIB)
{
if (IS_WIN30_DIB(lpDIB))
return ((LPBITMAPINFOHEADER)lpDIB)->biBitCount;
else
return ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
}
WORD DIBBitCount(HDIB hDIB)
{
LPSTR lpDIB = (LPSTR)GlobalLock(hDIB);
WORD wSize = DIBBitCount(lpDIB);
GlobalUnlock(hDIB);
return wSize;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -