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

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

?? imageanalysis.cpp

?? 提供了圖像識別
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include "stdafx.h"
#include "GlobalApi.h"
#include "Cdib.h"

#include <io.h>
#include <errno.h>

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


/*************************************************************************
 *
 * 函數名稱:
 *   DIBHOLENUMBER()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib類的指針
 *
 * 返回值:
 *   BOOL               - 成功返回True,否則返回False。
 *
 * 說明:
 *   該函數將消去圖象中面積小于閾值的小區域
 *
 *************************************************************************/

BOOL DIBHOLENUMBER(CDib *pDib)
{
	// 指向源圖像的指針
	BYTE *	lpSrc;

	//圖象的寬度和高度
	LONG    lWidth;
	LONG    lHeight;

	// 圖像每行的字節數
	LONG	lLineBytes;
	
	//得到圖象的寬度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth  = SizeDim.cx;
	lHeight = SizeDim.cy;	
	
	//得到實際的Dib圖象存儲大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 計算圖像每行的字節數
	lLineBytes = SizeRealDim.cx;
	
	//圖像數據的指針
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 循環變量
	int i, j, s, n;

	// 空穴的數目以及面積閾值
	int nHoleNum, nMinArea;

	int nBlackPix, temp;

	// 正向和反響傳播標志
	int nDir1,nDir2;

	// 用來存儲的一位數組
	int *pnBinary;

	pnBinary =new int[lHeight*lLineBytes];

	// 小區域的閾值面積為20個象素點
	nMinArea = 50;

	// 將圖象二值化
	for (j = 0; j < lHeight; j++)
	{
		for(i = 0; i < lWidth; i++)
		{
			// 指向源圖像倒數第j行,第i個象素的指針			
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;

			// 白色象素為背景,存成0
			if(*lpSrc > 200)
			{
				pnBinary[lLineBytes * j + i] = 0;
			}
			// 黑象素存成-1
			else
			{
				pnBinary[lLineBytes * j + i] = -1;
			}
		}		
	}
	
	// 空穴數賦初值
	nHoleNum = 1;
	
	do
	{
		s=0;
		
		// 尋找每個空穴的初始象素值 
		for (j = 1; j < lHeight - 1; j++)
		{
			for(i = 1; i < lWidth - 1; i++)
			{
				// 找到初始象素
				if(pnBinary[lLineBytes * j + i] == -1)
				{
					s = 1;
					// 將象素值改成當前的空穴數值
					pnBinary[lLineBytes * j + i] = nHoleNum;
					
					// 跳出循環
					j = lHeight;			
					i = lLineBytes;
				}
			}
		}

		//沒有初始象素,跳出循環
		if(s == 0)
			break;
		else
		{
			do
			{
				// 正向和反響傳播系數賦初值0
				nDir1 = 0;
				nDir2 = 0;

				// 正向掃描
				for (j = 1; j < lHeight-1; j++)
				{
					for(i = 1; i < lWidth-1; i++)
					{
						nBlackPix = pnBinary[lLineBytes * j + i];
						
						// 如果象素已經被掃描,或者是背景色,進行下一個循環
						if(nBlackPix != -1)
							continue;

						// 如果上側或者左側的象素值已經被掃描,且屬于當前的空穴,當前的象素值
						// 改成空穴的數值
						nBlackPix=pnBinary[lLineBytes * (j-1) + i];
						if(nBlackPix == nHoleNum)
						{
							pnBinary[lLineBytes * j + i] = nHoleNum;
							nDir1 = 1;
							
							continue;
						}

						nBlackPix =pnBinary[lLineBytes * j + i - 1];						
						if(nBlackPix == nHoleNum)
						{
							pnBinary[lLineBytes * j + i] = nHoleNum;
							nDir1 = 1;
						}
					
					}
				}

				// 正向象素全部被掃描,跳出循環
				if(nDir1 == 0)
					break;

				// 反向掃描
				for (j = lHeight-2; j >= 1 ; j--)
				{
					for(i = lWidth-2; i >= 1 ; i--)
					{
						nBlackPix = pnBinary[lLineBytes * j + i];						
						
						// 如果象素已經被掃描,或者是背景色,進行下一個循環
						if(nBlackPix != -1)
							continue;

						// 如果下側或者右側的象素值已經被掃描,且屬于當前的空穴,當前的象素值
						// 改成空穴的數值
						nBlackPix=pnBinary[lLineBytes * (j+1) + i];
						if(nBlackPix == nHoleNum)
						{
							pnBinary[lLineBytes * j + i] = nHoleNum;
							nDir2 = 1;
							
							continue;
						}

						nBlackPix =pnBinary[lLineBytes * j + i + 1];						
						if(nBlackPix == nHoleNum)
						{
							pnBinary[lLineBytes * j + i] = nHoleNum;
							nDir2 = 1;
						}
					}
				}

				if(nDir2 == 0)
					break;
			}
			while(1);
		}
		// 空穴數增加
		nHoleNum++;
	}
	while(1);

	nHoleNum -- ;

	// 尋找面積小于閾值的空穴區域
	for(n = 1; n <= nHoleNum; n++)
	{
		s = 0;
		
		for (j = 0; j < lHeight - 1; j++)
		{
			for(i = 0; i < lWidth - 1; i++)
			{
				nBlackPix =pnBinary[lLineBytes * j + i];
				
				if(nBlackPix == n)
					s++;

				// 如果區域面積已經大于閾值,跳出循環
				if(s > nMinArea)
					break;
			}

			if(s > nMinArea)
					break;
		}

		// 小于閾值的區域,賦以與背景一樣的顏色,進行消去
		if(s <= nMinArea)
		{			
			for (j = 0; j < lHeight - 1; j++)
			{
				for(i = 0; i < lWidth - 1; i++)
				{
					nBlackPix =pnBinary[lLineBytes * j + i + 1];
				
					if(nBlackPix == n)
					{
						pnBinary[lLineBytes * j + i + 1] = 0;
					}			

				}
			}

		}

	}

	// 存儲象素值,輸出
	for(j = 0; j < lHeight; j++)
	{
		// 列
		for(i = 0; i < lWidth; i++)
		{
			// 二值圖象
		    temp = pnBinary[j * lLineBytes + i] ;
			
			// 指向位圖i行j列象素的指針
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * j + i;
			
			// 更新源圖像
			if(temp != 0)
				* (lpSrc) = 0;
			else
				* (lpSrc) = 255;
		}
	}

	delete pnBinary;

	return true;
}

