图像频域滤波问题,高手指点!
tfq 2005-06-09 10:53:57 /**********************************
高手帮忙看看怎么做,我想对图像作频域滤波并低通处理。
以下是我写的,中间过程不知对不对,整个程序有些长,
只贴这个函数。编译通过,但执行有几个错误:
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;
}