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

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

?? segapi.cpp

?? 提供了圖像識別
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
 *   int nWidth                - 圖象數據寬度
 *   int nHeight               - 圖象數據高度
 *   unsigned char *pUnchRst   - 經過NonmaxSuppress處理后的結果
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   抑止梯度圖中非局部極值點的象素。
 *   
 *************************************************************************
 */
void NonmaxSuppress(int *pnMag, int *pnGradX, int *pnGradY, int nWidth, 
										int nHeight,	unsigned char *pUnchRst)
{
	// 循環控制變量
	int y ;
	int x ;
	int nPos;

	// x方向梯度分量
	int gx  ;
	int gy  ;

	// 臨時變量
	int g1, g2, g3, g4 ;
	double weight  ;
	double dTmp1   ;
	double dTmp2   ;
	double dTmp    ;
	
	// 設置圖象邊緣部分為不可能的邊界點
	for(x=0; x<nWidth; x++)		
	{
		pUnchRst[x] = 0 ;
		pUnchRst[nHeight-1+x] = 0;
	}
	for(y=0; y<nHeight; y++)		
	{
		pUnchRst[y*nWidth] = 0 ;
		pUnchRst[y*nWidth + nWidth-1] = 0;
	}

	for(y=1; y<nHeight-1; y++)
	{
		for(x=1; x<nWidth-1; x++)
		{
			nPos = y*nWidth + x ;
			
			// 如果當前象素的梯度幅度為0,則不是邊界點
			if(pnMag[nPos] == 0 )
			{
				pUnchRst[nPos] = 0 ;
			}
			else
			{
				// 當前象素的梯度幅度
				dTmp = pnMag[nPos] ;
				
				// x,y方向導數
				gx = pnGradX[nPos]  ;
				gy = pnGradY[nPos]  ;

				// 如果方向導數y分量比x分量大,說明導數的方向更加“趨向”于y分量。
				if (abs(gy) > abs(gx)) 
				{
					// 計算插值的比例
					weight = fabs(gx)/fabs(gy); 

					g2 = pnMag[nPos-nWidth] ; 
					g4 = pnMag[nPos+nWidth] ;
					
					// 如果x,y兩個方向的方向導數的符號相同
					// C是當前象素,與g1-g4的位置關系為:
					//	g1 g2 
					//		 C         
					//		 g4 g3 
					if (gx*gy > 0) 
					{ 					
						g1 = pnMag[nPos-nWidth-1] ;
						g3 = pnMag[nPos+nWidth+1] ;
					} 

					// 如果x,y兩個方向的方向導數的符號相反
					// C是當前象素,與g1-g4的位置關系為:
					//	   g2 g1
					//		 C         
					//	g3 g4  
					else 
					{ 
						g1 = pnMag[nPos-nWidth+1] ;
						g3 = pnMag[nPos+nWidth-1] ;
					} 
				}
				
				// 如果方向導數x分量比y分量大,說明導數的方向更加“趨向”于x分量
				// 這個判斷語句包含了x分量和y分量相等的情況
				else
				{
					// 計算插值的比例
					weight = fabs(gy)/fabs(gx); 
					
					g2 = pnMag[nPos+1] ; 
					g4 = pnMag[nPos-1] ;
					
					// 如果x,y兩個方向的方向導數的符號相同
					// C是當前象素,與g1-g4的位置關系為:
					//	g3   
					//	g4 C g2       
					//       g1
					if (gx*gy > 0) 
					{				
						g1 = pnMag[nPos+nWidth+1] ;
						g3 = pnMag[nPos-nWidth-1] ;
					} 
					// 如果x,y兩個方向的方向導數的符號相反
					// C是當前象素,與g1-g4的位置關系為:
					//	     g1
					//	g4 C g2       
					//  g3     
					else 
					{ 
						g1 = pnMag[nPos-nWidth+1] ;
						g3 = pnMag[nPos+nWidth-1] ;
					}
				}

				// 下面利用g1-g4對梯度進行插值
				{
					dTmp1 = weight*g1 + (1-weight)*g2 ;
					dTmp2 = weight*g3 + (1-weight)*g4 ;
					
					// 當前象素的梯度是局部的最大值
					// 該點可能是個邊界點
					if(dTmp>=dTmp1 && dTmp>=dTmp2)
					{
						pUnchRst[nPos] = 128 ;
					}
					else
					{
						// 不可能是邊界點
						pUnchRst[nPos] = 0 ;
					}
				}
			} //else
		} // for

	}
} 

