📄 morphproc.cpp
字号:
//----------------------------------------------------------------------
//参数说明:int *nMask 结构元素数组指针
// int nMaskLen 结构元素长度(以点数为计数单位)
// unsigned char *pOut 输出图像数据指针
// unsigned char *pIn 输入图像数据指针
// int nWidthBytes 图像宽度(以字节表示)
// int nWidth 图像宽度(以像素表示)
// int nHeight 图像高度
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CMorphPro类中使用。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::MakeErosion(int *nMask, int nMaskLen,
unsigned char *pOut, unsigned char *pIn,
int nWidthBytes, int nWidth, int nHeight)
{
//若传入的图像数据为空,将无法完成操作,直接返回。
if(pOut == NULL || pIn == NULL) return FALSE;
//定义变量
int x, y, k;
unsigned char Mark;
//执行腐蚀操作
for( y = 0; y < nHeight; y++ )
{
unsigned char *pOutTemp = pOut;
pOutTemp += y * nWidthBytes;
for( x = 0; x < nWidth; x++ )
{
Mark = 1;
for (k = 0; k < nMaskLen; k++)
{
//不能处理边界像素
if ((x + nMask[2 * k] >= 0 ) &&
(x + nMask[2 * k] < nWidth) &&
(y + nMask[2 * k + 1] >= 0) &&
(y + nMask[2 * k + 1] < nHeight))
{
unsigned char Data;
//取与模板中位置相对应的像素值
unsigned char *pTemp = pIn;
pTemp += y * nWidthBytes;
pTemp += nMask[2 * k + 1] * nWidthBytes;
Data = pTemp[x + nMask[2 * k]];
if(Data != 255)
{
Mark = 0;
k = nMaskLen;
}
}
else
{
Mark = 0;
k = nMaskLen;
}
}
if (Mark == 1) pOutTemp[x] = 255;
}
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL MakeDilation()
//----------------------------------------------------------------------
//基本功能:本函数对图像数据执行膨胀操作。
//----------------------------------------------------------------------
//参数说明:int *nMask 结构元素数组指针
// int nMaskLen 结构元素长度(以点数为计数单位)
// unsigned char *pOut 输出图像数据指针
// unsigned char *pIn 输入图像数据指针
// int nWidthBytes 图像宽度(以字节表示)
// int nWidth 图像宽度(以像素表示)
// int nHeight 图像高度
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
//注 意:此函数声明为保护型,只能在CMorphPro类中使用。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::MakeDilation(int *nMask, int nMaskLen,
unsigned char *pOut, unsigned char *pIn,
int nWidthBytes, int nWidth, int nHeight)
{
//若传入的图像数据为空,将无法完成操作,直接返回。
if(pOut == NULL || pIn == NULL) return FALSE;
//定义变量
int x, y, k;
unsigned char Mark;
for( y = 0; y < nHeight; y++ )
{
unsigned char *pOutTemp = pOut;
pOutTemp += y * nWidthBytes;
for( x = 0; x < nWidth; x++ )
{
Mark = 0;
for (k = 0; k < nMaskLen; k++)
{
//不能处理边界像素
if ((x + nMask[2 * k] >= 0 ) &&
(x + nMask[2 * k] < nWidth) &&
(y + nMask[2 * k + 1] >= 0) &&
(y + nMask[2 * k + 1] < nHeight))
{
unsigned char Data;
//取模板中的像素值
unsigned char *pTemp = pIn;
pTemp += y * nWidthBytes;
pTemp += nMask[2 * k + 1] * nWidthBytes;
Data = pTemp[x + nMask[2 * k]];
if(Data == 255)
{
Mark = 1;
k = nMaskLen;
}
}
}
if (Mark == 1) pOutTemp[x] = 255;
}
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL Erosion()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行腐蚀运算。
//----------------------------------------------------------------------
//参数说明:int *nMask 结构元素数组指针
// int nMaskLen 结构元素长度(以点数为计数单位)
// CDibObject *pDibObject 输出图像数据指针
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::Erosion(int *nMask, int nMaskLen,
CDibObject *pDibObject)
{
//使用传入的CDibObject对象
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//无CDibObject对象, 返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//不是8位灰度图像
int nNumBits = m_pDibObject->GetNumBits();
if( nNumBits != 8 ) return( FALSE );
//获得图像宽度和高度及字节宽度
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
int nWidthBytes = m_pDibObject->WidthBytes(8, nWidth);
//图像数据区大小
DWORD dwSize = nWidthBytes * nHeight;
//获得图像数据区指针
unsigned char *pOldBuffer = GetBitsPoint();
//为新图像分配内存
HGLOBAL hNewDib = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );
if( hNewDib == NULL )
{
m_pDibObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
::GlobalUnlock( m_pDibObject->GetDib() );
return( FALSE );
}
//新图像数据指针
unsigned char *pNewBuffer = (unsigned char *) ::GlobalLock( hNewDib );
if (pNewBuffer == NULL || pOldBuffer == NULL)
{
AfxMessageBox("数据绶冲区定位出错!");
return (FALSE);
}
//将原图像数据移动到新图像中(原图像数据清零)
MoveBuffer(pNewBuffer, pOldBuffer, (LONG)dwSize);
//调用MakeErosion()保护型函数进行腐蚀操作
MakeErosion(nMask, nMaskLen, pOldBuffer, pNewBuffer, nWidthBytes, nWidth, nHeight);
//将内存解锁和将不再使用的内存释放
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL Dilation()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行膨胀运算。
//----------------------------------------------------------------------
//参数说明:int *nMask 结构元素数组指针
// int nMaskLen 结构元素长度(以点数为计数单位)
// CDibObject *pDibObject 输出图像数据指针
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::Dilation(int *nMask, int nMaskLen,
CDibObject *pDibObject)
{
//使用传入的CDibObject对象
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//无CDibObject对象, 返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//不是8位灰度图像
int nNumBits = m_pDibObject->GetNumBits();
if( nNumBits != 8 ) return( FALSE );
//获得图像宽度和高度
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
int nWidthBytes = m_pDibObject->WidthBytes(8, nWidth);
//图像数据区大小
DWORD dwSize = nWidthBytes * nHeight;
//获得图像数据区指针
unsigned char *pOldBuffer = GetBitsPoint();
//为新图像分配内存
HGLOBAL hNewDib = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );
if( hNewDib == NULL )
{
m_pDibObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
::GlobalUnlock( m_pDibObject->GetDib() );
return( FALSE );
}
//新图像数据指针
unsigned char *pNewBuffer = (unsigned char *) ::GlobalLock( hNewDib );
if (pNewBuffer == NULL || pOldBuffer == NULL)
{
AfxMessageBox("数据绶冲区定位出错!");
return (FALSE);
}
//将原图像数据移动到新图像中(原图像数据清零)
MoveBuffer(pNewBuffer, pOldBuffer, (LONG)dwSize);
//调用MakeDilation()保护型函数进行腐蚀操作
MakeDilation(nMask, nMaskLen, pOldBuffer, pNewBuffer, nWidthBytes, nWidth, nHeight);
//将内存解锁和将不再使用的内存释放
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL Opening()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行开运算。
//----------------------------------------------------------------------
//参数说明:int *nMask 结构元素数组指针
// int nMaskLen 结构元素长度(以点数为计数单位)
// CDibObject *pDibObject 输出图像数据指针
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::Opening(int *nMask, int nMaskLen,
CDibObject *pDibObject)
{
//对传入的CDibObject对象进行腐蚀
if(Erosion(nMask, nMaskLen, pDibObject) != TRUE) return( FALSE );
//检查结构元素是否对称
int nSumX = 0, nSumY = 0;
int i;
for(i = 0; i < nMaskLen; i++)
{
nSumX += nMask[2 * i];
nSumY += nMask[2 * i + 1];
}
//CString s;
//s.Format("nSumX=%d, nSumY=%d",nSumX, nSumY);
//AfxMessageBox(s);
if(nSumX != 0 || nSumY != 0)
{
for(i = 0; i < nMaskLen; i++)
{
nMask[2 * i] = -nMask[2 * i];
nMask[2 * i + 1] = -nMask[2 * i + 1];
}
}
//对传入的CDibObject对象进行膨胀
if(Dilation(nMask, nMaskLen, pDibObject) != TRUE) return( FALSE );
return(TRUE);
}
////////////////////////////////////////////////////////////////////////
//BOOL Closing()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行闭运算。
//----------------------------------------------------------------------
//参数说明:int *nMask 结构元素数组指针
// int nMaskLen 结构元素长度(以点数为计数单位)
// CDibObject *pDibObject 输出图像数据指针
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::Closing(int *nMask, int nMaskLen,
CDibObject *pDibObject)
{
//对传入的CDibObject对象进行膨胀
if(Dilation(nMask, nMaskLen, pDibObject) != TRUE) return( FALSE );
//检查结构元素是否对称
int nSumX = 0, nSumY = 0;
int i;
for(i = 0; i < nMaskLen; i++)
{
nSumX += nMask[2 * i];
nSumY += nMask[2 * i + 1];
}
if(nSumX != 0 || nSumY != 0)
{
for(i = 0; i < nMaskLen; i++)
{
nMask[2 * i] = -nMask[2 * i];
nMask[2 * i + 1] = -nMask[2 * i + 1];
}
}
//对传入的CDibObject对象进行腐蚀
if(Erosion(nMask, nMaskLen, pDibObject) != TRUE) return( FALSE );
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL Closing()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -