www.pudn.com > mid_filter.rar > mid_filter.c


//中值滤波程序 
//数字图像处理常用程序,可进行水平及垂直方向中值滤波 
//用于图像平滑,噪声去除 
 
//参数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;yg2){ 
			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; 
}