if(num==255)1 ∥身及上下邻居中若有一个不是黑点,则将该点腐 ∥成白点 ∥原图中就是白点的,新图中仍是白点 else *lpTempPtr=(unsigned char)25 ∥指向下一个象素 IpTempPtr++ ∥在垂直方向进行腐蚀运算 for(y=ly< bi biWeight-ly++){∥/注意为防止越界,y的范围从1到高度2 pPtr指向原图数据, IpTempPtr指向新图数据 lpPtr=(char *)lplmg Data+( BufSize-LineBytes-y*Line Bytes); for(x=0; x<bi bi Width; x++)i if(num=0){/因为腐蚀掉的是黑点,所以只对黑点处理 * IpTempPtra=( unsigned char)0,∥先置成黑点 num=(unsigned char )*(IpPtr+(i-1 )*LineBytes); if(num==255)( 身及上下邻居中若有一个不是黑点,则将该点腐 ∥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;
∥指向下一个象素 IpTempPtr if(hBitmap!=NULL) DeleteObject(hBitmap) hDc=GetDC(hWnd) ∥产生新的位图 hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTemplmg Data (LONGCBM INT (LPSTR)Ip Templmg Data+ sizeof( BI TMAPINFOHEADER (LPBITMAPINFO)IpTemplmg Data, DIB RGB COLORS) ∥起不同的结果文件名 if(Hori) hf- Creat("c: I erosion. bmp",0); hf- Creat("c: llverosion bmp",0) Iwrite(hf, (LPSTR)&bf, sizeof( BITMAPFILEHEADER)) Iwrite(hf, (LPSTR)IpTemplmg Data, BufSize) ∥释放内存及资源 ReleaseDC(hWnd, hDc) Local Unlock (h Templmg Data) Local Free(hTemplmg Data) Global Unlock(hmg Data) return trUe 62膨胀 膨胀( dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到B,若 B击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做X被B膨胀的结 果。用公式表示为:Dx={a|Batx}=XB,如图613所示。图613中X是被处理的对 象,B是结构元素,不难知道,对于任意一个在阴影部分的点a,Ba击中X,所以Ⅹ被B
//指向下一个象素 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; } 6.2 膨胀 膨胀(dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素 B 平移 a 后得到 Ba,若 Ba击中 X,我们记下这个 a 点。所有满足上述条件的 a 点组成的集合称做 X 被 B 膨胀的结 果。用公式表示为:D(X)={a | Ba↑X}=X B,如图 6.13 所示。图 6.13 中 X 是被处理的对 象,B 是结构元素,不难知道,对于任意一个在阴影部分的点 a,Ba 击中 X,所以 X 被 B