/**********************************
高手帮忙看看怎么做,我想对图像作频域滤波并低通处理。
以下是我写的,中间过程不知对不对,整个程序有些长,
只贴这个函数。编译通过,但执行有几个错误:
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;}
高手帮忙看看怎么做,我想对图像作频域滤波并低通处理。
以下是我写的,中间过程不知对不对,整个程序有些长,
只贴这个函数。编译通过,但执行有几个错误:
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;}
2 你经过FFT之后,图像的低频部分在哪里?只需要对FFT之后的图像进行处理就可以了。频域滤波好像是对模值的处理。