实现中值滤波的源程序 参数Hori是一个布尔变量
源代码在线查看: 实现中值滤波的源程序.txt
参数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 for(x=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); //右邻点
}
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 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 for(x=1;x bi.biWidth-2
lpPtr=(char *)lpImgData+(BufSize-LineBytes-
y*