⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实现中值滤波的源程序.txt

📁 实现中值滤波的源程序 参数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<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); //右邻点
		}
		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*
                                                                                                                                                                                                                                                                

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -