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

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

?? morph.cpp

?? 串口通信工程實例
?? 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一区二区三区免费野_久草精品视频
亚洲国产精品久久艾草纯爱| 亚洲国产日产av| 国产精品国产三级国产三级人妇| 亚洲免费视频中文字幕| 精品写真视频在线观看 | 中文字幕在线视频一区| 亚洲丶国产丶欧美一区二区三区| 国产另类ts人妖一区二区| 91九色02白丝porn| 久久久www免费人成精品| 亚洲bt欧美bt精品| 91小宝寻花一区二区三区| 久久久久亚洲蜜桃| 蜜臀av性久久久久蜜臀aⅴ流畅 | 免费成人av在线播放| 国产99久久久精品| 亚洲国产另类精品专区| 精品国产乱码久久久久久闺蜜| 美美哒免费高清在线观看视频一区二区 | 亚洲影视在线播放| 日韩精品色哟哟| 在线观看网站黄不卡| 欧美激情艳妇裸体舞| 久久99国产精品麻豆| 制服丝袜国产精品| 午夜不卡av免费| 91免费观看视频| 亚洲欧洲精品一区二区三区| 国产精品一区2区| 精品国产一区二区三区久久影院| 日韩电影免费一区| 91精品国产综合久久国产大片| 亚洲国产欧美日韩另类综合| 色综合久久66| 夜夜精品视频一区二区| 欧美激情一二三区| 久久99九九99精品| 2020国产精品自拍| 国产成人三级在线观看| 日韩美女视频在线| 日韩欧美综合在线| 91麻豆国产在线观看| 国产精品综合在线视频| 久久精品国产久精国产爱| 99久久99久久精品免费观看 | 亚洲成a人片在线不卡一二三区 | 精品处破学生在线二十三| 欧美日韩国产经典色站一区二区三区| caoporn国产精品| 色综合久久中文字幕综合网| 一本色道a无线码一区v| 欧美色视频在线观看| 精品1区2区在线观看| 成人一级黄色片| 不卡的av在线播放| 欧洲亚洲精品在线| 精品剧情v国产在线观看在线| 欧美一区二区三区视频| 国产日韩欧美不卡| 一个色妞综合视频在线观看| 亚洲福利一二三区| 午夜视频一区在线观看| 国产69精品一区二区亚洲孕妇| 成人丝袜18视频在线观看| 欧美成人精精品一区二区频| 亚洲图片欧美色图| 麻豆中文一区二区| 中文字幕欧美国产| 国产成人免费视频网站| 国产精品午夜免费| 日韩欧美国产综合一区| 免费在线一区观看| 亚洲美女免费视频| 成人亚洲一区二区一| 亚洲欧美日韩人成在线播放| 免费精品视频最新在线| 欧美日韩美少妇| 蜜桃av一区二区在线观看| 亚洲高清免费在线| 亚洲免费大片在线观看| 蜜桃精品在线观看| 亚洲人成精品久久久久久| 日韩一级黄色大片| 欧美在线观看一区| 狠狠色狠狠色综合| 亚洲欧美激情小说另类| 久久久久久久综合日本| 欧美一级生活片| 亚洲最大色网站| 成人av在线影院| 中文字幕一区二区三区四区不卡| 国产二区国产一区在线观看| 国产精品久久久久久久久晋中| 久久成人免费日本黄色| 精品噜噜噜噜久久久久久久久试看| 欧美日韩一区中文字幕| 亚洲国产日韩精品| 在线观看一区不卡| av在线播放不卡| 国产一区二区日韩精品| 奇米四色…亚洲| 亚洲国产一区二区视频| 亚洲欧美日韩系列| 中文字幕视频一区二区三区久| 精品国产网站在线观看| 这里只有精品免费| 欧美一区二区高清| 日韩一级精品视频在线观看| 欧美日韩成人高清| 欧美丰满少妇xxxxx高潮对白| 欧美日韩精品三区| 欧美日韩中文字幕一区二区| 97久久精品人人爽人人爽蜜臀| 国产成人高清视频| 国产aⅴ精品一区二区三区色成熟| 久久国产精品99久久人人澡| 麻豆精品在线视频| 国产一区二区三区蝌蚪| 国产自产2019最新不卡| 国产精品99久久久久| 国产麻豆视频一区二区| 国产成人免费视频| 99视频有精品| 在线精品亚洲一区二区不卡| 欧洲av一区二区嗯嗯嗯啊| 欧美视频在线播放| 欧美一区二区精美| 日韩一区二区高清| 26uuu精品一区二区| 国产精品系列在线| 亚洲一区二区三区国产| 日韩国产成人精品| 蜜桃久久久久久| 国产成人精品午夜视频免费 | 91亚洲国产成人精品一区二三| 色综合久久中文综合久久牛| 欧美亚洲国产一区在线观看网站| 欧美人xxxx| 久久日韩精品一区二区五区| 国产精品嫩草影院av蜜臀| 亚洲女爱视频在线| 日韩精品91亚洲二区在线观看| 韩国一区二区三区| jvid福利写真一区二区三区| 欧美视频一二三区| 久久久久国产免费免费| 亚洲乱码一区二区三区在线观看| 丝袜美腿亚洲色图| 国产精品一区久久久久| 色婷婷av一区二区三区之一色屋| 日韩欧美黄色影院| 一区二区中文视频| 日本三级亚洲精品| av亚洲产国偷v产偷v自拍| 欧美人动与zoxxxx乱| 国产精品久久久久久久久图文区| 亚洲国产你懂的| 国产91综合一区在线观看| 欧美视频你懂的| 国产精品久久三区| 久久精品国产99| 91精品福利视频| 国产欧美一区二区三区沐欲| 亚洲第一av色| av一区二区三区四区| 精品对白一区国产伦| 亚洲国产毛片aaaaa无费看 | 国产精品高潮久久久久无| 日韩高清欧美激情| 色哦色哦哦色天天综合| 国产亚洲综合色| 日本成人在线不卡视频| 91电影在线观看| 国产精品嫩草99a| 国产自产视频一区二区三区| 色综合天天综合网天天狠天天| 亚洲精品一区二区三区蜜桃下载 | 国内成+人亚洲+欧美+综合在线 | 欧美亚洲综合色| 日韩美女天天操| 亚洲私人影院在线观看| 免播放器亚洲一区| 日韩国产一二三区| 亚洲欧美日韩久久精品| 日韩免费电影网站| 蜜臀av性久久久久蜜臀aⅴ | 26uuu精品一区二区| 欧美精品一区二区三区在线播放| 色美美综合视频| 亚洲男女一区二区三区| 717成人午夜免费福利电影| 狠狠狠色丁香婷婷综合激情| 亚洲第一精品在线| 精品1区2区3区| 成人免费视频网站在线观看| 亚洲成av人片观看| 777精品伊人久久久久大香线蕉| 国产精品一级片| 亚洲成人一区二区| 日韩一区二区免费在线电影|