图像频域滤波问题,高手指点!

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;

}
...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
酒红绿叶 2005-06-11
  • 打赏
  • 举报
回复
没错。
那有什么问题那?
tfq 2005-06-10
  • 打赏
  • 举报
回复
用MATLAB做没意思,大虾教教
tfq 2005-06-10
  • 打赏
  • 举报
回复
我的意思是对整个图像数据作快速傅立叶变换,得到频域数据,然后扫描数据,
根据模值作低通,最后反变换回到时域数据,重建图像,
不是这样吗?
sboom 2005-06-10
  • 打赏
  • 举报
回复
怎么不用matlab做?
酒红绿叶 2005-06-10
  • 打赏
  • 举报
回复
1 你用的是什么滤波!都有对应的公式。
2 你经过FFT之后,图像的低频部分在哪里?只需要对FFT之后的图像进行处理就可以了。

频域滤波好像是对模值的处理。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