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

📄 ffuriour.cpp

📁 一些自己做的关于图象处理的程序(如傅立叶变换
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
}

BOOL CFfuriour::OnIdealLowFilter()
{
   int i,j;
   for(i=0;i<nNewWidth;i++)
   {
     for(j=0;j<nNewHeight;j++)
	 {
       if(sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))>m_cutevalue)
	   {
		   FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x=0;
           FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y=0;
	   }
	 }
   }
   return TRUE;
}

BOOL CFfuriour::OnIdealHightFilter()
{
	int i,j;
	for(i=0;i<nNewWidth;i++)
	{
		for(j=0;j<nNewHeight;j++)
		{
			if(sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))<m_cutevalue)
			{
				FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x=0;
				FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y=0;
			}
		}
	}
	return TRUE;
}


BOOL CFfuriour::OnButworthLowFilter()
{
	int i,j;
	for(i=0;i<nNewWidth;i++)
 	{
 		for(j=0;j<nNewHeight;j++)
		{
            FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x=FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x/(1+pow(sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))/m_cutevalue,2));
	           FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y=FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y/(1+pow(sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))/m_cutevalue,2));
		}
 	}
    
 	return TRUE;
}

BOOL CFfuriour::OnButworthHightFilter()
{
	int i,j;
	for(i=0;i<nNewWidth;i++)
	{
		for(j=0;j<nNewHeight;j++)
		{
            FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x=FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x/(1+pow(m_cutevalue/sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2)),2));
	        FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y=FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y/(1+pow(m_cutevalue/sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2)),2));
		}
	}
    
	return TRUE;
}

BOOL CFfuriour::OnHomoFilter()
{
	double rH=2,rL=0.5;
	int i,j;
	for(i=0;i<nNewWidth;i++)
	{
		for(j=0;j<nNewHeight;j++)
		{                                                   
				
				FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x *= (rH-rL)*(1-exp(-(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2)/(double)pow(m_cutevalue,2))))+rL;
			    //(rH-rL)/(1+(m_cutevalue/sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))))+rL;			
				//(rH-rL)/((1+pow(m_cutevalue/sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2)),2))+0.5) + rL;



			    FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y *= (rH-rL)*(1-exp(-(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2)/(double)pow(m_cutevalue,2))))+rL;
				//(rH-rL)/(1+(m_cutevalue/sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))))+rL;			
				//(rH-rL)/((1+pow(m_cutevalue/sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2)),2))+0.5) + rL;

				
		}
	}
		
	return  TRUE;	
	
}

void CFfuriour::OnPepperSaltNoise()
{
	ASSERT(m_pImageObject != NULL);  //声明m_pImageObject不得为空
	CImageObject*pImageObject = m_pImageObject;
	
	//**********获取图像的像素区指针和各种参数,这段代码是通用的****************
	int nWidth = pImageObject->GetWidth();   //取得图像的宽度
	int nHeight = pImageObject->GetHeight(); //取得图像的高度
	int nNumBits = pImageObject->GetNumBits();//取得图像的位数
	
	int nWidthBytes;    //图像每行所占的字节数                           
	char *pBuffer = (char *) pImageObject->GetDIBPointer( &nWidthBytes );
	
	
	BITMAPFILEHEADER *pBFH;       //图像文件头指针
	BITMAPINFOHEADER *pBIH;       //图像信息头指针
	RGBQUAD *pRGBPalette;         //图像调色板指针
	unsigned char *pBits;         //像素区的首指针
	int nNumColors = pImageObject->GetNumColors();
	
	pBFH = (BITMAPFILEHEADER *) pBuffer;
	pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
	pRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)
		+sizeof(BITMAPINFOHEADER)];
	pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)
		+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
	//pBits就是我们所必须要的像素指针!!!
	/****************************椒盐噪声********************************/
	int i,j;
	for(i=0;i<nWidth;i++)
	{
		for(j=0;j<nHeight;j++)
		{
			/*srand( (unsigned)time( NULL ) );*/
			if (rand()<500 && rand()>490)
			{
				pBits[(nHeight-1-j)*nWidthBytes+i]=0;
			}
            else
			{
				if (rand()>20000 && rand()<2100)
				{
					pBits[(nHeight-1-j)*nWidthBytes+i]=255;
				}
			}
		}
	}
}

