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

📄 bmpdemodoc.cpp

📁 主要是应用VC进行傅立叶变换和反变换的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}

void CBmpDemoDoc::OnDarken() 
//图象变暗,红、绿、兰三通道处理
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBitmap temp(width,height,m_mBmp);
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color)-10;
			int g=GetGValue(color)-10;
			int b=GetBValue(color)-10;
			r=r<0?0:r;
			g=g<0?0:g;
			b=b<0?0:b;
			temp.SetPixel(i,j,RGB(BYTE(r),BYTE(g),BYTE(b)));
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;		
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnDft() 
//图象的离散傅立叶变换,只针对灰度图象
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageDFT(m_Data,m_mBmp);
	m_mBmp.DataToView(m_mViewBmp);
	flag=TRUE;
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnNdft() 
//离散傅立叶反变换,只有DFT或FFT后才可以
{
	// TODO: Add your command handler code here
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	if(flag==TRUE)
	{
		ImageNDFT(m_Data,m_mBmp);	
	}
	m_mBmp.DataToView(m_mViewBmp);
	flag=FALSE;
}

void CBmpDemoDoc::OnFft() 
//离散傅立叶变换的快速算法实现
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;	
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnNfft() 
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	if(flag==TRUE)
	{
		ImageNFFT(m_Data,m_mBmp);	
	}
	m_mBmp.DataToView(m_mViewBmp);
	flag=FALSE;
}

void CBmpDemoDoc::OnHpfilter(int var) 
//理想高通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			if((x*x+y*y)<var*var)
				*(m_Data+j*width+i)=wComplex(0.0,0.0);
		}
	}
	ImageNFFT(m_Data,m_mBmp);	
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnLpfilter(int var) 
//理想低通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			if((x*x+y*y)>var*var)
				*(m_Data+j*width+i)=wComplex(0.0,0.0);
		}
	}
	ImageNFFT(m_Data,m_mBmp);		
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnBpfilter(int var1,int var2) 
//理想带通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			if( ((x*x+y*y)<var1*var1)&&((x*x+y*y)<var2*var2) )
				*(m_Data+j*width+i)=wComplex(0.0,0.0);
		}
	}
	ImageNFFT(m_Data,m_mBmp);	
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}


void CBmpDemoDoc::OnThpfilter(int var1,int var2) 
//梯形高通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			float d=(float)sqrt(x*x+y*y);
			float temp=(d-(float)var2)/((float)var1-(float)var2);
			if((x*x+y*y)<var1*var1)
				*(m_Data+j*width+i)=wComplex(0.0,0.0);
			else if((x*x+y*y)<var2*var2)
				*(m_Data+j*width+i)*=temp;
		}
	}
	ImageNFFT(m_Data,m_mBmp);		
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnTlpfilter(int var1,int var2) 
//梯形低通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			float d=(float)sqrt(x*x+y*y);
			float temp=(d-(float)var2)/((float)var1-(float)var2);
			if((x*x+y*y)>var2*var2)
				*(m_Data+j*width+i)=wComplex(0.0,0.0);
			else if((x*x+y*y)>var1*var1)
				*(m_Data+j*width+i)*=temp;
		}
	}
	ImageNFFT(m_Data,m_mBmp);			
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void DoNothing()
{
}

void CBmpDemoDoc::OnExphpfilter(int var) 
//指数高通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			float d=(float)sqrt(x*x+y*y);
			float temp=(float)exp(log(1.0/1.414)*(float)var/d);
//			float temp=(float)exp(d/(float)var);
			*(m_Data+j*width+i)*=temp;
		}
	}
	ImageNFFT(m_Data,m_mBmp);				
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);	
}

void CBmpDemoDoc::OnExplpfilter(int var) 
//指数低通滤波器
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	if(!IsMiOf2(width)|!IsMiOf2(height))
	{
		AfxMessageBox("图象的长和宽为2的幂时频域滤波才可以使用FFT");
		return;
	}
	if(flag==TRUE)delete m_bData;
	flag=FALSE;
	m_bData=new BYTE[(long)width*height*sizeof(wComplex)];
	m_Data=(wComplex *)m_bData;
	if(!m_Data)
	{
		AfxMessageBox("内存不够");
		return;
	}
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f;
			if((i+j)&1==1)
				*(m_Data+j*width+i)=wComplex(-(double)gray1,0.0);
			else
				*(m_Data+j*width+i)=wComplex((double)gray1,0.0);
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	ImageFFT(m_Data,m_mBmp);
	flag=TRUE;		

	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			int x=abs(width/2-i);
			int y=abs(height/2-j);
			float d=(float)sqrt(x*x+y*y);
			float temp=(float)exp(log(1.0/1.414)*d/(float)var);
//			float temp=(float)exp(d/(float)var);
			*(m_Data+j*width+i)*=temp;
		}
	}
	ImageNFFT(m_Data,m_mBmp);				
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnEnlarge(int src1,int des1,int src2,int des2) 
//增加对比度,其原理为灰度拉伸,
//参见〈数字图象处理〉教材
{
	// TODO: Add your command handler code here
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();

⌨️ 快捷键说明

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