⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dibapi.cpp

📁 影像融合与融合精度评价源码影像融合与融合精度评价源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -