亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? morph.cpp

?? 《Visual C++數字圖像處理》配套源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// ************************************************************************
//  文件名:morph.cpp
//
//  圖像形態學變換API函數庫:
//
//  ErosionDIB()    - 圖像腐蝕
//  DilationDIB()	- 圖像膨脹
//  OpenDIB()		- 圖像開運算
//  CloseDIB()		- 圖像閉運算
//  ThiningDIB()	- 圖像細化
//
// ************************************************************************


#include "stdafx.h"
#include "morph.h"
#include "DIBAPI.h"

#include <math.h>
#include <direct.h>

/*************************************************************************
 *
 * 函數名稱:
 *   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 <lHeight; j++)
		{
			for(i = 1;i <lWidth-1; i++)
			{
				//由于使用1×3的結構元素,為防止越界,所以不處理最左邊和最右邊的兩列像素

				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && *lpSrc != 0)
					return FALSE;
				
				//目標圖像中的當前點先賦成黑色
				*lpDst = (unsigned char)0;

				//如果源圖像中當前點自身或者左右有一個點不是黑色,
				//則將目標圖像中的當前點賦成白色
				for (n = 0;n < 3;n++ )
				{
					pixel = *(lpSrc+n-1);
					if (pixel == 255 )
					{
						*lpDst = (unsigned char)255;
						break;
					}
				}
				
			}
		}

	}
	else if(nMode == 1)
	{
		//使用垂直方向的結構元素進行腐蝕
		for(j = 1; j <lHeight-1; j++)
		{
			for(i = 0;i <lWidth; i++)
			{
				//由于使用1×3的結構元素,為防止越界,所以不處理最上邊和最下邊的兩列像素

				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && *lpSrc != 0)
					return FALSE;

				//目標圖像中的當前點先賦成黑色
				*lpDst = (unsigned char)0;

				//如果源圖像中當前點自身或者上下有一個點不是黑色,
				//則將目標圖像中的當前點賦成白色
				for (n = 0;n < 3;n++ )
				{
					pixel = *(lpSrc+(n-1)*lWidth);
					if (pixel == 255 )
					{
						*lpDst = (unsigned char)255;
						break;
					}
				}
				
			}
		}

	}
	else
	{
		//使用自定義的結構元素進行腐蝕
		for(j = 1; j <lHeight-1; j++)
		{
			for(i = 0;i <lWidth; i++)
			{
				//由于使用3×3的結構元素,為防止越界,所以不處理最左邊和最右邊的兩列像素
				//和最上邊和最下邊的兩列像素
				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && *lpSrc != 0)
					return FALSE;

				//目標圖像中的當前點先賦成黑色
				*lpDst = (unsigned char)0;

				//如果原圖像中對應結構元素中為黑色的那些點中有一個不是黑色,
				//則將目標圖像中的當前點賦成白色
				//注意在DIB圖像中內容是上下倒置的
				for (m = 0;m < 3;m++ )
				{
					for (n = 0;n < 3;n++)
					{
						if( structure[m][n] == -1)
							continue;
						pixel = *(lpSrc + ((2-m)-1)*lWidth + (n-1));
						if (pixel == 255 )
						{	
							*lpDst = (unsigned char)255;
							break;
						}
					}
				}
				
			}
		}

	}
	// 復制腐蝕后的圖像
	memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

	// 釋放內存
	LocalUnlock(hNewDIBBits);
	LocalFree(hNewDIBBits);

	// 返回
	return TRUE;
}




/*************************************************************************
 *
 * 函數名稱:
 *   DilationDIB()
 *
 * 參數:
 *   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 DilationDIB(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 <lHeight; j++)
		{
			for(i = 1;i <lWidth-1; i++)
			{
				//由于使用1×3的結構元素,為防止越界,所以不處理最左邊和最右邊的兩列像素

				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && pixel != 0)
					return FALSE;
				
				//目標圖像中的當前點先賦成白色
				*lpDst = (unsigned char)255;

				//源圖像中當前點自身或者左右只要有一個點是黑色,
				//則將目標圖像中的當前點賦成黑色
				for (n = 0;n < 3;n++ )
				{
					pixel = *(lpSrc+n-1);
					if (pixel == 0 )
					{
						*lpDst = (unsigned char)0;
						break;
					}
				}
				
			}
		}

	}
	else if(nMode == 1)
	{
		//使用垂直方向的結構元素進行膨脹
		for(j = 1; j <lHeight-1; j++)
		{
			for(i = 0;i <lWidth; i++)
			{
				//由于使用1×3的結構元素,為防止越界,所以不處理最上邊和最下邊的兩列像素

				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && *lpSrc != 0)
					return FALSE;

				//目標圖像中的當前點先賦成白色
				*lpDst = (unsigned char)255;

				//源圖像中當前點自身或者上下只要有一個點是黑色,
				//則將目標圖像中的當前點賦成黑色
				for (n = 0;n < 3;n++ )
				{
					pixel = *(lpSrc+(n-1)*lWidth);
					if (pixel == 0 )
					{
						*lpDst = (unsigned char)0;
						break;
					}
				}
				
			}
		}

	}
	else
	{
		//使用自定義的結構元素進行膨脹
		for(j = 1; j <lHeight-1; j++)
		{
			for(i = 0;i <lWidth; i++)
			{
				//由于使用3×3的結構元素,為防止越界,所以不處理最左邊和最右邊的兩列像素
				//和最上邊和最下邊的兩列像素
				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && *lpSrc != 0)
					return FALSE;

				//目標圖像中的當前點先賦成白色
				*lpDst = (unsigned char)255;

				//原圖像中對應結構元素中為黑色的那些點中只要有一個是黑色,
				//則將目標圖像中的當前點賦成黑色
				//注意在DIB圖像中內容是上下倒置的
				for (m = 0;m < 3;m++ )
				{
					for (n = 0;n < 3;n++)
					{
						if( structure[m][n] == -1)
							continue;
						pixel = *(lpSrc + ((2-m)-1)*lWidth + (n-1));
						if (pixel == 0 )
						{	
							*lpDst = (unsigned char)0;
							break;
						}
					}
				}
				
			}
		}

	}
	// 復制膨脹后的圖像
	memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);

	// 釋放內存
	LocalUnlock(hNewDIBBits);
	LocalFree(hNewDIBBits);

	// 返回
	return TRUE;
}





/*************************************************************************
 *
 * 函數名稱:
 *   OpenDIB()
 *
 * 參數:
 *   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 OpenDIB(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 <lHeight; j++)
		{
			for(i = 1;i <lWidth-1; i++)
			{
				//由于使用1×3的結構元素,為防止越界,所以不處理最左邊和最右邊的兩列像素

				// 指向源圖像倒數第j行,第i個象素的指針			
				lpSrc = (char *)lpDIBBits + lWidth * j + i;

				// 指向目標圖像倒數第j行,第i個象素的指針			
				lpDst = (char *)lpNewDIBBits + lWidth * j + i;

				//取得當前指針處的像素值,注意要轉換為unsigned char型
				pixel = (unsigned char)*lpSrc;

				//目標圖像中含有0和255外的其它灰度值
				if(pixel != 255 && *lpSrc != 0)
					return FALSE;
				
				//目標圖像中的當前點先賦成黑色
				*lpDst = (unsigned char)0;

				//如果源圖像中當前點自身或者左右有一個點不是黑色,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
69久久99精品久久久久婷婷 | 欧美日韩中文一区| 欧美一区二区福利在线| 国产精品嫩草影院com| 天堂在线一区二区| 91在线播放网址| www欧美成人18+| 亚洲成人av一区| 91麻豆福利精品推荐| 欧美精品一区二区三区久久久| 亚洲网友自拍偷拍| 日本高清不卡一区| 亚洲素人一区二区| 成人动漫视频在线| 国产欧美一区二区三区在线看蜜臀| 欧美aa在线视频| 男男视频亚洲欧美| 一本大道久久a久久综合婷婷| 精品88久久久久88久久久| 天堂蜜桃一区二区三区| 在线精品亚洲一区二区不卡| 亚洲欧美综合色| 成人免费视频网站在线观看| 国产日产亚洲精品系列| 蓝色福利精品导航| 精品免费日韩av| 激情六月婷婷综合| 精品国产伦一区二区三区免费 | 亚洲国产精品嫩草影院| 91亚洲精品久久久蜜桃网站| 国产欧美一区二区精品婷婷| 国产乱色国产精品免费视频| 精品处破学生在线二十三| 久久av资源网| 久久毛片高清国产| 成人免费视频播放| 亚洲视频小说图片| 欧美亚洲国产一卡| 美女爽到高潮91| 久久免费美女视频| 成人动漫精品一区二区| 亚洲欧美偷拍三级| 欧美三级三级三级| 美女性感视频久久| 欧美国产一区在线| 欧洲视频一区二区| 天天色图综合网| 日韩视频一区二区三区| 韩国精品主播一区二区在线观看| 精品成人免费观看| 99在线精品观看| 日韩精品午夜视频| 国产亚洲成aⅴ人片在线观看| 成人精品国产一区二区4080| 亚洲视频综合在线| 欧美电影一区二区三区| 国产一区二区成人久久免费影院 | 欧美xxxxx牲另类人与| 国产精品综合一区二区| 综合久久久久久| 在线不卡a资源高清| 国产精品系列在线观看| 一区二区在线观看视频 | 精品中文字幕一区二区小辣椒| 久久影院午夜论| 91性感美女视频| 麻豆精品国产91久久久久久| 欧美经典一区二区| 欧美日韩国产小视频在线观看| 国产毛片精品一区| 怡红院av一区二区三区| 777午夜精品视频在线播放| 国产成人精品免费看| 亚洲高清三级视频| 中文字幕成人在线观看| 欧美肥胖老妇做爰| 91香蕉视频黄| 国产一区二区三区久久悠悠色av| 亚洲精品免费一二三区| 久久亚洲欧美国产精品乐播| 欧美日韩一本到| 99久久国产综合色|国产精品| 日韩av网站免费在线| 亚洲乱码国产乱码精品精98午夜| 精品奇米国产一区二区三区| 91国产成人在线| www.视频一区| 精品一区二区三区在线观看国产| 亚洲一区二区3| 亚洲色图.com| 国产精品三级在线观看| 久久久久久久网| 精品88久久久久88久久久| 67194成人在线观看| 欧美午夜精品久久久久久孕妇| 成人黄色一级视频| 国产乱对白刺激视频不卡| 美女任你摸久久| 免费在线看一区| 青青草国产成人av片免费| 亚洲成av人综合在线观看| 亚洲欧美日韩国产综合| 国产精品嫩草影院com| 国产精品视频在线看| 国产日韩欧美亚洲| 欧美激情综合五月色丁香| 久久精品在这里| 中文字幕av一区二区三区高 | 欧美亚洲日本国产| 色欧美日韩亚洲| 色狠狠一区二区三区香蕉| 91亚洲大成网污www| 91丨九色porny丨蝌蚪| 91婷婷韩国欧美一区二区| 91在线一区二区| 在线观看视频一区二区| 欧美专区亚洲专区| 精品视频在线视频| 日韩一区二区三区四区五区六区| 制服丝袜中文字幕亚洲| 欧美一区二区三区小说| 日韩一级高清毛片| 久久先锋影音av鲁色资源| 国产人成一区二区三区影院| 国产精品久线在线观看| 一区2区3区在线看| 无码av免费一区二区三区试看| 亚洲成人先锋电影| 久久99久久久久久久久久久| 国产高清在线精品| 色哟哟亚洲精品| 欧美精品第1页| 2019国产精品| 1024亚洲合集| 亚洲1区2区3区视频| 老司机精品视频线观看86| 国产激情视频一区二区在线观看| 成av人片一区二区| 欧美精品丝袜久久久中文字幕| 欧美一区二区三区系列电影| 国产午夜精品美女毛片视频| 亚洲精品久久久蜜桃| 日韩精品高清不卡| 国产91丝袜在线播放九色| 欧美亚洲尤物久久| 久久久三级国产网站| 亚洲综合色在线| 国产毛片精品国产一区二区三区| 色噜噜狠狠色综合中国| 精品国产一二三区| 亚洲欧美欧美一区二区三区| 日本不卡一二三区黄网| 99久久综合色| 日韩欧美精品在线| 亚洲精品视频在线看| 国产真实乱偷精品视频免| 在线观看亚洲精品| 国产日韩欧美精品在线| 日本成人在线看| 91在线小视频| 国产三级精品在线| 婷婷激情综合网| 一本大道久久精品懂色aⅴ| 精品盗摄一区二区三区| 天天综合网天天综合色| 99久久99久久精品免费看蜜桃| 日韩欧美成人激情| 一卡二卡三卡日韩欧美| 成人h动漫精品一区二区| 日韩精品一区国产麻豆| 五月婷婷久久丁香| 色老汉av一区二区三区| 欧美激情综合网| 极品美女销魂一区二区三区免费| 精品视频1区2区| 亚洲激情自拍偷拍| 91蜜桃免费观看视频| 久久久噜噜噜久噜久久综合| 免费黄网站欧美| 欧美日韩国产综合一区二区三区 | 久久成人免费网站| 欧美日韩一区中文字幕| 亚洲视频一区在线| 99久久免费视频.com| 国产欧美一区二区精品婷婷| 麻豆国产91在线播放| 91精品国产色综合久久不卡蜜臀| 一区二区三区四区高清精品免费观看 | 夜夜精品浪潮av一区二区三区| 国产电影一区在线| 久久久夜色精品亚洲| 久久99在线观看| 日韩视频免费直播| 精品写真视频在线观看| 日韩精品中文字幕在线不卡尤物| 日韩av中文在线观看| 欧美丰满少妇xxxbbb| 麻豆一区二区99久久久久| 欧美电影免费观看高清完整版在线 | 欧美日韩一区成人|