数学形态学的腐蚀和膨胀运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学形态学的腐蚀和膨胀运算
"形态学"是描述动植物形态和结构的一门生物学分支,这里借用来指一种图像处理的方法.图像处理的形态学方法是一种"数学形态学"方法,用来提取图像成分,并据此来对图像区域的形状进行表示和描述.它的数学语言是集合理论,其中的集合代表图像中物体的形状.图像处理中常用的数学形态学方法包括腐蚀,膨胀,开,闭,边缘提取和图像细化.我依次给出Visual C++源代码:
/*************************************************************************
*
* ErosionDIB()
*
* Parameters:
*
* HDIB hDib - objective DIB handle
* BOOL bHori - erosion direction
*
* Return Value:
*
* BOOL - True is success, else False
*
* Description:
*
* This function do erosion with the specified direction
*
************************************************************************/
BOOL ErosionDIB(HDIB hDib, BOOL bHori)
{
// start wait cursor
WaitCursorBegin();
// Old DIB buffer
if (hDib == NULL)
{
WaitCursorEnd();
return FALSE;
}
// only support 256 color image
WORD wBitCount = DIBBitCount(hDib);
if (wBitCount != 8)
{
WaitCursorEnd();
return FALSE;
}
// new DIB
HDIB hNewDIB = CopyHandle(hDib);
if (! hNewDIB)
{
WaitCursorEnd();
return FALSE;
}
// source dib buffer
LPBI TMAPINFO lpSrcDIB = (LPBITMAPINFO)GlobalLock(hDib);
if (! lpSrcDIB)
{
WaitCursorBegin();
return FALSE;
}
// New DIB buffer
LPBI TMAPINFO lpbmi = (LPBITMAPINFO)GlobalLock(hNewDIB);
if (! lpbmi)
{
WaitCursorBegin();
return FALSE;
}
// start erosion...
LPSTR lpPtr;
LPSTR lpTempPtr;
LONG x,y;
BYTE num, num0;
int i;
LONG lHeight = DIBHeight(lpSrcDIB);
LONG lWidth = DIBWidth(lpSrcDIB);
DWORD dwBufferSize = GlobalSize(lpSrcDIB);
int nLineBytes = BytesPerLine(lpSrcDIB);
if(bHori)
{
for (y=0; y { lpPtr=(char *)lpbmi+(dwBufferSize-nLineBytes-y*nLineBytes)+1; lpTempPtr=(char *)lpSrcDIB+(dwBufferSize-nLineBytes-y*nLineBytes)+1; for (x=1; x { num0 = num = 0 ; for(i=0;i<3;i++) { num=(unsigned char)*(lpPtr+i-1); if(num > num0) num0 = num; } *lpTempPtr=(unsigned char)num0; /* 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 // Vertical { for (y=1; y { lpPtr=(char *)lpbmi+(dwBufferSize-nLineBytes-y*nLineBytes); lpTempPtr=(char *)lpSrcDIB+(dwBufferSize-nLineBytes-y*nLineBytes); for (x=0; x { num0 = num = 0 ; for(i=0;i<3;i++) { num=(unsigned char)*(lpPtr+i-1); if(num > num0) num0 = num; } *lpTempPtr=(unsigned char)num0; /*