/**********************************
高手帮忙看看怎么做,我想对图像作频域滤波并低通处理。
以下是我写的,中间过程不知对不对,整个程序有些长,
只贴这个函数。编译通过,但执行有几个错误:
error LNK2001: unresolved external symbol。
注:
hWnd: 主窗口句柄。
NumColors:全局变量,已在别处定义。
hBitmap:HBITMAP  hBitmap=NULL,全局变量,指向生成的文件的指针
hImgData:HGLOBAL  hImgData=NULL,全局变量,指向给文件数据分配的区域的指针
FFT,IFFT为快速傅立叶变换和反变换,已定义
*************************************/
BOOL FreqDomainFilter(HWND hWnd){ DWORD              OffBits,BufSize;    LPBITMAPINFOHEADER lpImgData; LPSTR              lpPtr; HLOCAL             hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR              lpTempPtr; HDC                hDc; HFILE              hf1; LONG               x,y;
    if( NumColors!=256){     MessageBox(hWnd,"Must be a 256 grayscale bitmap!",
            "Error Message",MB_OK|MB_ICONEXCLAMATION);        return FALSE;    } OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);
if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)    {     MessageBox(hWnd,"Error alloc memory!","Error         Message",MB_OK|MB_ICONEXCLAMATION);        return FALSE;    }       lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);     lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);
lpPtr=(LPSTR)lpImgData; lpTempPtr=(LPSTR)lpTempImgData; memcpy(lpTempPtr,lpPtr,BufSize); int nWidth = bi.biWidth;
int nHeight = bi.biHeight; int w=1,h=1,wp=0,hp=0;
while(w*2<=nWidth)
{
w*=2;
wp++;
}
while(h*2<=nHeight)
{
h*=2;
hp++;
} BYTE *lpPoints= new BYTE[nWidth*nHeight]; memcpy(lpPoints,lpPtr,nWidth*nHeight); COMPLEX *TD=new COMPLEX[w*h];
COMPLEX *FD=new COMPLEX[w*h]; for(y=0;y<h;y++)
{
for(x=0;x<w;x++)
{
//TD[x+w*y].re=Point(x,y);
TD[x+w*y].re=lpPoints[(x)+(y)*nWidth];
TD[x+w*y].im=0;                     //将时域值转为复数
}
}
for(y=0;y<h;y++)
{
FFT(&TD[w*y],&FD[w*y],wp);              //y方向FFT
}
for(y=0;y<h;y++)
{
for(x=0;x<w;x++)
{
TD[y+h*x]=FD[x+w*y];         //结果存入TD

}
}
for(x=0;x<w;x++)
{
FFT(&TD[x*h],&FD[x*h],hp);        //x方向FFT
}    memset(lpPoints,0,nWidth*nHeight);
double m;
for(y=0;y<h;y++)
{
for(x=0;x<w;x++)
{
m=sqrt(FD[x*h+y].re*FD[x*h+y].re+
                            FD[x*h+y].im*FD[x*h+y].im)/100;
if(m>255) m=255;
if(m<50) m=0;    //低通处理,这样对否?
lpPoints[(x<w/2?x+w/2:x-w/2)+
                            nWidth*(nHeight-1-(y<h/2?y+h/2:y-h/2))]=(BYTE)(m);
}
}
     for(y=0;y<h;y++)
{
IFFT(&FD[w*y],&TD[w*y],wp);              //y方向IFFT
}
for(y=0;y<h;y++)
{
for(x=0;x<w;x++)
{
FD[y+h*x]=TD[x+w*y];         //结果存入TD

}
}
for(x=0;x<w;x++)
{
IFFT(&FD[x*h],&TD[x*h],hp);        //x方向IFFT
}
delete TD;
delete FD;
    memcpy(lpTempPtr,lpPoints,nWidth*nHeight);
delete lpPoints; memcpy(lpPtr,lpTempPtr,nWidth*nHeight);

hDc=GetDC(hWnd);    if(hBitmap!=NULL)     DeleteObject(hBitmap);

hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData, 
(LONG)CBM_INIT, (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) 
+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS);
  ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE;}