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

📄 vc++开发腐蚀运算源程序.txt

📁 基于VC++的指纹识别程序
💻 TXT
字号:
VC++开发腐蚀运算源程序 
下面的这段程序,实现了上述的腐蚀运算,针对的都是黑色点。参数中有一个BOOL 变量, 
为真时,表示在水平方向进行腐蚀运算,即结构元素B 为(1 ,1. ,1)否则在竖直方向上进 
行腐蚀运算,即结构元素B 为1 1.1 。<br> 
BOOL Erosion(HWND hWnd,BOOL Hori) 
{ 
DWORD BufSize; 
LPBITMAPINFOHEADER lpImgData; 
LPSTR lpPtr; 
HLOCAL hTempImgData; 
LPBITMAPINFOHEADER lpTempImgData; 
LPSTR lpTempPtr; 
HDC hDc; 
HFILE hf; 
LONG x,y; 
unsigned char num; 

int i; 
//为了处理的方便,仍采用256 级灰度图,不过只用到了调色板中0 和255 两项 
if( NumColors!=256){ 
MessageBox(hWnd,"Must be a mono bitmap with 
grayscale palette!","Error Message", 
MB_OK|MB_ICONEXCLAMATION); 
return FALSE; 
} 
//BufSize 为缓冲区大小 
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); 
if(Hori) 
{ 
//在水平方向进行腐蚀运算 
for(y=0;y<bi.biHeight;y++){ 
//lpPtr 指向原图数据,lpTempPtr 指向新图数据 
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+1; 
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+1; 
for(x=1;x<bi.biWidth-1;x++){ //注意为防止越界,x 的范围从1 到宽度-2 
num=(unsigned char)*lpPtr; 
if (num==0){ //因为腐蚀掉的是黑点,所以只对黑点处理 
*lpTempPtr=(unsigned char)0; //先置成黑点 
for(i=0;i<3;i++){ 
num=(unsigned char)*(lpPtr+i-1); 
if(num==255){ 
//自身及上下邻居中若有一个不是黑点,则将该点腐蚀掉, 
//变成白点 
*lpTempPtr=(unsigned char)255; 
break; 
} 
} 
} 
//原图中就是白点的,新图中仍是白点 

else *lpTempPtr=(unsigned char)255; 
//指向下一个像素 
lpPtr++; 
lpTempPtr++; 
} 
} 
} 
else{ 
//在竖直方向进行腐蚀运算 
for(y=1;y<bi.biHeight-1;y++){ //注意为防止越界,y 的范围从1 到高度-2 
//lpPtr 指向原图数据,lpTempPtr 指向新图数据 
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes); 
lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes); 
for(x=0;x<bi.biWidth;x++){ 
num=(unsigned char)*lpPtr; 
if (num==0){ //因为腐蚀掉的是黑点,所以只对黑点处理 
*lpTempPtr=(unsigned char)0; //先置成黑点 
for(i=0;i<3;i++){ 
num=(unsigned char)*(lpPtr+(i-1)*LineBytes); 
if(num==255){ 
//自身及上下邻居中若有一个不是黑点,则将该点腐蚀掉, 
//变成白点 
*lpTempPtr=(unsigned char)255; 
break; 
} 
} 
} 
//原图中就是白点的,新图中仍是白点 
else *lpTempPtr=(unsigned char)255; 
//指向下一个像素 
lpPtr++; 
lpTempPtr++; 
} 
} 
} 
if(hBitmap!=NULL) 
DeleteObject(hBitmap); 
hDc=GetDC(hWnd); 
//产生新的位图 
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, 
(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) + 
NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS); 
//起不同的结果文件名 
if(Hori) 

hf=_lcreat("c:\\herosion.bmp",0); 
else 
hf=_lcreat("c:\\verosion.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; 
} 

⌨️ 快捷键说明

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