📄 morphproc.cpp
字号:
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行击中击不中变换。
//----------------------------------------------------------------------
//参数说明:int *nHmask 击中结构元素数组指针
// int nHmaskLen 击中结构元素长度(点数)
// int *nMmask 击不中结构元素数组指针
// int nMmaskLen 击不中结构元素长度(点数)
// CDibObject *pDibObject 默认为NULL。
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::HitMissTran(int *nHmask, int nHmaskLen,
int *nMmask, int nMmaskLen,
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, 2 * 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);
}
//复制图像数据
CopyBuffer(pNewBuffer + dwSize, pOldBuffer, (LONG)dwSize);
//击中变换
MoveBuffer(pNewBuffer, pOldBuffer, (LONG)dwSize);
MakeErosion(nHmask, nHmaskLen, pOldBuffer, pNewBuffer, nWidthBytes, nWidth, nHeight);
//击不中变换
ReverseBuffer(pNewBuffer + dwSize, (LONG)dwSize);
MoveBuffer(pNewBuffer, pNewBuffer + dwSize, (LONG)dwSize);
MakeErosion(nMmask, nMmaskLen, pNewBuffer + dwSize, pNewBuffer, nWidthBytes,
nWidth, nHeight);
//求交集
AndBuffer(pOldBuffer, pNewBuffer + dwSize, (LONG)dwSize);
//将内存解锁和将不再使用的内存释放
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL Thining()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行薄化运算。
//----------------------------------------------------------------------
//参数说明:int *nHmask 击中结构元素数组指针
// int nHmaskLen 击中结构元素长度(点数)
// int *nMmask 击不中结构元素数组指针
// int nMmaskLen 击不中结构元素长度(点数)
// CDibObject *pDibObject 默认为NULL。
// BOOL *bIsBlank 结果是否为全黑。
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::Thining(int *nHmask, int nHmaskLen,
int *nMmask, int nMmaskLen,
CDibObject *pDibObject,
BOOL *bIsBlank)
{
//使用传入的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, 3 * 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);
}
//复制图像数据
CopyBuffer(pNewBuffer + dwSize, pOldBuffer, (LONG)dwSize);
CopyBuffer(pNewBuffer + 2 * dwSize, pOldBuffer, (LONG)dwSize);
//击中变换
MoveBuffer(pNewBuffer, pOldBuffer, (LONG)dwSize);
MakeErosion(nHmask, nHmaskLen, pOldBuffer, pNewBuffer, nWidthBytes, nWidth, nHeight);
//击不中变换
ReverseBuffer(pNewBuffer + dwSize, (LONG)dwSize);
MoveBuffer(pNewBuffer, pNewBuffer + dwSize, (LONG)dwSize);
MakeErosion(nMmask, nMmaskLen, pNewBuffer + dwSize, pNewBuffer, nWidthBytes,
nWidth, nHeight);
//求交集
AndBuffer(pOldBuffer, pNewBuffer + dwSize, (LONG)dwSize);
//用原图像减去击中击不中后的图像
XorBuffer(pOldBuffer, pNewBuffer + 2 * dwSize, (LONG)dwSize);
XorBuffer(pNewBuffer + 2 * dwSize, pOldBuffer, (LONG)dwSize);
*bIsBlank = IsResultBlank(pNewBuffer + 2 * dwSize, (LONG)dwSize);
//将内存解锁和将不再使用的内存释放
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL Thicking()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行厚化运算。
//----------------------------------------------------------------------
//参数说明:int *nHmask 击中结构元素数组指针
// int nHmaskLen 击中结构元素长度(点数)
// int *nMmask 击不中结构元素数组指针
// int nMmaskLen 击不中结构元素长度(点数)
// CDibObject *pDibObject 默认为NULL。
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::Thicking(int *nHmask, int nHmaskLen,
int *nMmask, int nMmaskLen,
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, 3 * 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);
}
//复制图像数据
CopyBuffer(pNewBuffer + dwSize, pOldBuffer, (LONG)dwSize);
CopyBuffer(pNewBuffer + 2 * dwSize, pOldBuffer, (LONG)dwSize);
//击中变换
MoveBuffer(pNewBuffer, pOldBuffer, (LONG)dwSize);
MakeErosion(nHmask, nHmaskLen, pOldBuffer, pNewBuffer, nWidthBytes, nWidth, nHeight);
//击不中变换
ReverseBuffer(pNewBuffer + dwSize, (LONG)dwSize);
MoveBuffer(pNewBuffer, pNewBuffer + dwSize, (LONG)dwSize);
MakeErosion(nMmask, nMmaskLen, pNewBuffer + dwSize, pNewBuffer, nWidthBytes,
nWidth, nHeight);
//求交集
AndBuffer(pOldBuffer, pNewBuffer + dwSize, (LONG)dwSize);
//用原图像并上击中击不中变换后的图像
OrBuffer(pOldBuffer, pNewBuffer + 2 * dwSize, (LONG)dwSize);
//将内存解锁和将不再使用的内存释放
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL OutEdge()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行外边界检测。
//----------------------------------------------------------------------
//参数说明:int *nmask 击中结构元素数组指针
// int nmaskLen 击中结构元素长度(点数)
// CDibObject *pDibObject 默认为NULL。
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::OutEdge(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, 2 * 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);
}
//复制图像数据
CopyBuffer(pNewBuffer + dwSize, pOldBuffer, (LONG)dwSize);
//膨胀
MoveBuffer(pNewBuffer, pOldBuffer, (LONG)dwSize);
MakeDilation(nMask, nMaskLen, pOldBuffer, pNewBuffer, nWidthBytes, nWidth, nHeight);
//用膨胀后的结果减原图
XorBuffer(pOldBuffer, pNewBuffer + dwSize, (LONG)dwSize);
//将内存解锁和将不再使用的内存释放
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalUnlock( hNewDib );
::GlobalFree( hNewDib );
return( TRUE );
}
////////////////////////////////////////////////////////////////////////
//BOOL InEdge()
//----------------------------------------------------------------------
//基本功能:本函数对CDibObject对象中的图象进行内边界检测。
//----------------------------------------------------------------------
//参数说明:int *nmask 击中结构元素数组指针
// int nmaskLen 击中结构元素长度(点数)
// CDibObject *pDibObject 默认为NULL。
//----------------------------------------------------------------------
//返 回:BOOL
// 成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CMorphPro::InEdge(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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -