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

📄 morphproc.cpp

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