/*************************************************************************
 *
 * 函數名稱:
 *   DIBMOMENT()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib類的指針
 *
 * 返回值:
 *   BOOL               - 成功返回True,否則返回False。
 *
 * 說明:
 *   該函數計算圖象的力矩。
 *
 *************************************************************************/
BOOL DIBMOMENT(CDib *pDib)
{
	// 指向源圖像的指針
	BYTE *	lpSrc;

	//圖象的寬度和高度
	LONG    lWidth;
	LONG    lHeight;

	// 圖像每行的字節數
	LONG	lLineBytes;
	
	//得到圖象的寬度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth  = SizeDim.cx;
	lHeight = SizeDim.cy;	
	
	//得到實際的Dib圖象存儲大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 計算圖像每行的字節數
	lLineBytes = SizeRealDim.cx;
	
	//圖像數據的指針
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 圖象的矩
	long nImageMoment;

	// 循環變量
	int i,j;

	int ip,jq;

	// 臨時變量
	double temp;

	nImageMoment = 0;

	// 計算一階矩
	ip = jq = 1;

	// 力矩的計算
	for (j = 0; j < lHeight; j++)
	{
		for(i = 0; i < lWidth; i++)
		{
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;

			temp = pow((double)i,ip)*pow(double(j),jq);
			temp = temp * (*lpSrc);

			nImageMoment = nImageMoment + (int)temp;
		}
	}
	
	// 將結果進行輸出
	CString CView;
	CView.Format("圖象的力矩為:%d",nImageMoment);
	MessageBox(NULL,CView, "計算結果" ,	MB_ICONINFORMATION | MB_OK);

	return true;
}

/*************************************************************************
 *
 * 函數名稱:
 *   DIBBARYCENTERMOMENT()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib類的指針
 *
 * 返回值:
 *   BOOL               - 成功返回True,否則返回False。
 *
 * 說明:
 *   該函數計算圖象的重心矩。
 *
 *************************************************************************/

BOOL DIBBARYCENTERMOMENT(CDib *pDib)
{
	// 指向源圖像的指針
	BYTE *	lpSrc;

	//圖象的寬度和高度
	LONG    lWidth;
	LONG    lHeight;

	// 圖像每行的字節數
	LONG	lLineBytes;
	
	//得到圖象的寬度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth  = SizeDim.cx;
	lHeight = SizeDim.cy;	
	
	//得到實際的Dib圖象存儲大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 計算圖像每行的字節數
	lLineBytes = SizeRealDim.cx;
	
	//圖像數據的指針
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 圖象象素值
	int  nPixelValue;

	// 圖象重心矩
	long nBarycenterMoment;

	// 0次矩m00,x方向的一次矩m01和y方向的一次矩m10
	long m00, m10, m01;

	// 重心x,y坐標值
	int nBarycenterX,nBarycenterY;
	
	// 循環變量
	int i,j;

	// 臨時變量
	double temp;

	// 賦初值為零
	m00 = 0;
	m01 = 0;
	m10 = 0;
	nBarycenterMoment = 0;

	// 求0次矩m00,x方向的一次矩m01和y方向的一次矩m10
	for (j = 0; j < lHeight; j++)
	{
		for(i = 0; i < lWidth; i++)
		{
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;
			nPixelValue = *lpSrc;

			m00 = m00 + nPixelValue;

			temp = i * nPixelValue;
			m01  = m01 + temp;

			temp = j * nPixelValue;
			m10  = m10 + temp;
		}
	}

	// 重心x,y坐標值
	nBarycenterX = (int)(m01 / m00 + 0.5);
	nBarycenterY = (int)(m10 / m00 + 0.5);


	// 計算重心矩
	for (j = 0; j < lHeight; j++)
	{
		for(i = 0; i < lWidth; i++)
		{
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;
			nPixelValue = *lpSrc;

			temp = (i - nBarycenterX) * (j - nBarycenterY);

			temp = temp * nPixelValue;

			nBarycenterMoment = nBarycenterMoment + (int)temp;
		}
	}

	// 將結果進行輸出
	CString CView;
	CView.Format("圖象的重心矩為(%d,%d),重心矩為%d"
					,nBarycenterX,nBarycenterY,nBarycenterMoment);
	MessageBox(NULL,CView, "計算結果" ,	MB_ICONINFORMATION | MB_OK);

	return true;

}

/*************************************************************************
 *
 * 函數名稱:
 *   DIBSTREETDIS()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib類的指針
 *
 * 返回值:
 *   BOOL               - 成功返回True,否則返回False。
 *
 * 說明:
 *   該函數利用棋盤距離對圖象進行變換。
 *
 *************************************************************************/

BOOL DIBSTREETDIS(CDib *pDib)
{
	// 指向源圖像的指針
	BYTE *	lpSrc;

	//圖象的寬度和高度
	LONG    lWidth;
	LONG    lHeight;

	// 圖像每行的字節數
	LONG	lLineBytes;
	
	//得到圖象的寬度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth  = SizeDim.cx;
	lHeight = SizeDim.cy;	
	
	//得到實際的Dib圖象存儲大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 計算圖像每行的字節數
	lLineBytes = SizeRealDim.cx;
	
	//圖像數據的指針
	LPBYTE  lpDIBBits = pDib->m_lpImage;

	// 循環和臨時變量
	int i,j;
	int temp, s;

	// 存儲象素值的數組
	int *pnBinary, *pnStore;
	
	int nImageValue;

	pnBinary = new int[lHeight*lLineBytes];
	pnStore	 = new int[lHeight*lLineBytes];	

	// 將圖象二值化
	for (j = 0; j < lHeight; j++)
	{
		for(i = 0; i < lWidth; i++)
		{
			// 指向源圖像倒數第j行,第i個象素的指針			
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i;

			// 白色象素為背景,存成0
			if(*lpSrc > 200)
			{
				pnBinary[lLineBytes * j + i] = 0;
				pnStore [lLineBytes * j + i] = 0;
			}
			// 黑象素存成1
			else
			{
				pnBinary[lLineBytes * j + i] = 1;
				pnStore [lLineBytes * j + i] = 1;
			}
		}		
	}

	s = 1;

	while(s == 1)
	{
		s = 0;

		// 進行距離的累加
		for (j = 1; j < lHeight - 1; j++)
		{
			for(i = 1; i < lWidth - 1; i++)
			{
				nImageValue = pnBinary[lLineBytes * j + i];
				
				// 如果是背景,進行下一個循環
				if(nImageValue == 0)
					continue;
				
				// 如果當前象素值和四周的值一樣,象素值增加一
				if(nImageValue==pnBinary[lLineBytes * (j-1) + i] && nImageValue==pnBinary[lLineBytes * (j+1) + i])
					if(nImageValue==pnBinary[lLineBytes * j + i-1] && nImageValue==pnBinary[lLineBytes * j + i+1])
					{
						pnStore[lLineBytes * j + i]++;
						s=1;								
					}
			}
		}
		
		// 在進行下一輪循環前將當前的結果儲存
		for (j = 0; j < lHeight; j++)
			for(i = 1; i < lWidth; i++)
				pnBinary[lLineBytes * j + i] = pnStore[lLineBytes * j + i];
	}

	// 存儲象素值,輸出
	for(j = 0; j < lHeight; j++)
	{
		// 列
		for(i = 0; i < lWidth; i++)
		{
			// 骨架的象素值
		    temp = pnStore[j * lLineBytes + i] ;
			
			// 指向位圖i行j列象素的指針
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * j + i;
			
			// 更新源圖像
			* (lpSrc) = (BYTE)((25 - temp) * 10 + 5);			
		}
	}

	delete pnStore;
	delete pnBinary;

	return true;
}

/*************************************************************************
 *

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91国在线观看| 亚洲国产精品ⅴa在线观看| 国产91精品一区二区麻豆网站| 亚洲欧美日韩人成在线播放| 精品成人私密视频| 欧美视频自拍偷拍| 成人午夜视频福利| 久久草av在线| 亚洲二区视频在线| 亚洲人成在线播放网站岛国| 国产无人区一区二区三区| 这里是久久伊人| 欧美色区777第一页| jvid福利写真一区二区三区| 国产资源精品在线观看| 日本不卡高清视频| 亚洲一二三区不卡| 亚洲老妇xxxxxx| 中文字幕一区二区三区不卡在线| 久久影院电视剧免费观看| 欧美精品色一区二区三区| 色婷婷av一区二区三区大白胸| 岛国一区二区在线观看| 韩国三级中文字幕hd久久精品| 日本欧美一区二区三区| 日韩精品福利网| 日韩在线观看一区二区| 天天免费综合色| 日韩综合小视频| 强制捆绑调教一区二区| 免费欧美日韩国产三级电影| 婷婷综合五月天| 日本不卡一二三| 久久er精品视频| 黑人巨大精品欧美一区| 国产一区二区三区在线观看免费 | 一区二区不卡在线播放| 亚洲欧美偷拍另类a∨色屁股| 国产精品天美传媒沈樵| 亚洲天天做日日做天天谢日日欢 | 开心九九激情九九欧美日韩精美视频电影 | 91久久精品一区二区三区| 91啪亚洲精品| 欧美亚洲免费在线一区| 欧美欧美午夜aⅴ在线观看| 欧美男男青年gay1069videost| 欧美午夜片在线看| 欧美一区二区在线播放| 日韩欧美一级二级三级久久久| 日韩精品一区二区三区在线| 亚洲精品一区二区三区香蕉| 欧美国产一区在线| 怡红院av一区二区三区| 午夜伦理一区二区| 精品一区二区三区免费播放| 国产不卡免费视频| 色av综合在线| 欧美久久一区二区| 久久久久亚洲蜜桃| 中文字幕欧美一| 午夜精品福利一区二区蜜股av| 久久国产综合精品| www.亚洲色图.com| 欧美亚洲精品一区| 久久夜色精品一区| 亚洲免费资源在线播放| 免费美女久久99| 北岛玲一区二区三区四区| 欧美性色欧美a在线播放| 欧美大胆一级视频| 国产精品久久久久国产精品日日| 亚洲综合色噜噜狠狠| 韩国一区二区三区| 色94色欧美sute亚洲线路二| 6080日韩午夜伦伦午夜伦| 国产欧美日韩另类视频免费观看| 一区二区三区在线观看动漫| 久久97超碰国产精品超碰| 91蜜桃网址入口| 日韩欧美一级精品久久| 亚洲欧洲综合另类在线| 激情综合网最新| 欧洲亚洲精品在线| 久久久久亚洲综合| 日欧美一区二区| 99久久精品国产一区二区三区 | 不卡视频免费播放| 欧美一区二区三区婷婷月色| 国产精品萝li| 久久精品国内一区二区三区| 色哟哟亚洲精品| 久久久久久久久久久电影| 亚洲综合色婷婷| 成人黄色777网| 日韩欧美一级精品久久| 一区二区三区四区在线| 粉嫩13p一区二区三区| 欧美一区二区三区四区在线观看| 亚洲人成精品久久久久| 国产**成人网毛片九色| 91精品国产综合久久香蕉的特点| 最新国产精品久久精品| 黄一区二区三区| 欧美精品第1页| 夜夜揉揉日日人人青青一国产精品 | 国产女同互慰高潮91漫画| 三级影片在线观看欧美日韩一区二区| 成人国产精品免费网站| 精品国产污污免费网站入口| 午夜久久久久久电影| 91久久香蕉国产日韩欧美9色| 欧美激情综合五月色丁香| 精品一区二区三区av| 日韩免费性生活视频播放| 亚洲成在线观看| 欧美性生活久久| 一个色综合网站| 一本色道久久综合亚洲91| 国产精品久久99| av电影天堂一区二区在线观看| 国产日韩欧美制服另类| 九色|91porny| 日韩精品一区二区三区中文精品| 天天综合日日夜夜精品| 欧美精品久久天天躁| 亚洲大型综合色站| 欧美日韩国产高清一区二区 | 首页国产丝袜综合| 在线不卡中文字幕| 日日骚欧美日韩| 欧美一区二区在线视频| 免费看精品久久片| 日韩精品一区二| 久久99久久久久| 精品国产伦一区二区三区观看体验| 久久精品国产亚洲高清剧情介绍| 欧美大片日本大片免费观看| 精品写真视频在线观看| 久久综合九色综合欧美亚洲| 国产精品亚洲第一区在线暖暖韩国 | 日韩精品一区二区三区四区| 久久精品国产免费| 久久久久国产精品厨房| 粉嫩久久99精品久久久久久夜| 欧美国产一区视频在线观看| 97久久精品人人爽人人爽蜜臀| 亚洲乱码精品一二三四区日韩在线| 色老综合老女人久久久| 午夜精品久久久久久久蜜桃app | 久久综合色综合88| 成人国产亚洲欧美成人综合网 | 青青草97国产精品免费观看无弹窗版 | 日韩不卡手机在线v区| 日韩欧美国产精品| 成人免费视频一区二区| 亚洲裸体在线观看| 欧美一区二区精品| 顶级嫩模精品视频在线看| 亚洲乱码国产乱码精品精小说| 欧美日韩午夜在线视频| 精品一区二区三区av| 国产精品盗摄一区二区三区| 欧美日韩视频在线一区二区| 久久电影网站中文字幕| 中文字幕一区二区三区不卡 | 国产精品欧美综合在线| 欧美亚日韩国产aⅴ精品中极品| 肉色丝袜一区二区| 欧美国产欧美综合| 欧美日韩精品一区二区三区四区| 九九九精品视频| 亚洲欧美自拍偷拍色图| 91精品欧美福利在线观看| 国产精品18久久久久久久久 | 大胆亚洲人体视频| 婷婷激情综合网| 亚洲国产成人在线| 777a∨成人精品桃花网| 丁香六月综合激情| 喷白浆一区二区| 亚洲欧美色图小说| 久久嫩草精品久久久精品| 欧美午夜寂寞影院| 成人性色生活片免费看爆迷你毛片| 亚洲一二三区在线观看| 国产欧美日韩麻豆91| 欧美老年两性高潮| av亚洲精华国产精华精华| 蜜臀av性久久久久蜜臀aⅴ流畅 | 中文字幕av一区二区三区免费看 | 欧美色综合天天久久综合精品| 黄色精品一二区| 亚洲h在线观看| 国产精品久久影院| 久久综合色之久久综合| 在线成人高清不卡| 91福利视频网站| 成人免费黄色大片| 老司机精品视频在线| 亚洲图片有声小说|