www.pudn.com > FingerPro.rar > morph.cpp


// ************************************************************************ 
//  文件名:morph.cpp 
// 
//  图像形态学变换API函数库: 
// 
//  ErosionDIB()    - 图像腐蚀 
//  DilationDIB()	- 图像膨胀 
//  OpenDIB()		- 图像开运算 
//  CloseDIB()		- 图像闭运算 
//  ThiningDIB()	- 图像细化 
// 
// ************************************************************************ 
 
 
#include "stdafx.h" 
#include "morph.h" 
#include "DIBAPI.h" 
 
#include  
#include  
 
/************************************************************************* 
 * 
 * 函数名称: 
 *   ErosiontionDIB() 
 * 
 * 参数: 
 *   LPSTR lpDIBBits    - 指向源DIB图像指针 
 *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数) 
 *   LONG  lHeight      - 源图像高度(象素数) 
 *   int   nMode		- 腐蚀方式,0表示水平方向,1表示垂直方向,2表示自定义结构元素。 
 *	 int   structure[3][3] 
						- 自定义的3×3结构元素。 
 * 
 * 返回值: 
 *   BOOL               - 腐蚀成功返回TRUE,否则返回FALSE。 
 * 
 * 说明: 
 * 该函数用于对图像进行腐蚀运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点; 
 * 或者由用户自己定义3×3的结构元素。 
 *  
 * 要求目标图像为只有0和255两个灰度值的灰度图像。 
 ************************************************************************/ 
 
BOOL WINAPI ErosionDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, int nMode , int structure[3][3]) 
{ 
	 
	// 指向源图像的指针 
	LPSTR	lpSrc; 
	 
	// 指向缓存图像的指针 
	LPSTR	lpDst; 
	 
	// 指向缓存DIB图像的指针 
	LPSTR	lpNewDIBBits; 
	HLOCAL	hNewDIBBits; 
 
	//循环变量 
	long i; 
	long j; 
	int  n; 
	int  m; 
 
	//像素值 
	unsigned char pixel; 
 
	// 暂时分配内存,以保存新图像 
	hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight); 
 
	if (hNewDIBBits == NULL) 
	{ 
		// 分配内存失败 
		return FALSE; 
	} 
	 
	// 锁定内存 
	lpNewDIBBits = (char * )LocalLock(hNewDIBBits); 
 
	// 初始化新分配的内存,设定初始值为255 
	lpDst = (char *)lpNewDIBBits; 
	memset(lpDst, (BYTE)255, lWidth * lHeight); 
 
 
	if(nMode == 0) 
	{ 
		//使用水平方向的结构元素进行腐蚀 
		for(j = 0; j