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