📄 bmpdemodoc.cpp
字号:
}
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 + -