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

📄 envyimage.cpp

📁 该代码用于计算波段的TVI值,该代码来源于作业程序,属于实验程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					}
			}
			}
				break;
		case 0:
			{ 
				double  max,min,a;
		             max=0;min=2;
					 LPBYTE lpSource;
					lpSource = lpImageSource+3*col*row;
				
				/*
									for(i=0; i<row; i++)
																{
																	for(j=0; j<col; j++)
																	{   
																		if((*(lpSource+i*col+j)+*(lpImageSource+i*col+j))==0)
																		{
																			*(lpImageTarget+(row-1-i)*saveCol+j)=0;
																		}
																		else{
																			a=sqrt((double(*(lpSource+i*col+j)-*(lpImageSource+i*col+j))/double(*(lpImageSource+3*col*row+i*col+j)+*(lpImageSource+i*col+j))+0.5));     
												                    	 if(a>max)
																			 max=a;
																		 else if(a<min)
																			 min=a;
																	}
																	}
																}*/
								
			

				    for(i=0; i<row; i++)
				{
					for(j=0; j<col; j++)
					{   
							if((*(lpSource+i*col+j)+*(lpImageSource+i*col+j))==0)
							*(lpImageTarget+(row-1-i)*saveCol+j)=0;
							else{
								a=0;
								a=sqrt((double(*(lpSource+i*col+j)-*(lpImageSource+i*col+j))/double(*(lpSource+i*col+j)+*(lpImageSource+i*col+j))+0.5));
							if(a<0.7)
							*(lpImageTarget+(row-1-i)*col+j)=0;
						/*
									else if(a<1&&a>=0.5)
									*(lpImageTarget+(row-1-i)*saveCol+j)=128;*/
								
							else
								*(lpImageTarget+(row-1-i)*saveCol+j)=*(lpSource+i*col+j);	
							}
					}

				}
						
		/*
					CFile file("c:\\test.raw",CFile::modeCreate|CFile::modeWrite);
								file.Write(lpImageTarget,row*col*sizeof(BYTE));
								file.Close();*/
				

			}
		break;
		default:
		return -1;
		}
	}
   else
     return -1;
   return 1;
}

void CEnvyImage::CreateDisplaTVIImage(int red, int green, int blue, int gray)
{
    if(m_lpData==0) return;
	// 检查是否需要重新分配存储空间内存
	if(m_gray!=gray)
	{
		m_gray = gray;
		m_imageSaveCol = (m_imageCol*gray*8+31)/32*4;
		}
	CreatTVIImage((LPBYTE)m_lpData,m_lpImage,m_bitmapInfo,red,green,blue,m_band,m_pixelOrder,gray,m_imageRow,m_imageCol,m_imageSaveCol);
}

int CEnvyImage::Sharpen(LPBYTE lpImageSource,LPBYTE lpImageTarget,BITMAPINFO* bitmap,int red,int green,int blue,int band,int order,int gray,int row,int col,int saveCol)
{
     int i,j;
     CreatRawHeader(col,row,saveCol,gray,m_hpalette,m_bitmapInfo);
	// 指向梯度数据的指针
	 double* pdGrad;
	pdGrad=new double[row*col];//
	// 初始化
	for(i=0; i<row ; i++ )
	{	for(j=0 ; j<col ; j++ )
		{
			*(pdGrad+i*col+j)=0;
		}
	}	
	// 设置模板系数
/*
		static int nWeight[3][3] ;
		nWeight[0][0] = -1 ;   
		nWeight[0][1] = -1 ;   
		nWeight[0][2] = -1 ;   
		nWeight[1][0] = -1 ;   
		nWeight[1][1] =  8 ;   
		nWeight[1][2] = -1 ;   
		nWeight[2][0] = -1 ;   
		nWeight[2][1] = -1 ;   
		nWeight[2][2] = -1 ;   */
				static int nWeight[2][3][3] ;
		nWeight[0][0][0] = -1 ;   
		nWeight[0][0][1] =  0 ;   
		nWeight[0][0][2] =  1 ;   
		nWeight[0][1][0] = -1 ;   
		nWeight[0][1][1] =  0 ;   
		nWeight[0][1][2] =  1 ;   
		nWeight[0][2][0] = -1 ;   
		nWeight[0][2][1] =  0 ;   
		nWeight[0][2][2] =  1 ;   
		
		nWeight[1][0][0] =  1 ;   
		nWeight[1][0][1] =  1 ;   
		nWeight[1][0][2] =  1 ;   
		nWeight[1][1][0] =  0 ;   
		nWeight[1][1][1] =  0 ;   
		nWeight[1][1][2] =  0 ;   
		nWeight[1][2][0] = -1 ;   
		nWeight[1][2][1] = -1 ;   
		nWeight[1][2][2] = -1 ;  


	//这个变量用来表示Laplacian算子象素值
	int nTmp[3][3];
	
	// 临时变量
	double dGrad;
	double dGradOne;
		double dGradTwo;

	// 模板循环控制变量
	int x,y;
		// 下面开始利用Laplacian算子进行计算
	 if(gray==1)
	{
	   memset(lpImageTarget,0L,row*saveCol);
	    	for(i=1; i<row-2; i++)
				{
					for(j=1; j<col-2; j++)
					{
							dGrad =0;dGradOne=0;
		                    dGradTwo=0;
					// Laplacian算子需要的各点象素值

			// 模板第一行
						nTmp[0][0] = *(lpImageSource+(i-1)*col+j-1); 
						nTmp[0][1] = *(lpImageSource+(i-1)*col+j); 
						nTmp[0][2] = *(lpImageSource+(i-1)*col+j+1) ; 
									
			// 模板第二行
						nTmp[1][0] = *(lpImageSource+i*col+j-1); 
				    	nTmp[1][1] = *(lpImageSource+i*col+j) ; 
						nTmp[1][2] = *(lpImageSource+i*col+j+1) ; 
									
			// 模板第三行
						nTmp[2][0] = *(lpImageSource+(i+1)*col+j-1) ; 
						nTmp[2][1] = *(lpImageSource+(i+1)*col+j) ; 
						nTmp[2][2] = *(lpImageSource+(i+1)*col+j+1) ; 					
				
			
		
			// 计算梯度
			for(x=0;x<3;x++)
			{	for(y=0;y<3;y++)
				{
						dGradOne += nTmp[x][y] * nWeight[0][x][y];
						dGradTwo += nTmp[x][y] * nWeight[1][x][y];
				}
			}
			    dGrad=dGradOne*dGradOne+dGradTwo*dGradTwo;
				dGrad=sqrt(dGrad);
				*(pdGrad+i*col+j)=dGrad;
			}
			}
		for(i=0; i<row; i++ )
		{	  
			for(j=0 ; j<col ; j++ )
		{
			if(*(pdGrad+i*col+j)>50)
				*(lpImageTarget+i*saveCol+j	)=0;
			else
				*(lpImageTarget+i*saveCol+j)=255;	
			}
		}
		//转换坐标
		BYTE* lpData=new BYTE[col*row];
				for(i=0;i<row;i++)
		{
			for(j=0;j<col;j++)
		{
                *(lpData+i*col+j)=*(lpImageTarget+i*col+j);
		}
		}
		for(i=0;i<row;i++)
		{
			for(j=0;j<col;j++)
			{
               *(lpImageTarget+i*col+j)=*(lpData+col*(row-i-1)+j);

			}
		}
			
			
	
	

	/*
			CFile file("c:\\test.raw",CFile::modeCreate|CFile::modeWrite);
				file.Write(pdGrad,row*col*sizeof(BYTE));
				file.Close();*/
		
	
	delete []pdGrad;pdGrad=NULL;
	return 1;
	}
    else return -1;
	

}

void CEnvyImage::CreateDisplaSharpenImage(int red, int green, int blue, int gray)
{
	if(m_lpData==0) return;
	// 检查是否需要重新分配存储空间内存
	if(m_gray!=gray)
	{
		m_gray = gray;
		m_imageSaveCol = (m_imageCol*gray*8+31)/32*4;
		}
	Sharpen((LPBYTE)m_lpData,m_lpImage,m_bitmapInfo,red,green,blue,m_band,m_pixelOrder,gray,m_imageRow,m_imageCol,m_imageSaveCol);
}

int CEnvyImage::RegionGrow(LPBYTE lpImageSource,LPBYTE lpImageTarget,BITMAPINFO* bitmap,int red,int green,int blue,int band,int order,int gray,int row,int col,int saveCol,CPoint point,int nThreshold)
{
     CreatRawHeader(col,row,saveCol,gray,m_hpalette,m_bitmapInfo);
	 static int nDx[]={-1,-1,0,1,1,1,0,-1};
	static int nDy[]={0,-1,-1,-1,0,1,1,1};
     int SeedX=point.x;
	 int SeedY=point.y;
	 	// 定义堆栈,存储坐标
	int * pnGrowQueX ;
	int * pnGrowQueY ;
	
	// 分配空间
	pnGrowQueX = new int [col*row];
	pnGrowQueY = new int [col*row];
	// 当nStart=nEnd, 表示堆栈中只有一个点
	int nStart ;
	int nEnd   ;

	//初始化
	nStart = 0 ;
	nEnd   = 0 ;
	LPBYTE lpUnRegion;
	       lpUnRegion=new unsigned char [row*col];
	int i,j;
         for(i=0;i<row;i++)
		 for(j=0;j<col;j++)
		 {
			 *(lpUnRegion+i*col+j)=0;

		 }
	 memset(lpImageTarget,0L,row*saveCol);
	

	// 把种子点的坐标压入栈
	pnGrowQueX[nEnd] = SeedX;
	pnGrowQueY[nEnd] = SeedY;

	// 当前正在处理的象素
	int nCurrX ;
	int nCurrY ;
	int k ;
	int xx;
	int yy;

	while (nStart<=nEnd)
	{
		// 当前种子点的坐标
		nCurrX = pnGrowQueX[nStart];
		nCurrY = pnGrowQueY[nStart];					

		// 对当前点的8邻域进行遍历
		for (k=0; k<8; k++)	
		{	
			// 8邻域象素的坐标
			xx = nCurrX+nDx[k];
			yy = nCurrY+nDy[k];
			
			// 判断象素(xx,yy) 是否在图像内部
			// 判断象素(xx,yy) 是否已经处理过
			// pUnRegion[yy*nWidth+xx]==0 表示还没有处理

			// 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值
			if ((xx < row) && (xx>=0) && (yy<col) && (yy>=0) 
				    && (*(lpUnRegion+yy*col+xx)==0) )
			{ 
				if(abs( *(lpImageSource+yy*col+xx)-*(lpImageSource+nCurrY*col+nCurrX))<nThreshold )
				{
				
				nEnd++;
								// 象素(xx,yy) 压入栈
				pnGrowQueX[nEnd] = xx;
				pnGrowQueY[nEnd] = yy;

				// 把象素(xx,yy)设置成255
				// 同时也表明该象素处理过
				*(lpImageTarget+yy*saveCol+xx) = 128;
				*(lpUnRegion+yy*col+xx)=255;
				}
			
		       else  
		     	*(lpImageTarget+yy*saveCol+xx)=*(lpImageSource+yy*col+xx);
			}
		}
		nStart++;
	}
	       
	
		//转换坐标
			BYTE* lpData=new BYTE[row*col];
					for(i=0;i<row;i++)
			{
				for(j=0;j<col;j++)
			{
	                *(lpData+i*col+j)=*(lpImageTarget+i*col+j);
			}
			}
			for(i=0;i<row;i++)
			{
				for(j=0;j<col;j++)
				{
	               *(lpImageTarget+i*col+j)=*(lpData+col*(row-i-1)+j);
	
				}
			}

	
		// 释放内存
	delete []lpUnRegion;
	delete []pnGrowQueX;
	delete []pnGrowQueY;
	delete []lpData;
    pnGrowQueX = NULL ;
	pnGrowQueY = NULL ;
    lpUnRegion = NULL;
    lpData=NULL;
	return 1;

        
}
void CEnvyImage::CreateDisplaRegionGrowImage(int red, int green, int blue, int gray,CPoint point,int nThreshold)
{
	if(m_lpData==0) return;
	// 检查是否需要重新分配存储空间内存
	if(m_gray!=gray)
	{
		m_gray = gray;
		m_imageSaveCol = (m_imageCol*gray*8+31)/32*4;
		}

   
	RegionGrow((LPBYTE)m_lpData,m_lpImage,m_bitmapInfo,red,green,blue,m_band,m_pixelOrder,gray,m_imageRow,m_imageCol,m_imageSaveCol,point,nThreshold);
}

⌨️ 快捷键说明

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