/*************************************************************************
 *
 * \函數名稱:
 *   TraceEdge()
 *
 * \輸入參數:
 *   int    x									- 跟蹤起點的x坐標 
 *   int    y									- 跟蹤起點的y坐標
 *   int nLowThd							- 判斷一個點是否為邊界點的低閾值
 *   unsigned char *pUnchEdge - 記錄邊界點的緩沖區
 *   int *pnMag               - 梯度幅度圖
 *   int nWidth               - 圖象數據寬度
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   遞歸調用  
 *   從(x,y)坐標出發,進行邊界點的跟蹤,跟蹤只考慮pUnchEdge中沒有處理并且
 *   可能是邊界點的那些象素(=128),象素值為0表明該點不可能是邊界點,象素值
 *   為255表明該點已經被設置為邊界點,不必再考慮
 *   
 *   
 *************************************************************************
 */
void TraceEdge (int y, int x, int nLowThd, unsigned char *pUnchEdge, int *pnMag, int nWidth) 
{ 
	// 對8鄰域象素進行查詢
	int xNb[8] = {1, 1, 0,-1,-1,-1, 0, 1} ;
	int yNb[8] = {0, 1, 1, 1,0 ,-1,-1,-1} ;

	int yy ;
	int xx ;
	
	int k  ;
	
	for(k=0; k<8; k++)
	{
		yy = y + yNb[k] ;
		xx = x + xNb[k] ;
		// 如果該象素為可能的邊界點,又沒有處理過
		// 并且梯度大于閾值
		if(pUnchEdge[yy*nWidth+xx] == 128  && pnMag[yy*nWidth+xx]>=nLowThd)
		{
			// 把該點設置成為邊界點
			pUnchEdge[yy*nWidth+xx] = 255 ;

			// 以該點為中心進行跟蹤
			TraceEdge(yy, xx, nLowThd, pUnchEdge, pnMag, nWidth);
		}
	}
} 

/*************************************************************************
 *
 * \函數名稱:
 *   EstimateThreshold()
 *
 * \輸入參數:
 *   int *pnMag               - 梯度幅度圖
 *	 int nWidth               - 圖象數據寬度
 *	 int nHeight              - 圖象數據高度
 *   int *pnThdHigh           - 高閾值
 *   int *pnThdLow            - 低閾值
 *	 double dRatioLow         - 低閾值和高閾值之間的比例
 *	 double dRatioHigh        - 高閾值占圖象象素總數的比例
 *   unsigned char *pUnchEdge - 經過non-maximum處理后的數據
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   經過non-maximum處理后的數據pUnchEdge,統計pnMag的直方圖,確定閾值。
 *   本函數中只是統計pUnchEdge中可能為邊界點的那些象素。然后利用直方圖,
 *   根據dRatioHigh設置高閾值,存儲到pnThdHigh。利用dRationLow和高閾值,
 *   設置低閾值,存儲到*pnThdLow。dRatioHigh是一種比例:表明梯度小于
 *   *pnThdHigh的象素數目占象素總數目的比例。dRationLow表明*pnThdHigh
 *   和*pnThdLow的比例,這個比例在canny算法的原文里,作者給出了一個區間。
 *
 *************************************************************************
 */
void EstimateThreshold(int *pnMag, int nWidth, int nHeight, int *pnThdHigh,int *pnThdLow, 
											 unsigned char * pUnchEdge, double dRatioHigh, double dRationLow) 
{ 
	// 循環控制變量
	int y;
	int x;
	int k;
	
	// 該數組的大小和梯度值的范圍有關,如果采用本程序的算法,那么梯度的范圍不會超過pow(2,10)
	int nHist[1024] ;

	// 可能的邊界數目
	int nEdgeNb     ;

	// 最大梯度值
	int nMaxMag     ;

	int nHighCount  ;

	nMaxMag = 0     ; 
	
	// 初始化
	for(k=0; k<1024; k++) 
	{
		nHist[k] = 0; 
	}

	// 統計直方圖,然后利用直方圖計算閾值
	for(y=0; y<nHeight; y++)
	{
		for(x=0; x<nWidth; x++)
		{
			// 只是統計那些可能是邊界點,并且還沒有處理過的象素
			if(pUnchEdge[y*nWidth+x]==128)
			{
				nHist[ pnMag[y*nWidth+x] ]++;
			}
		}
	}

	nEdgeNb = nHist[0]  ;
	nMaxMag = 0         ;
	// 統計經過“非最大值抑止(non-maximum suppression)”后有多少象素
	for(k=1; k<1024; k++)
	{
		if(nHist[k] != 0)
		{
			// 最大梯度值
			nMaxMag = k;
		}
		
		// 梯度為0的點是不可能為邊界點的
		// 經過non-maximum suppression后有多少象素
		nEdgeNb += nHist[k];
	}

	// 梯度比高閾值*pnThdHigh小的象素點總數目
	nHighCount = (int)(dRatioHigh * nEdgeNb +0.5);
	
	k = 1;
	nEdgeNb = nHist[1];
	
	// 計算高閾值
	while( (k<(nMaxMag-1)) && (nEdgeNb < nHighCount) )
	{
		k++;
		nEdgeNb += nHist[k];
	}

	// 設置高閾值
	*pnThdHigh = k ;

	// 設置低閾值
	*pnThdLow  = (int)((*pnThdHigh) * dRationLow+ 0.5);
}

