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

📄 morphproc.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//----------------------------------------------------------------------
//基本功能:本函数对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 + -