void CFfuriour::OnGussNoise()
{
	
	ASSERT(m_pImageObject != NULL);  //声明m_pImageObject不得为空
	CImageObject*pImageObject = m_pImageObject;
	
	//**********获取图像的像素区指针和各种参数,这段代码是通用的****************
	int nWidth = pImageObject->GetWidth();   //取得图像的宽度
	int nHeight = pImageObject->GetHeight(); //取得图像的高度
	int nNumBits = pImageObject->GetNumBits();//取得图像的位数
	
	int nWidthBytes;    //图像每行所占的字节数                           
	char *pBuffer = (char *) pImageObject->GetDIBPointer( &nWidthBytes );
	
	
	BITMAPFILEHEADER *pBFH;       //图像文件头指针
	BITMAPINFOHEADER *pBIH;       //图像信息头指针
	RGBQUAD *pRGBPalette;         //图像调色板指针
	unsigned char *pBits;         //像素区的首指针
	int nNumColors = pImageObject->GetNumColors();
	
	pBFH = (BITMAPFILEHEADER *) pBuffer;
	pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
	pRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)
		+sizeof(BITMAPINFOHEADER)];
	pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)
		+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
	//pBits就是我们所必须要的像素指针!!!
	/****************************高斯噪声********************************/
	int i,j,k;
	double a;
	a = 0;
	for (j=0; j<nHeight; j++)
	{
		
		for (i=0; i<nWidth; i++)
		{
			if(rand()>=1000 && rand()<=3000)
			{
				
				for(k = 1;k<=12;k++)
					a += rand()/(float)1000 - 6;
				pBits[(nHeight-1-j)*nWidth+i] =
					(int)(20 + 20*a+0.5)%255 /*+ pBits[(nHeight-1-j)*nWidth+i])/2*/;
				
			}
		}
	}
}


void CFfuriour::OnDegenerate()
{
	
	m_filtertype=1;
	m_translatetype=1;
	OnFfuriour();
	int i,j;
	COMPLEX *DegenFunction;
	COMPLEX *TempValue;
	DegenFunction=new COMPLEX[nNewHeight*nNewWidth];
	TempValue=new COMPLEX[nNewHeight];
	for(i=0;i<nNewHeight;i++)
	{
		for(j=0;j<nNewWidth;j++)
		{
			if (i<7 && j<7)
			{
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].x=(1.0/49.0)*pow(-1,i+j);
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].y=0;
			}
			else
			{
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].x=0;
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].y=0;
			}
		}
	}
	for(i=0;i<nNewWidth;i++)//逐列傅立叶变换
	{
		for(j=0;j<nNewHeight;j++)
		{
			
			TempValue[j].x=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x;
			TempValue[j].y=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y;
			
		}
		
		ReverceOrder(TempValue,nNewHeight);//每列的元素倒序
		
		FastFuriourTranslate(TempValue,nNewHeight);//每列傅立叶变换
		for(j=0;j<nNewHeight;j++)
		{
			DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x=TempValue[j].x;
			DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y=TempValue[j].y;
			
			
		}
	}
			 for(j=0;j<nNewHeight;j++)//逐行傅立叶便变换
			 {
				 for(i=0;i<nNewWidth;i++)
				 {
					 
					 
					 TempValue[i].x=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x;
					 TempValue[i].y=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y;
				 }
				 ReverceOrder(TempValue,nNewWidth);//每行的元素倒序
				 
				 
				 FastFuriourTranslate(TempValue,nNewWidth);//每行傅立叶变换
				 for(i=0;i<nNewWidth;i++)
				 {
					 DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x=TempValue[i].x;
					 DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y=TempValue[i].y;
					 
					 
				 }	 
			 }
			 for(i=0;i<nNewWidth;i++)
			 {
				 for(j=0;j<nNewHeight;j++)
				 {
					 FastFTValue[(nNewHeight-1-j)*nNewWidth+i]=Mul(FastFTValue[(nNewHeight-1-j)*nNewWidth+i],DegenFunction[(nNewHeight-1-j)*nNewWidth+i]);
					 
				 }
			 }
			 m_filtertype=1;
			 m_translatetype=2;
			 OnFfuriour();
			 delete TempValue;
			 delete DegenFunction;
			 TempValue=NULL;
			 DegenFunction=NULL;
}