/*************************************************************************
 *
 * \函數名稱:
 *   Hysteresis()
 *
 * \輸入參數:
 *   int *pnMag               - 梯度幅度圖
 *	 int nWidth               - 圖象數據寬度
 *	 int nHeight              - 圖象數據高度
 *	 double dRatioLow         - 低閾值和高閾值之間的比例
 *	 double dRatioHigh        - 高閾值占圖象象素總數的比例
 *   unsigned char *pUnchEdge - 記錄邊界點的緩沖區
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   本函數實現類似“磁滯現象”的一個功能,也就是,先調用EstimateThreshold
 *   函數對經過non-maximum處理后的數據pUnchSpr估計一個高閾值,然后判斷
 *   pUnchSpr中可能的邊界象素(=128)的梯度是不是大于高閾值nThdHigh,如果比
 *   該閾值大,該點將作為一個邊界的起點,調用TraceEdge函數,把對應該邊界
 *   的所有象素找出來。最后,當整個搜索完畢時,如果還有象素沒有被標志成
 *   邊界點,那么就一定不是邊界點。
 *   
 *************************************************************************
 */
void Hysteresis(int *pnMag, int nWidth, int nHeight, double dRatioLow, 
								double dRatioHigh, unsigned char *pUnchEdge)
{
	// 循環控制變量
	int y;
	int x;

	int nThdHigh ;
	int nThdLow  ;

	int nPos;

	// 估計TraceEdge需要的低閾值,以及Hysteresis函數使用的高閾值
	EstimateThreshold(pnMag, nWidth, nHeight, &nThdHigh, 
		               &nThdLow, pUnchEdge,dRatioHigh, dRatioLow);

  // 這個循環用來尋找大于nThdHigh的點,這些點被用來當作邊界點,然后用
	// TraceEdge函數來跟蹤該點對應的邊界
   for(y=0; y<nHeight; y++)
	 {
      for(x=0; x<nWidth; x++)
			{
				nPos = y*nWidth + x ; 

				// 如果該象素是可能的邊界點,并且梯度大于高閾值,該象素作為
				// 一個邊界的起點
				if((pUnchEdge[nPos] == 128) && (pnMag[nPos] >= nThdHigh))
				{
					// 設置該點為邊界點
					pUnchEdge[nPos] = 255;
					TraceEdge(y, x, nThdLow, pUnchEdge, pnMag, nWidth);
				}
      }
   }

	 // 那些還沒有被設置為邊界點的象素已經不可能成為邊界點
   for(y=0; y<nHeight; y++)
	 {
		 for(x=0; x<nWidth; x++)
		 {
			 nPos = y*nWidth + x ; 
			 if(pUnchEdge[nPos] != 255)
			 {
				 // 設置為非邊界點
				 pUnchEdge[nPos] = 0 ;
			 }
		 }
	 }
}


/*************************************************************************
 *
 * \函數名稱:
 *   Canny()
 *
 * \輸入參數:
 *   unsigned char *pUnchImage- 圖象數據
 *	 int nWidth               - 圖象數據寬度
 *	 int nHeight              - 圖象數據高度
 *   double sigma             - 高斯濾波的標準方差
 *	 double dRatioLow         - 低閾值和高閾值之間的比例
 *	 double dRatioHigh        - 高閾值占圖象象素總數的比例
 *   unsigned char *pUnchEdge - canny算子計算后的分割圖
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   canny分割算子,計算的結果保存在pUnchEdge中,邏輯1(255)表示該點為
 *   邊界點,邏輯0(0)表示該點為非邊界點。該函數的參數sigma,dRatioLow
 *   dRatioHigh,是需要指定的。這些參數會影響分割后邊界點數目的多少
 *************************************************************************
 */
