打印

实现中值滤波的源程序

[复制链接]
9031|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxmzzr|  楼主 | 2014-10-29 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参数Hori是一个布尔变量,若为真,做水平中值滤波,否则,做竖直中值滤波。
BOOL MedianFilter(HWND hWnd,BOOL Hori)
{
DWORD              OffBits,BufSize;
LPBITMAPINFOHEADER lpImgData;
LPSTR              lpPtr;
HLOCAL             hTempImgData;
LPBITMAPINFOHEADER lpTempImgData;
LPSTR              lpTempPtr;
HDC                hDc;
HFILE              hf;
LONG               x,y;
int                g,g1,g2,g3;
//OffBits为BITMAPINFOHEADER结构长度加调色板的大小
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);

//拷贝头信息及位图数据
memcpy(lpTempImgData,lpImgData,BufSize);
//注意边界点不处理,所以y从1到高度-2,x类似
for(y=1;y<bi.biHeight-1;y++)
for(x=1;x<bi.biWidth-1;x++){
  lpPtr=(char *)lpImgData+(BufSize-LineBytes-
y*LineBytes)+x;
  lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-
y*LineBytes)+x;
  g2=(unsigned char)*(lpPtr);
  if(Hori){ //水平方向
   g1=(unsigned char)*(lpPtr-1); //左邻点
   g3=(unsigned char)*(lpPtr+1); //右邻点
  }

相关帖子

沙发
jxmzzr|  楼主 | 2014-10-29 15:36 | 只看该作者
else{ //竖直方向
    g1=(unsigned char)*(lpPtr+LineBytes); //上邻点
   g3=(unsigned char)*(lpPtr-LineBytes); //下邻点
  }
  //三者取中
  if(g1>g2){
   if(g2>g3) g=g2;
   else{
    if(g1>g3) g=g3;
    else g=g1;
   }
  }
  else{ //g1<=g2
   if(g1>g3) g=g1;
   else{
    if(g2>g3) g=g3;
    else g=g2;
   }
  }
  *lpTempPtr=(BYTE)g; //存入新的缓冲区内
}
hDc=GetDC(hWnd);
    if(hBitmap!=NULL)
     DeleteObject(hBitmap);
  //产生新的位图
hBitmap=CreateDIBitmap(hDc,
(LPBITMAPINFOHEADER)lpTempImgDa
ta, (LONG)CBM_INIT,
(LPSTR)lpTempImgData+sizeof(BITMAPI
NFOHEADER) +
NumColors*sizeof(RGBQUAD),
       (LPBITMAPINFO)lpTempImgData,
DIB_RGB_COLORS);
if(Hori) //取不同的结果文件名
  hf=_lcreat("c:\\hmedian.bmp",0);
else
  hf=_lcreat("c:\\vmedian.bmp",0);
_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lwrite(hf,(LPSTR)lpTempImgData,BufSize);
_lclose(hf);
//释放内存及资源
  ReleaseDC(hWnd,hDc);
LocalUnlock(hTempImgData);
LocalFree(hTempImgData);
GlobalUnlock(hImgData);
return TRUE;
}

mgData;
//先将原图直接拷贝过来,其实主要是拷贝周围一圈的像素
memcpy(lpTempPtr,lpPtr,BufSize);
for(y=1;y<bi.biHeight-1;y++) //注意y的范围是从1到bi.biHeight-2
   for(x=1;x<bi.biWidth-1;x++){ //注意x的范围是从1到
bi.biWidth-2
    lpPtr=(char *)lpImgData+(BufSize-LineBytes-
y*

使用特权

评论回复
板凳
小木欧尼| | 2014-10-29 15:52 | 只看该作者
程序厉害

使用特权

评论回复
地板
lijiabaobei| | 2014-10-29 17:52 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