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

📄 dib.cpp

📁 geomorphological remote sensing classification by matlab from CUP
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{*p=N[i][j];p++;}
return true;
}			

bool CDib::ConvertToDctvalue()
{	
	DWORD size = m_dwDibSize - (m_pDibBits - m_pDib);
	int x,y,i,j,u,v;int N=8;  int temp=0;
    int Len,Wid;	unsigned char *p;
	double **M,a,b;
	Wid=m_pBIH->biWidth;    	
	Len = m_pBIH->biHeight;
	Wid=(Wid%8==0)?Wid:(Wid-Wid%8+8); Len=(Len%8==0)?Len:(Len-Len%8+8);
	CSize sizeDib;
	sizeDib.cx = (Wid%8==0)?Wid:(Wid-Wid%8+8);
	//Wid=sizeDib.cx;
	M=new double *[Len];
	for(x=0;x<Len;x++){M[x]=new double [Wid];}
	double **H;
    H=new double *[Len];
	for(x=0;x<Len;x++){H[x]=new double [Wid];}
	int lei[16][2000];
	for (i = 0; i <16;i++)
	{
		for(j=0; j<2000;j++)
		{
		 lei[i][j]=0;
		}
	}
	p = m_pDibBits;
   	for (i = 0; i <Len;i++)
	{
    	for(j=0; j<Wid;j++)
		{
		 M[i][j]=p[(i)*sizeDib.cx+j];
		 //M[i][j]=*p;
		 H[i][j]=0;     //p++;
		}
	}	
//    char   s[] = "基频";
	char   c = '\n'; stream = fopen( "word.txt", "w" );
    //	AfxMessageBox("Enter!");
	for(i=0;i<Len/N;i++){
		for(j=0;j<Wid/N;j++){
			for(u=0;u<N;u++){
				for(v=0;v<N;v++){
					for(x=0;x<N;x++){
						for(y=0;y<N;y++)
						{ 
						  if(u==0)a=sqrt((double)1/N);else a=sqrt((double)2/N);
                          if(v==0)b=sqrt((double)1/N);else b=sqrt((double)2/N);
						  H[u+i*N][v+j*N]=H[u+i*N][v+j*N]+a*b*M[x+i*N][y+j*N]*cos((2*x+1)*u*pi/(2*N))*cos((2*y+1)*v*pi/(2*N));
						
						}//for y
					}//for x
				H[u+i*N][v+j*N]=int(H[u+i*N][v+j*N]/10.0);
				if(u==0&&v==0)
				{ //基频差分编码  
					lei[0][0]++;
					lei[0][lei[0][0]]=int(H[u+i*N][v+j*N]); 
					//fprintf( stream, "%d: %d %d \n",i, lei[0][0],lei[0][lei[0][0]]);
				 	if(lei[0][0]>1)
					{
					 if(lei[0][0]==2){    temp=lei[0][2]; lei[0][2]=lei[0][2]-lei[0][1];  } 
					 if(lei[0][0]>2)
					 {
					 lei[0][lei[0][0]]=lei[0][lei[0][0]]-(temp); temp+=lei[0][lei[0][0]];
					 //lei[0][lei[0][0]]=(lei[0][lei[0][0]]/20)*20;  //量化率可变
					 }//else 
					} 
				//	fprintf( stream, "%d %d \n", lei[0][0],lei[0][lei[0][0]]);					
               	}//if(u==0&&v==0)
				else if(u<4&&v<4)
				{ // H[u+i*N][v+j*N]=0;
                 lei[u*4+v][0]++; 
				 lei[u*4+v][lei[u*4+v][0]]=int(H[u+i*N][v+j*N]); //lei[u*4+v][0]++;
				 //if(u==1&&v==2){fprintf( stream, "%d %d %d %d \n",i,j,lei[u*4+v][0],lei[u*4+v][lei[u*4+v][0]]);}
				}//else  if!(u==0&&v==0)
				else
				{H[u+i*N][v+j*N]=0;}  
				}//for v
			}//for u
		}//for j
	//	fprintf( stream, "%s%c", s, c );
	}//for i
//for(i=0;i<=(Len/N)*(Wid/N);i++)
//  {fprintf( stream, " %d \n",lei[0][i]/10);}
//将压缩文件输出
FILE *fp_o=fopen("image_code","wb");
unsigned char*ch;	
ch=new unsigned char[int(Len/N)*(Wid/N)*16+2];
/*int *ch0;	
ch0=new int[int(Len/N)*(Wid/N)*16+2];*/
ch[0]=int(Len/N);ch[1]=int(Wid/N); 
int  pp=2;
for(i=2;i<(Len/N)*(Wid/N)*16+2;i++)
{
ch[i]=0;  //ch0[i]=0;
}
for(j=0;j<16;j++)
 for(i=1;i<=lei[0][0];i++)	

 {
  ch[pp]=lei[j][i]+128;   //ch[pp]=lei[j][i]/10+128;  fprintf( stream, "%d %d \n",pp,ch[pp]); 
  pp++;
 }
fwrite(ch,1,(Len/N)*(Wid/N)*16+2,fp_o);
fclose(fp_o);
/*
FILE *fp_i=fopen("image_Dct.dct","rb"); 
fread(ch0,4,(Len/N)*(Wid/N)*16+2,fp_i);
fclose(fp_i);
for(i=0;i<(Len/N)*(Wid/N)*16+2;i++)
{
	fprintf( stream, "%d ",ch0[i]);
} */
//output
	p = m_pDibBits;	
	for(i=0;i<Len;i++)
	{
		for(j=0;j<Wid;j++)
		{if (H[i][j]>255){p[(i)*sizeDib.cx+j]=255;}
			else
			{if (H[i][j]<0){p[(i)*sizeDib.cx+j]=0;}
		
                 else	
				 {
					 p[(i)*sizeDib.cx+j]=(unsigned char)(H[i][j]);
		         }
		
			}
		}
		}
fclose( stream );
system( "type word.txt" );
delete M;
return true;
}/////////////////////////////////////////////
bool CDib::ConvertToIDctvalue()
{
return true;
}
bool CDib::IIdct(int Len,int Wid,int *ch)
{	
	int x,y,i,j,u,v;int N=8;int l=0; int temp;
    //int Len,Wid;
	unsigned char *p;
	p= new unsigned char [Len*Wid];
	double **M,a,b;
/*	Wid=m_pBIH->biWidth;
	Len = m_pBIH->biHeight;
	CSize sizeDib;
	sizeDib.cx = (Wid%8==0)?Wid:(Wid-Wid%8+8);   */
//read
	Wid=ch[1]*N;	
	CSize sizeDib;
	sizeDib.cx=(Wid%8==0)?Wid:(Wid-Wid%8+8); 
	M=new double *[Len];
	for(x=0;x<Len;x++){M[x]=new double [Wid];}
	int **H;
    H=new int *[Len];
	for(x=0;x<Len;x++){H[x]=new int [Wid];}
   	for (i = 0; i <Len;i++)
	{
    	for(j=0; j<Wid;j++)
		{
		M[i][j]=0;H[i][j]=0;
		}
	}
 
temp=0;int pp=2;//H[0][0]=ch[2];temp=H[0][0];int pp=3;
for(i=0;i<Len/N;i++)
 for(j=0;j<Wid/N;j++)
 {  
   H[i*N][j*N]=temp+ch[pp];   temp=H[i*N][j*N]; 
   H[i*N][j*N]=H[i*N][j*N];pp++;// fprintf( stream, "%d %d,%d \n",i,j,H[i*N][j*N]);
 }
 for(u=0;u<4;u++)
	 for(v=0;v<4;v++)
      for(i=0;i<Len/N;i++)
	    for(j=0;j<Wid/N;j++)
		 {  
				 if(!(u==0&&v==0))
				 { 
					 H[i*N+u][v+j*N]=ch[pp];pp++;
				 //if(u==0&&v==1)fprintf(stream," %d",H[i*N][j*N+v]);
				 }
		}
//fclose( stream );
//system( "type word.txt" );     
//DCT逆变换
	for(i=0;i<Len/N;i++){
		for(j=0;j<Wid/N;j++){
			for(x=0;x<N;x++){
				for(y=0;y<N;y++){  
					for(u=0;u<4;u++){
						for(v=0;v<4;v++)
						{ 
						  if(u==0)a=sqrt((double)1/N);else a=sqrt((double)2/N);
                          if(v==0)b=sqrt((double)1/N);else b=sqrt((double)2/N);
						 M[x+i*N][y+j*N]=M[x+i*N][y+j*N]+a*b*H[u+i*N][v+j*N]*10.0*cos((2*x+1)*u*pi/(2*N))*cos((2*y+1)*v*pi/(2*N));
					
						}
					}
				}
			}
		}
	}
//输出	
/*	p = m_pDibBits;	
	for(i=0;i<Len;i++)
		for(j=0;j<Wid;j++)
		{
         if(M[i][j]<0) p[(i)*sizeDib.cx+j]=0;
		 else p[(i)*sizeDib.cx+j]=(unsigned char)(M[i][j]);
		}
	
		 p = m_pDibBits; 
		 */
	for(i=0;i<Len;i++)
		for(j=0;j<Wid;j++)
		{
			if(M[i][j]<0) p[(i)*sizeDib.cx+j]=0;
			else if(M[i][j]>255) p[(i)*sizeDib.cx+j]=255; 
			else 	p[(i)*sizeDib.cx+j]=(unsigned char)(M[i][j]);
		}
		


		LONG w = (LONG)Wid;//(LONG)min(nWidth, m_nWidth - x); 
		LONG h = (LONG)Len; 				
		//被保存位图每行的字节数
		DWORD dwSaveWidthBytes = w; 
		
		//DIB位图数据大小, 以字节为单位
		DWORD dwDibBitsSize = dwSaveWidthBytes *Len; 
		
		//计算整个Dib文件的大小dwFileSize
		DWORD dwFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwDibBitsSize; 
		dwFileSize += (256 * sizeof(RGBQUAD)); 
		
		//计算位图信息到位图数据间的偏移量(字节)
		DWORD dwOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
		dwOffBits += (256 * sizeof(RGBQUAD)); 

		BITMAPFILEHEADER bmFileHeader; 
		BITMAPINFOHEADER bmInfo; 
		
		//填充BITMAPFILEHEADER结构
		bmFileHeader.bfType=0x4d42; 
		bmFileHeader.bfSize = dwFileSize; 
		bmFileHeader.bfReserved1 = 0; 
		bmFileHeader.bfReserved2 = 0;  
		bmFileHeader.bfOffBits = dwOffBits; 
		
		//填充BITMAPINFOHEADER结构:8位仍然保存为8位, 其它均被保存为24位.最低显示模式为8位.
		WORD wBitsPixel = (WORD)8; 
		//	if(m_nBitCount != 8)wBitsPixel = 24; 
		bmInfo.biSize = sizeof(BITMAPINFOHEADER);    
		bmInfo.biWidth = w;     
		bmInfo.biHeight = h;     
		bmInfo.biPlanes = 1;  
		bmInfo.biBitCount = wBitsPixel;     
		bmInfo.biCompression = 0;     
		bmInfo.biSizeImage = 0;  
		bmInfo.biXPelsPerMeter = 0;     
		bmInfo.biYPelsPerMeter = 0;     
		bmInfo.biClrUsed = 0;  
		bmInfo.biClrImportant = 0; 	
 
		CFile file((LPCTSTR )"recode.bmp", CFile::modeCreate |
		CFile::modeReadWrite | CFile::shareExclusive); 
		file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER)); 
		file.Write((LPSTR)&bmInfo, sizeof(BITMAPINFOHEADER)); 


				RGBQUAD* pRGBQuad = new RGBQUAD[256]; 
 				if(pRGBQuad == NULL)return true; 
					
				//初始化为0
				memset(pRGBQuad, 0, 256 * sizeof(RGBQUAD)); 
				
				//创建表项:可能丢失颜色
				GetPaletteEntries(pRGBQuad); 
					
				//写入数据
				file.Write((LPSTR)pRGBQuad, 256 * sizeof(RGBQUAD)); 
					
				delete[] pRGBQuad;