void CFfuriour::OnReverceFilter()
{
	m_filtertype=1;
	m_translatetype=1;
	OnFfuriour();
	int i,j;
	COMPLEX *DegenFunction;
	COMPLEX *TempValue;
	DegenFunction=new COMPLEX[nNewHeight*nNewWidth];
	TempValue=new COMPLEX[nNewHeight];
	for(i=0;i<nNewHeight;i++)
	{
		for(j=0;j<nNewWidth;j++)
		{
			if (i<7 && j<7)
			{
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].x=(1.0/49.0)*pow(-1,i+j);
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].y=0;
			}
			else
			{
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].x=0;
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].y=0;
			}
		}
	}
	for(i=0;i<nNewWidth;i++)//逐列傅立叶变换
	{
		for(j=0;j<nNewHeight;j++)
		{
			
			TempValue[j].x=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x;
			TempValue[j].y=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y;
			
		}
		
		ReverceOrder(TempValue,nNewHeight);//每列的元素倒序
		
		FastFuriourTranslate(TempValue,nNewHeight);//每列傅立叶变换
		for(j=0;j<nNewHeight;j++)
		{
			DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x=TempValue[j].x;
			DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y=TempValue[j].y;
			
			
		}
	}
			 for(j=0;j<nNewHeight;j++)//逐行傅立叶便变换
			 {
				 for(i=0;i<nNewWidth;i++)
				 {
					 
					 
					 TempValue[i].x=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x;
					 TempValue[i].y=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y;
				 }
				 ReverceOrder(TempValue,nNewWidth);//每行的元素倒序
				 
				 
				 FastFuriourTranslate(TempValue,nNewWidth);//每行傅立叶变换
				 for(i=0;i<nNewWidth;i++)
				 {
					 DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x=TempValue[i].x;
					 DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y=TempValue[i].y;
					 
					 
				 }	 
			 }
			 for(i=0;i<nNewWidth;i++)
			 {
				 for(j=0;j<nNewHeight;j++)
				 {
					 FastFTValue[(nNewHeight-1-j)*nNewWidth+i]=Div(FastFTValue[(nNewHeight-1-j)*nNewWidth+i],DegenFunction[(nNewHeight-1-j)*nNewWidth+i]);
					 
				 }
			 }
			 for(i=0;i<nNewWidth;i++)
			 {
				 for(j=0;j<nNewHeight;j++)
				 {
					 FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x=FastFTValue[(nNewHeight-1-j)*nNewHeight+i].x/(1+pow(sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))/m_cutevalue,20));
					 FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y=FastFTValue[(nNewHeight-1-j)*nNewHeight+i].y/(1+pow(sqrt(pow(i-nNewWidth/2,2)+pow(j-nNewHeight/2,2))/m_cutevalue,20));
				 }
			 }
			 
			 m_translatetype=2;
			 OnFfuriour();
			 delete TempValue;
			 delete DegenFunction;
			 TempValue=NULL;
			 DegenFunction=NULL;
}




void CFfuriour::OnVenusFliter()
{
	m_filtertype=1;
	m_translatetype=1;
	OnFfuriour();
	int i,j;
	COMPLEX *DegenFunction;
	COMPLEX *TempValue;
	DegenFunction=new COMPLEX[nNewHeight*nNewWidth];
	TempValue=new COMPLEX[nNewHeight];
	for(i=0;i<nNewHeight;i++)
	{
		for(j=0;j<nNewWidth;j++)
		{
			if (i<7 && j<7)
			{
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].x=pow(-1,i+j);
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].y=0;
			}
			else
			{
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].x=0;
				DegenFunction[(nNewHeight-1-i)*nNewWidth+j].y=0;
			}
		}
	}
	for(i=0;i<nNewWidth;i++)//逐列傅立叶变换
	{
		for(j=0;j<nNewHeight;j++)
		{
			
			TempValue[j].x=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x;
			TempValue[j].y=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y;
			
		}
		
		ReverceOrder(TempValue,nNewHeight);//每列的元素倒序
		
		FastFuriourTranslate(TempValue,nNewHeight);//每列傅立叶变换
		for(j=0;j<nNewHeight;j++)
		{
			DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x=TempValue[j].x;
			DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y=TempValue[j].y;
			
			
		}
	}
			 for(j=0;j<nNewHeight;j++)//逐行傅立叶便变换
			 {
				 for(i=0;i<nNewWidth;i++)
				 {
					 
					 
					 TempValue[i].x=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x;
					 TempValue[i].y=DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y;
				 }
				 ReverceOrder(TempValue,nNewWidth);//每行的元素倒序
				 
				 
				 FastFuriourTranslate(TempValue,nNewWidth);//每行傅立叶变换
				 for(i=0;i<nNewWidth;i++)
				 {
					 DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x=TempValue[i].x;
					 DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y=TempValue[i].y;
					 
					 
				 }	 
			 }
			 for(i=0;i<nNewWidth;i++)
			 {
				 for(j=0;j<nNewHeight;j++)
				 {
					 FastFTValue[(nNewHeight-1-j)*nNewWidth+i]=Div(FastFTValue[(nNewHeight-1-j)*nNewWidth+i],DegenFunction[(nNewHeight-1-j)*nNewWidth+i]);
					 double Y,U;
					 Y=pow(DegenFunction[(nNewHeight-1-j)*nNewWidth+i].x,2)+pow(DegenFunction[(nNewHeight-1-j)*nNewWidth+i].y,2);
                     U=Y/(Y+m_k);
                     FastFTValue[(nNewHeight-1-j)*nNewWidth+i].x*=U;
					 FastFTValue[(nNewHeight-1-j)*nNewWidth+i].y*=U;
				 }
			 }
			 
			 
			 m_translatetype=2;
			 OnFfuriour();
			 delete TempValue;
			 delete DegenFunction;
			 TempValue=NULL;
			 DegenFunction=NULL;
}

⌨️ 快捷键说明

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