void Canny(unsigned char *pUnchImage, int nWidth, int nHeight, double sigma,
					 double dRatioLow, double dRatioHigh, unsigned char *pUnchEdge)
{
	// 經過高斯濾波后的圖象數據
	unsigned char * pUnchSmooth ;
  
	// 指向x方向導數的指針
	int * pnGradX ; 

	// 指向y方向導數的指針
	int * pnGradY ;

	// 梯度的幅度
	int * pnGradMag ;

	pUnchSmooth  = new unsigned char[nWidth*nHeight] ;
	pnGradX      = new int [nWidth*nHeight]          ;
	pnGradY      = new int [nWidth*nHeight]          ;
	pnGradMag    = new int [nWidth*nHeight]          ;

	// 對原圖象進行濾波
	GaussianSmooth(pUnchImage, nWidth, nHeight, sigma, pUnchSmooth) ;

	// 計算方向導數
	DirGrad(pUnchSmooth, nWidth, nHeight, pnGradX, pnGradY) ;

	// 計算梯度的幅度
	GradMagnitude(pnGradX, pnGradY, nWidth, nHeight, pnGradMag) ;

	// 應用non-maximum 抑制
	NonmaxSuppress(pnGradMag, pnGradX, pnGradY, nWidth, nHeight, pUnchEdge) ;

	// 應用Hysteresis,找到所有的邊界
	Hysteresis(pnGradMag, nWidth, nHeight, dRatioLow, dRatioHigh, pUnchEdge);


	// 釋放內存
	delete pnGradX      ;
	pnGradX      = NULL ;
	delete pnGradY      ;
	pnGradY      = NULL ;
	delete pnGradMag    ;
	pnGradMag    = NULL ;
	delete pUnchSmooth ;
	pUnchSmooth  = NULL ;
}
					

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产免费| 精品久久人人做人人爽| 日韩美女一区二区三区| 国产精品二区一区二区aⅴ污介绍| 亚洲自拍偷拍麻豆| 成人性生交大片免费看视频在线| 91精品国产色综合久久不卡蜜臀| 国产精品三级在线观看| 麻豆精品一区二区| 欧美日韩性生活| 亚洲欧美成aⅴ人在线观看 | 欧美电影免费观看完整版| 国产精品久久久久久久久晋中| 蜜臀av一级做a爰片久久| 一本久久a久久精品亚洲| 日本一区二区高清| 国产综合久久久久久鬼色| 欧美嫩在线观看| 亚洲一区二区精品久久av| 9l国产精品久久久久麻豆| 国产精品嫩草久久久久| 国产精品资源站在线| 精品国产一区二区三区不卡| 首页亚洲欧美制服丝腿| 欧美性猛交xxxx黑人交| 伊人性伊人情综合网| www.视频一区| 中文字幕在线观看一区二区| www.av亚洲| 亚洲欧美日韩成人高清在线一区| www.99精品| 亚洲视频一区二区在线| 91在线精品一区二区| 国产精品白丝在线| 91丨porny丨国产| 亚洲免费在线视频| 欧美亚洲国产一区二区三区va| 一区二区三区**美女毛片| 在线亚洲高清视频| 午夜欧美视频在线观看| 日韩欧美一二三四区| 精品中文字幕一区二区| 国产亚洲精品aa| www.日本不卡| 亚洲香肠在线观看| 欧美一区三区四区| 国产真实乱对白精彩久久| 亚洲国产精品t66y| 91蝌蚪porny九色| 亚洲一区二区欧美日韩| 欧美一二区视频| 国产.精品.日韩.另类.中文.在线.播放| 国产午夜精品在线观看| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美伊人久久久久久久久影院| 亚洲午夜一区二区三区| 欧美精品一二三区| 国产一区在线视频| 亚洲三级在线观看| 欧美一区二区三区日韩视频| 国产乱子伦视频一区二区三区| 国产精品乱人伦中文| 欧美亚一区二区| 经典一区二区三区| 一区二区三区日韩精品视频| 日韩精品一区二区三区swag| aaa欧美日韩| 看片网站欧美日韩| 亚洲天天做日日做天天谢日日欢 | 精品国产欧美一区二区| 丰满白嫩尤物一区二区| 亚洲sss视频在线视频| 久久精品免视看| 欧美日韩1234| 成人18视频在线播放| 青青国产91久久久久久| 一色屋精品亚洲香蕉网站| 日韩欧美自拍偷拍| 一本到三区不卡视频| 黄网站免费久久| 天天av天天翘天天综合网色鬼国产| 久久亚洲私人国产精品va媚药| 欧美色成人综合| 成人激情动漫在线观看| 久久99精品久久久久| 一区二区三区免费网站| 国产欧美一区二区在线| 日韩欧美一二区| 欧美日韩精品二区第二页| av一区二区三区四区| 国内精品伊人久久久久影院对白| 午夜av一区二区| 一区二区三区精品在线| 国产精品久久久久久久浪潮网站| 制服丝袜av成人在线看| 日本高清免费不卡视频| aaa亚洲精品一二三区| 成人一二三区视频| 国产专区欧美精品| 久久99精品久久久久久久久久久久| 亚洲国产日韩a在线播放性色| 中文字幕一区二区在线观看| 久久久精品欧美丰满| 亚洲精品一区二区三区福利 | 国产精品久久久一区麻豆最新章节| 91精品在线一区二区| 欧洲一区二区三区在线| 色综合久久久网| 色综合久久88色综合天天6| 福利一区二区在线| 国产**成人网毛片九色| 国产福利精品一区二区| 国产做a爰片久久毛片| 国产主播一区二区| 国产资源精品在线观看| 国产精品12区| 国产传媒一区在线| 成人视屏免费看| 成人黄色在线网站| 99国产精品久久久久| 99re热这里只有精品免费视频| jlzzjlzz欧美大全| 色猫猫国产区一区二在线视频| 一本大道综合伊人精品热热| 91黄色激情网站| 欧美亚洲一区三区| 在线成人免费视频| 精品久久久久久久久久久久久久久| 日韩欧美国产一区二区三区| 久久综合九色综合97_久久久| 国产欧美日韩另类一区| 中文一区二区在线观看| 亚洲免费观看视频| 日本免费在线视频不卡一不卡二| 美日韩一区二区三区| 成人开心网精品视频| 91久久精品网| 日韩欧美国产一区二区在线播放| 国产日韩欧美制服另类| 国产精品久久一卡二卡| 一个色综合av| 久久精品噜噜噜成人88aⅴ| 国产成人超碰人人澡人人澡| 欧美最新大片在线看| 日韩免费视频一区二区| 国产精品人妖ts系列视频| 一区二区三区久久| 九九国产精品视频| 色网综合在线观看| 日韩欧美亚洲国产另类| 日韩毛片精品高清免费| 日韩成人av影视| 成人禁用看黄a在线| 欧美一区二区三区免费在线看| 国产人成一区二区三区影院| 亚洲国产日韩一级| 高清不卡在线观看| 91.com视频| 亚洲视频一区二区免费在线观看| 免费久久精品视频| 一本到不卡精品视频在线观看| 精品国产乱码久久| 亚洲va欧美va人人爽午夜| 成人一区二区三区中文字幕| 91精品国产色综合久久不卡电影| 中文字幕一区二区三区四区 | 国产精品午夜电影| 免费精品视频在线| 色综合久久88色综合天天免费| 26uuu色噜噜精品一区二区| 亚洲国产精品一区二区久久| 国产不卡在线一区| 日韩欧美aaaaaa| 亚洲 欧美综合在线网络| 成人福利视频网站| 久久亚洲欧美国产精品乐播 | 精品伦理精品一区| 亚洲小少妇裸体bbw| aaa欧美日韩| 国产日韩欧美综合一区| 麻豆91精品91久久久的内涵| 欧美亚洲综合另类| 亚洲婷婷在线视频| 成人国产精品免费观看动漫 | 国产69精品一区二区亚洲孕妇| 欧美一区二区成人6969| 亚洲一区二区欧美日韩| 99视频精品在线| 亚洲欧洲日韩在线| 91在线精品一区二区三区| 国产欧美日韩在线视频| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美美女直播网站| 一区二区三区日韩欧美精品| 99久久综合色| 国产精品成人网| 91在线视频网址| ㊣最新国产の精品bt伙计久久| 成人精品国产免费网站| 国产精品电影一区二区|