//		file.Write(p, size); 
						DWORD dwLength = (DWORD)Wid; 
						UINT nZero =  dwSaveWidthBytes - dwLength; 
						BYTE abyZero[] =  {0, 0, 0}; 
				
						//数据索引基数, 从下往上读
						DWORD dwBaseIndex = 0; 
						for( i = 0; i < h ; i++)
						{
									
							unsigned char *lpsRaw = (unsigned char *)(p + dwBaseIndex); 
				
							//写入子数据, 注意数据量小于64k, 位图宽度可达22767个像素单位或更高
							file.Write(lpsRaw, dwLength); //
									
							//结尾补0
							if(nZero > 0) file.Write((BYTE *)abyZero, nZero); 
							
							dwBaseIndex += Wid; 
							
						}
								
		
		file.Close(); 

		delete M;
  return true;
}

   
//创建调色盘表项:其内容来自于系统调色盘
void GetPaletteEntries(RGBQUAD *pRGBQuad)
{
	int index;
	ASSERT(pRGBQuad); 
	//	HDC hDC = ::GetDC(NULL); //If this value is NULL,  GetDC retrieves the device context for the entire screen. 
	
	//	PALETTEENTRY* paletteEntry = new PALETTEENTRY[256]; 
	
	//获取系统调色盘的信息.系统调色盘的改变由系统来完成, 这里不能改变系统调色盘.我们希望这个类不要干涉系统事务
	//	::GetSystemPaletteEntries(hDC, 0, 256, paletteEntry); 
	//::GetDIBColorTable(hDC, 0, 256, pRGBQuad); 
	
	for(index = 0; index < 256; index++)
	{
		pRGBQuad[index].rgbRed = index; 
		pRGBQuad[index].rgbGreen = index; 
		pRGBQuad[index].rgbBlue = index; 
		pRGBQuad[index].rgbReserved = 0; 
	}
}
////////////////////////////////////////////////////////
bool CDib::NN()
{
	DWORD  size;
	int  Len,Wid,i,j;
	unsigned char *p;
	p = m_pDibBits; 
	Wid=m_pBIH->biWidth;
	Len =m_pBIH->biHeight;
	CSize  sizeDib;
	sizeDib.cx = (Wid%4==0)?Wid:(Wid-Wid%4+4);
	sizeDib.cy = Len;
	size = m_dwDibSize - (m_pDibBits - m_pDib);
	unsigned char ** M;//存储图像的二维数组
	M=new unsigned char *[Len];
	for(i=0;i<Len;i++){M[i]=new unsigned char[Wid];}
	for (i = 0; i <Len;i++)//存图像
		for(j=0; j<Wid;j++)
		{   
			M[i][j] = p[(Len-i-1)*sizeDib.cx+j];  
		}
 /*   int  ** bx;
	bx=new int *[20];
	for(i=0;i<20;i++){bx[i]=new int[8000];}
	int  ** by;
	by=new int *[20];
	for(i=0;i<20;i++){by[i]=new int[8000];}   */
	for (i = 0; i <20;i++)//存图像
		for(j=0; j<8000;j++)
		{   bx[i][j]=0;   by[i][j]=0;  }
    bh=0,bl=1; int bbl=0; int li=0;int lj=0;
	int k;
	for(k=0;k<14;k++)
	 for (i = 0; i <256;i++)//存图像
		for(j=0; j<256;j++)
		{myimage[k][i][j]=0;
		}
/////processing///////
//存样本图像
for (i = 0; i <Len;i++) 
 for(j=0; j<Wid;j++)
 {
  if(M[i][j]>0.0&&M[i][j]<255.0)
  {  bl=1;
	M[i][j]=255; bx[bh][bl]=i; by[bh][bl]=j; bl++;
    li=i; lj=j; bbl=0;
loop1:
	if((lj-1)>0)
	{ 
		if(M[li][lj-1]>0.0&&M[li][lj-1]<255.0)
		{
			M[li][lj-1]=255; bx[bh][bl]=li; by[bh][bl]=lj-1; bl++;
			
	}}
	if((lj+1)<Wid)
	{ 
		if(M[li][lj+1]>0.0&&M[li][lj+1]<255.0)
		{
			M[li][lj+1]=255; bx[bh][bl]=li; by[bh][bl]=lj+1; bl++;
			
	}}
	if((li-1)>0)
	{
		if(M[li-1][lj]>0.0&&M[li-1][lj]<255.0) 
		{
		M[li-1][lj]=255; bx[bh][bl]=li-1; by[bh][bl]=lj; bl++;
		}
		if((lj-1)>0)
		{ 
			if(M[li-1][lj-1]>0.0&&M[li-1][lj-1]<255.0)
			{
				M[li-1][lj-1]=255; bx[bh][bl]=li-1; by[bh][bl]=lj-1; bl++;
				
		}}
		if((lj+1)<Wid)
		{ 
			if(M[li-1][lj+1]>0.0&&M[li-1][lj+1]<255.0)
			{
				M[li-1][lj+1]=255; bx[bh][bl]=li-1; by[bh][bl]=lj+1; bl++;
				
		}}
	}//	if((i-1)>0)
	if((li+1)<Len)
	{
		if(M[li+1][lj]>0.0&&M[li+1][lj]<255.0) 
		{
			M[li+1][lj]=255; bx[bh][bl]=li+1; by[bh][bl]=lj; bl++;
		}
		if((lj-1)>0)
		{ 
			if(M[li+1][lj-1]>0.0&&M[li+1][lj-1]<255.0)
			{
				M[li+1][lj-1]=255; bx[bh][bl]=li+1; by[bh][bl]=lj-1; bl++;
				
		}}
		if((lj+1)<Wid)
		{ 
			if(M[li+1][lj+1]>0.0&&M[li+1][lj+1]<255.0)
			{
				M[li+1][lj+1]=255; bx[bh][bl]=li+1; by[bh][bl]=lj+1; bl++;			
			}
		}
	}//if((i+1)<Len)
    bbl++;
	if(bbl<bl){ li=bx[bh][bbl]; lj=by[bh][bbl];goto loop1; }
	if(bbl==bl)
	{ bx[bh][0]=bl;   if(bl>15) {bh++;} 
	   bl=1; li=0; lj=0;
	}
  }
 }

/////out

p = m_pDibBits;	
for(i=0;i<Len;i++)
 for(j=0;j<Wid;j++)
 {
	  p[(Len-i-1)*sizeDib.cx+j]=M[i][j];
 }
delete M; 
return true;
}
bool  CDib::Readmyimage(int k)
{
	int  Len,Wid,i,j;
	unsigned char *p;
	p = m_pDibBits; 
	Wid=m_pBIH->biWidth;
	Len =m_pBIH->biHeight;
	CSize  sizeDib;
	sizeDib.cx = (Wid%4==0)?Wid:(Wid-Wid%4+4);
	sizeDib.cy = Len;
	//size = m_dwDibSize - (m_pDibBits - m_pDib);
	for (i = 0; i <Len;i++)//存图像
		for(j=0; j<Wid;j++)
		{   
			myimage[k][i][j]=p[(Len-i-1)*sizeDib.cx+j];
		}
	return true;
}
/////////////////////////////////
bool  CDib::study()
{
FILE *stream;
stream=fopen( "word.txt", "w" );
int i;int j;
unsigned char ** M;//存储图像的二维数组
M=new unsigned char *[256];
for(i=0;i<256;i++){M[i]=new unsigned char[256];}
for (i = 0; i <256;i++)//存图像
for(j=0; j<256;j++)
{   
	M[i][j]=0;  
}
double f0[12]={0.0},f1[12]={0.0},f2[12]={0.0};
double temp; temp=0.0;  int lpnum=3;
int k;  int m;       //m=0;  
double avg[20][12]={0.0};
for(m=0;m<bh;m++)
{ ///  m 类
lpnum=5;
loop1:
 for(i=1;i<bx[m][0];i++)
 {  // 每类的样本
	//用样本点训练隶属函数的均值
	for(k=0;k<12;k++)                             ///////////////k=12 yang ben num///
	{//对每个点计算在各幅图中的隶属函数
	temp=double(myimage[k][bx[m][i]][by[m][i]]);
	f0[k]=1.0/(1.0+0.05*temp);
    f1[k]=temp;//f1[k]=1.0/(1.0+0.05*double(abs(128.0-temp)));
	f2[k]=1.0/(1.0+0.05*(256.0-temp));
	if(i==1&&lpnum==3){avg[m][k]=f1[k];}
	avg[m][k]=(avg[m][k]+f1[k])/2.0;
	}
 }
 lpnum--;if(lpnum>0)goto loop1;
// fprintf(stream, "%d,%d,%f,%f\n", k,m,avg[m][3],avg[m][10]);
}
double cha[20]={0.0}; 
int n;  double min; int  minn;

//m=1;
//for(i=1;i<bx[m][0];i++)
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{ // 每类的样本与平均值的差
	for(n=0;n<bh;n++)	
	{
		cha[n]=0.0;

	}  
	min=0;
	for(k=0;k<12;k++)
	{
	  if(myimage[k][i][j]>0.0) min=1;
	}
	if(min==0){M[i][j]=255;minn=8;}
	else
	{
	for(k=0;k<12;k++)                             ///////////////k=12 yang ben num///
	{//对每个点计算与各类均值的差
		  //	temp=double(myimage[k][bx[m][i]][by[m][i]]);
		//	f0[k]=1.0/(1.0+0.05*temp);
		//	f1[k]=(128.0-temp)>0.0?(128.0-temp):(temp-128.0);
		//	f1[k]=1.0/(1.0+0.05*double(f1[k]));
		//	f2[k]=1.0/(1.0+0.05*(256.0-temp));  
		//f1[k]=double(myimage[k][bx[m][i]][by[m][i]]);
	  f1[k]=double(myimage[k][i][j]);
      min=500;
		  for(n=0;n<bh;n++)
		  { //计算与各类的差值之和  
			temp=(f1[k]-avg[n][k]); temp=temp>0.0?temp:(-temp);
			cha[n]=cha[n]+temp/avg[n][k];
		  }
		  for(n=0;n<bh;n++)
		  { //比较各类的差值之和,选择最小的归为该类
			  if(min>cha[n])
			  {
				  min=cha[n];minn=n; 				 
			  }
		  } 
		  if(min<0.6) 
		  {
			 M[i][j]=minn;  
			 //M[bx[m][i]][by[m][i]]=255; // M[i][j]=255;
		  }   
          else if(min>=0.6)  { M[i][j]=100;  }
		// if(minn==m)M[bx[m][i]][by[m][i]]=255;       
	}
	}//if(min==0)M[i][j]=0;
  // fprintf(stream, "%d,%d,%f\n", i,minn,min);
}
fclose( stream );
system( "type word.txt" );
//////////
//////////out//////
//unsigned char *p;
//p = m_pDibBits;	
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{
	myimage[0][i][j]=M[i][j]; 
	//p[(256-i-1)*256+j]=M[i][j];
}
delete M; 
return true;
}





























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -