实现中值滤波的源程序 参数Hori是一个布尔变量

源代码在线查看: 实现中值滤波的源程序.txt

软件大小: 2 K
上传用户: a1a1J0
关键词: Hori 中值滤波 源程序 参数
下载地址: 免注册下载 普通下载 VIP

相关代码

				参数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*
				                                                                                                                                                                                                                                                                			

相关资源