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

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

?? enhance.cpp

?? 提供了圖像識別
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

#include "stdafx.h"
#include "cdib.h"
#include "math.h"
#include <direct.h>
#include <complex>
using namespace std;
#include "GlobalApi.h"

/*************************************************************************
 *
 * \函數名稱:
 *   HistogramEqualize()
 *
 * \輸入參數:
 *   CDib * pDib		- 指向CDib類的指針,含有原始圖象信息
 *
 * \返回值:
 *   BOOL			- 成功則返回TRUE,否則返回FALSE
 *
 * \說明:
 *   該函數對指定的圖象進行直方圖均衡化處理
 *
 *************************************************************************
 */
 BOOL HistogramEqualize(CDib* pDib)
 {
	 // 指向源圖像的指針
	unsigned char*	lpSrc;
	
	// 臨時變量
	int	nTemp;
	
	// 循環變量
	int i,j;
	
	// 累積直方圖,即灰度映射表
	BYTE	byMap[256];
	
	// 直方圖
	int	nCount[256];
	
	// 圖象的高度和寬度
	CSize sizeImage;
	sizeImage = pDib->GetDimensions();


	// 獲得圖象數據存儲的高度和寬度
	CSize SizeSaveImage;
	SizeSaveImage = pDib->GetDibSaveDim();



	// 重置計數為0
	for (i = 0; i < 256; i ++)
	{
		// 清零
		nCount[i] = 0;
	}
	
	// 計算各個灰度值的計數,即得到直方圖
	for (i = 0; i < sizeImage.cy; i ++)
	{
		for (j = 0; j < sizeImage.cx; j ++)
		{
			lpSrc = (unsigned char *)pDib->m_lpImage + SizeSaveImage.cx * i + j;
			
			// 計數加1
			nCount[*(lpSrc)]++;
		}
	}
	
	// 計算累積直方圖
	for (i = 0; i < 256; i++)
	{
		// 初始為0
		nTemp = 0;
		
		for (j = 0; j <= i ; j++)
		{
			nTemp += nCount[j];
		}
		
		// 計算對應的新灰度值
		byMap[i] = (BYTE) (nTemp * 255 / sizeImage.cy / sizeImage.cx);
	}
	
	// 每行
	for(i = 0; i < sizeImage.cy; i++)
	{
		// 每列
		for(j = 0; j < sizeImage.cx; j++)
		{
			// 指向DIB第i行,第j個象素的指針
			lpSrc = (unsigned char*)pDib->m_lpImage + pDib->GetPixelOffset(i,j);
			
			// 計算新的灰度值
			*lpSrc = byMap[*lpSrc];
		}
	}
	
	// 返回
	return TRUE;
 }

/*************************************************************************
 *
 * \函數名稱:
 *   GraySegLinTrans()
 *
 * \輸入參數:
 *   CDib* pDib			- 指向CDib類的指針,含有原始圖象信息
 *   int   nX1			- 分段線性灰度變換第一個拐點的X坐標
 *   int   nY1			- 分段線性灰度變換第一個拐點的Y坐標
 *   int   nX2			- 分段線性灰度變換第二個拐點的X坐標
 *   int   nY2			- 分段線性灰度變換第二個拐點的Y坐標
 *
 * \返回值:
 *   BOOL               - 成功返回TRUE,否則返回FALSE。
 *
 * \說明:
 *   該函數用來對圖像進行分段線性灰度變換,輸入參數中包含了兩個拐點的坐標
 *
 *************************************************************************
 */
BOOL GraySegLinTrans(CDib* pDib, int nX1, int nY1, int nX2, int nY2)
{
	
	// 指向源圖像的指針
	unsigned char*	lpSrc;
	
	// 循環變量
	int i,j;
	
	// 灰度映射表
	BYTE	byMap[256];
	
	// 圖像每行的字節數
	//LONG	lLineBytes;

	// 圖象的高度和寬度
	CSize sizeImage;
	sizeImage = pDib->GetDimensions();


	// 獲得圖象數據存儲的高度和寬度
	CSize SizeSaveImage;
	SizeSaveImage = pDib->GetDibSaveDim();

	// 計算圖像每行的字節數
	//lLineBytes = WIDTHBYTES(sizeImage.cx * 8);
	
	// 計算灰度映射表
	for (i = 0; i <= nX1; i++)
	{
		// 判斷nX1是否大于0(防止分母為0)
		if (nX1 > 0)
		{
			// 線性變換
			byMap[i] = (BYTE) nY1 * i / nX1;
		}
		else
		{
			// 直接賦值為0
			byMap[i] = 0;
		}
	}
	for (; i <= nX2; i++)
	{
		// 判斷nX1是否等于nX2(防止分母為0)
		if (nX2 != nX1)
		{
			// 線性變換
			byMap[i] = nY1 + (BYTE) ((nY2 - nY1) * (i - nX1) / (nX2 - nX1));
		}
		else
		{
			// 直接賦值為nY1
			byMap[i] = nY1;
		}
	}
	for (; i < 256; i++)
	{
		// 判斷nX2是否等于255(防止分母為0)
		if (nX2 != 255)
		{
			// 線性變換
			byMap[i] = nY2 + (BYTE) ((255 - nY2) * (i - nX2) / (255 - nX2));
		}
		else
		{
			// 直接賦值為255
			byMap[i] = 255;
		}
	}
	
	// 對圖象的象素值進行變換
	// 每行
	for(i = 0; i < sizeImage.cy; i++)
	{
		// 每列
		for(j = 0; j < sizeImage.cx; j++)
		{
			// 指向DIB第i行,第j個象素的指針
			lpSrc = (unsigned char*)pDib->m_lpImage + pDib->GetPixelOffset(i,j);
			
			// 計算新的灰度值
			*lpSrc = byMap[*lpSrc];
		}
	}
	
	// 返回
	return TRUE;
}

/*************************************************************************
 *
 * \函數名稱:
 *   GeneralTemplate()
 *
 * \輸入參數:
 *   CDib * pDib		- 指向CDib類的指針,含有原始圖象信息
 *   int nTempWidth		- 模板的寬度
 *   int nTempHeight		- 模板的高度
 *   int nTempCenX		- 模板中心的X坐標(相對于模板)
 *   int nTempCenY		- 模板中心的Y坐標(相對于模板)
 *   double* pdbTemp		- 模板數組的指針
 *   double* dbCoef		- 模板的系數
 *
 * \返回值:
 *   BOOL			- 成功則返回TRUE,否則返回FALSE
 *
 * \說明:
 *   該函數用指定的模板對pDib指向的圖象進行模板操作。模板的定義了寬度,高度,
 *    中心坐標和系數,模板的數據存放在pdbTemp中。對圖象進行模板操作后,仍
 *    然存放在pDib指向的CDib對象中。需要注意的是,該函數只能處理8位的圖象,
 *   否則,指向的數據將出錯。
 *
 *************************************************************************
 */
BOOL  GeneralTemplate(CDib* pDib,  int nTempWidth, int nTempHeight, 
					 int nTempCenX, int nTempCenY,
					 double* pdbTemp, double dbCoef)
{
	// 臨時存放圖像數據的指針
	LPBYTE lpImage;
	
	// 循環變量
	int i,j,k,l;
	
	// 指向源圖像的指針
	unsigned char*	lpSrc;
	
	// 指向要復制區域的指針
	unsigned char*	lpDst;

	// 計算結果
	double	dbResult;

	// 圖象的高度和寬度
	CSize sizeImage;
	sizeImage = pDib->GetDimensions();


	// 獲得圖象數據存儲的尺寸
	int nSizeImage;
	nSizeImage = pDib->GetSizeImage();

	// 給臨時存放數據分配內存
	lpImage = (LPBYTE) new char[nSizeImage];

	// 判斷是否內存分配失敗
	if (lpImage == NULL)
	{
		// 分配內存失敗
		return FALSE;
	}
	
	// 將原始圖像的數據拷貝到臨時存放內存中
	memcpy(lpImage, pDib->m_lpImage, nSizeImage);

	
	
	// 進行模板操作
	// 行(除去邊緣幾行)
	for(i = nTempCenY ; i < sizeImage.cy - nTempHeight + nTempCenY + 1; i++)
	{
		// 列(除去邊緣幾列)
		for(j = nTempCenX; j < sizeImage.cx - nTempWidth + nTempCenX + 1; j++)
		{
			// 指向新DIB第i行,第j個象素的指針
			lpDst = (unsigned char*)lpImage + pDib->GetPixelOffset(i,j);
			
			dbResult = 0;
			
			// 計算
			for (k = 0; k < nTempHeight; k++)
			{
				for (l = 0; l < nTempWidth; l++)
				{
					// 指向DIB第i - nTempCenY + k行,第j - nTempCenX + l個象素的指針
					lpSrc = (unsigned char*)pDib->m_lpImage + pDib->GetPixelOffset(i-nTempCenY+k, j-nTempCenX+l);
					
					// 保存象素值
					dbResult += (* lpSrc) * pdbTemp[k * nTempWidth + l];
				}
			}
			
			// 乘上系數
			dbResult *= dbCoef;
			
			// 取絕對值
			dbResult = (double ) fabs(dbResult);
			
			// 判斷是否超過255
			if(dbResult > 255)
			{
				// 直接賦值為255
				* lpDst = 255;
			}
			else
			{
				// 賦值
				* lpDst = (unsigned char) (dbResult + 0.5);
			}
			
		}
	}
	
	// 復制變換后的圖像
	memcpy(pDib->m_lpImage, lpImage, nSizeImage);
	
	// 釋放內存
	delete[]lpImage;
	
	// 返回
	return TRUE;

}


/*************************************************************************
 *
 * 函數名稱:
 *   MedianFilter()
 *
 * \輸入參數:
 *   CDib * pDib		- 指向CDib類的指針,含有原始圖象信息
 *   int nTempWidth		- 模板的寬度
 *   int nTempHeight		- 模板的高度
 *   int nTempCenX		- 模板中心的X坐標(相對于模板)
 *   int nTempCenY		- 模板中心的Y坐標(相對于模板)
 *
 * \返回值:
 *   BOOL			- 成功則返回TRUE,否則返回FALSE
 *
 * 說明:
 *   該函數對指定的DIB圖像進行中值濾波。
 *
 ************************************************************************/

BOOL MedianFilter(CDib* pDib,  int nTempWidth, int nTempHeight, 
					 int nTempCenX, int nTempCenY)
{	
	// 臨時存放圖像數據的指針
	LPBYTE lpImage;
	
	// 循環變量
	int i,j,k,l;
	
	// 指向源圖像的指針
	unsigned char*	lpSrc;
	
	// 指向要復制區域的指針
	unsigned char*	lpDst;

	// 圖象的高度和寬度
	CSize sizeImage;
	sizeImage = pDib->GetDimensions();

	// 獲得圖象數據存儲的尺寸
	int nSizeImage;
	nSizeImage = pDib->GetSizeImage();

	// 指向濾波器數組的指針
	unsigned char* pUnchFltValue;

	// 給臨時存放數據分配內存
	lpImage = (LPBYTE) new char[nSizeImage];
	// 判斷是否內存分配失敗
	if (lpImage == NULL)
	{
		// 返回
		return FALSE;
	}
	
	// 將原始圖像的數據拷貝到臨時存放內存中
	memcpy(lpImage, pDib->m_lpImage, nSizeImage);
	
	// 暫時分配內存,以保存濾波器數組
	pUnchFltValue = new unsigned char[nTempHeight * nTempWidth];
	
	// 判斷是否內存分配失敗
	if (pUnchFltValue == NULL)
	{
		// 釋放已分配內存
		delete[]lpImage;
		
		// 返回
		return FALSE;
	}
	
	// 開始中值濾波
	// 行(除去邊緣幾行)
	for(i = nTempCenY; i < sizeImage.cy - nTempHeight + nTempCenY + 1; i++)
	{
		// 列(除去邊緣幾列)
		for(j = nTempCenX; j < sizeImage.cx - nTempWidth + nTempCenX + 1; j++)
		{
			// 指向新DIB第i行,第j個象素的指針
			lpDst = (unsigned char*)lpImage + pDib->GetPixelOffset(i,j);
			//lpDst = (unsigned char*)lpImage + sizeImage.cx * (sizeImage.cy - 1 - i) + j;
			
			// 讀取濾波器數組
			for (k = 0; k < nTempHeight; k++)
			{
				for (l = 0; l < nTempWidth; l++)
				{
					// 指向DIB第i - nTempCenY + k行,第j - nTempCenX + l個象素的指針
					lpSrc = (unsigned char*)pDib->m_lpImage + pDib->GetPixelOffset(i-nTempCenY+k, j-nTempCenX+l);
					//lpSrc = (unsigned char*)pDib->m_lpImage + sizeImage.cx * (sizeImage.cy - 1 - i + nTempCenY - k) + j - nTempCenX + l;
					
					// 保存象素值
					pUnchFltValue[k * nTempWidth + l] = *lpSrc;
				}
			}
			
			// 獲取中值
			//* lpDst = GetMedianValue(pUnchFltValue, nTempHeight * nTempWidth);
		}
	}
	
	// 復制變換后的圖像
	memcpy(pDib->m_lpImage, lpImage, nSizeImage);
	
	// 釋放內存
	delete[]lpImage;
	delete[]pUnchFltValue;

	// 返回
	return TRUE;
}

/*************************************************************************
 *
 * 函數名稱:
 *   GetMedianValue()
 *
 * 參數:
 *   unsigned char * pUnchFltValue	- 指向要獲取中值的數組指針
 *   int   iFilterLen			- 數組長度
 *
 * 返回值:
 *   unsigned char			- 返回指定數組的中值。
 *
 * 說明:
 *   該函數用冒泡法對一維數組進行排序,并返回數組元素的中值。
 *
 ************************************************************************/

unsigned char  GetMedianValue(unsigned char * pUnchFltValue, int iFilterLen)
{
	// 循環變量
	int		i;
	int		j;
	
	// 中間變量
	unsigned char bTemp;
	
	// 用冒泡法對數組進行排序
	for (j = 0; j < iFilterLen - 1; j ++)
	{
		for (i = 0; i < iFilterLen - j - 1; i ++)
		{
			if (pUnchFltValue[i] > pUnchFltValue[i + 1])
			{
				// 互換
				bTemp = pUnchFltValue[i];
				pUnchFltValue[i] = pUnchFltValue[i + 1];
				pUnchFltValue[i + 1] = bTemp;
			}
		}
	}
	
	// 計算中值
	if ((iFilterLen & 1) > 0)
	{
		// 數組有奇數個元素,返回中間一個元素
		bTemp = pUnchFltValue[(iFilterLen + 1) / 2];
	}
	else
	{
		// 數組有偶數個元素,返回中間兩個元素平均值
		bTemp = (pUnchFltValue[iFilterLen / 2] + pUnchFltValue[iFilterLen / 2 + 1]) / 2;
	}
	
	// 返回中值
	return bTemp;
}

/*************************************************************************
 *
 * \函數名稱:
 *   LinearSharpen()
 *
 * \輸入參數:
 *   LPBYTE lpImage		- 指向圖象數據得指針
 *   int nWidth			- 圖象數據寬度
 *   int nHeight		- 圖象數據高度
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   線性銳化圖象增強
 *   本函數采用拉普拉斯算子對圖象進行線性銳化
 *   在原來圖象上加上拉普拉斯算子銳化的信息
 *
 *************************************************************************
 */
void LinearSharpen (LPBYTE lpImage, int nWidth, int nHeight)
{
	// 遍歷圖象的縱坐標
	int y;

	// 遍歷圖象的橫坐標
	int x;

	double * pdGrad ;
	pdGrad = new double[nWidth*nHeight];

	// 初始化為0
	memset(pdGrad, 0, nWidth*nHeight*sizeof(double)) ;

	// 設置模板系數
	static int nWeight[3][3] ;
	nWeight[0][0] = -1 ;   
	nWeight[0][1] = -1 ;   
	nWeight[0][2] = -1 ;   
	nWeight[1][0] = -1 ;   
	nWeight[1][1] =  8 ;   
	nWeight[1][2] = -1 ;   
	nWeight[2][0] = -1 ;   
	nWeight[2][1] = -1 ;   
	nWeight[2][2] = -1 ;   

	//這個變量用來表示Laplacian算子象素值
	int nTmp[3][3];

	// 臨時變量
	double dGrad;

	// 模板循環控制變量
	int yy ;
	int xx ;
	for(y=1; y<nHeight-1 ; y++ )
	 for(x=1 ; x<nWidth-1 ; x++ )
	 {
		 dGrad = 0 ; 
		 // Laplacian算子需要的各點象素值
		 
		 // 模板第一行
		 nTmp[0][0] = lpImage[(y-1)*nWidth + x - 1 ] ; 
		 nTmp[0][1] = lpImage[(y-1)*nWidth + x     ] ; 
		 nTmp[0][2] = lpImage[(y-1)*nWidth + x + 1 ] ; 
		 
		 // 模板第二行
		 nTmp[1][0] = lpImage[y*nWidth + x - 1 ] ; 
		 nTmp[1][1] = lpImage[y*nWidth + x     ] ; 
		 nTmp[1][2] = lpImage[y*nWidth + x + 1 ] ; 
		 
		 // 模板第三行
		 nTmp[2][0] = lpImage[(y+1)*nWidth + x - 1 ] ; 
		 nTmp[2][1] = lpImage[(y+1)*nWidth + x     ] ; 
		 nTmp[2][2] = lpImage[(y+1)*nWidth + x + 1 ] ; 
		 
		 // 計算梯度
		 for(yy=0; yy<3; yy++)
			 for(xx=0; xx<3; xx++)
			 {
				 dGrad += nTmp[yy][xx] * nWeight[yy][xx] ;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产欧美日韩| 尤物视频一区二区| 亚洲成人免费在线| 国产精品888| 日韩一级片网站| 亚洲永久免费av| 成人午夜精品在线| 日韩欧美一级二级三级| 亚洲综合偷拍欧美一区色| 国产成人免费视频精品含羞草妖精 | 午夜私人影院久久久久| 国产精品1区2区| 日韩你懂的在线播放| 亚洲中国最大av网站| 91在线国产观看| 欧美国产一区二区| 国内精品久久久久影院薰衣草| 欧美伊人久久大香线蕉综合69| 中文天堂在线一区| 国产xxx精品视频大全| 欧美精品一区二区三区一线天视频 | 麻豆国产欧美一区二区三区| 欧美日韩在线一区二区| 亚洲女同一区二区| 色哦色哦哦色天天综合| 中文字幕在线一区二区三区| 国产成a人亚洲| 国产性色一区二区| 福利一区在线观看| 国产精品污www在线观看| 成人综合激情网| 亚洲国产精品成人综合| 成人的网站免费观看| 亚瑟在线精品视频| 欧美日韩免费电影| 一区二区在线观看不卡| 欧美亚日韩国产aⅴ精品中极品| 亚洲视频免费看| 91麻豆免费视频| 亚洲免费在线观看| 欧美日韩亚洲综合一区| 午夜视频在线观看一区二区| 欧美精品色综合| 麻豆一区二区99久久久久| 日韩精品一区在线观看| 国产一区欧美二区| 日韩美女精品在线| 欧美三级三级三级爽爽爽| 视频一区中文字幕| 亚洲精品在线三区| av福利精品导航| 亚洲国产中文字幕| 精品国产制服丝袜高跟| 福利视频网站一区二区三区| 亚洲麻豆国产自偷在线| 欧美女孩性生活视频| 激情图区综合网| 中文字幕在线不卡一区二区三区| 91传媒视频在线播放| 爽爽淫人综合网网站| 久久久亚洲午夜电影| 欧美亚洲综合久久| 激情综合色播五月| 伊人婷婷欧美激情| 欧美r级在线观看| 99精品视频一区二区| 日韩va亚洲va欧美va久久| 久久欧美一区二区| 日本韩国欧美国产| 免费欧美日韩国产三级电影| 国产精品乱码人人做人人爱| 欧美美女bb生活片| 99国产麻豆精品| 麻豆国产欧美日韩综合精品二区| 国产欧美日韩在线看| 777亚洲妇女| 91婷婷韩国欧美一区二区| 蜜乳av一区二区三区| 亚洲欧美日韩一区二区三区在线观看| 欧美精品乱人伦久久久久久| 成人黄色777网| 另类小说综合欧美亚洲| 亚洲精品欧美专区| 日本一区二区三区高清不卡| 日韩午夜在线影院| 欧美中文字幕一二三区视频| 国产精品一区二区黑丝| 日韩一区欧美二区| 一区二区三区蜜桃| 亚洲欧洲无码一区二区三区| 精品国产一区a| 欧美一区二区日韩一区二区| 色综合久久综合网| 99久久精品国产一区| 国产剧情一区二区三区| 日本不卡一区二区三区高清视频| 亚洲精品网站在线观看| 一区在线中文字幕| 欧美韩国日本一区| 国产欧美综合在线| 久久久99精品免费观看| 欧美精品一区二区在线播放| 日韩精品一区二| 91精品国产高清一区二区三区| 欧美亚洲综合一区| 91久久精品一区二区| 色素色在线综合| 在线观看av一区| 欧美三片在线视频观看| 欧美在线观看视频一区二区三区| 97久久精品人人做人人爽50路| 国产成人精品亚洲日本在线桃色| 国产在线精品免费av| 九色porny丨国产精品| 久久成人免费电影| 国产综合一区二区| 极品少妇xxxx精品少妇| 精彩视频一区二区| 国产一区二区精品久久| 国产乱码精品一区二区三区av| 狠狠色丁香久久婷婷综合丁香| 精品一区二区三区在线观看| 韩国av一区二区三区在线观看| 加勒比av一区二区| 国产91精品精华液一区二区三区 | 久久婷婷久久一区二区三区| 久久综合五月天婷婷伊人| 欧美高清在线一区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产精品色哟哟网站| 亚洲六月丁香色婷婷综合久久 | 有码一区二区三区| 丝瓜av网站精品一区二区| 久久精品国产免费| 成人黄色av网站在线| 欧美色偷偷大香| 久久午夜老司机| 亚洲毛片av在线| 久久机这里只有精品| 高清国产一区二区| 欧美在线免费视屏| 久久夜色精品国产欧美乱极品| 国产亚洲欧美色| 一二三四社区欧美黄| 久久国产人妖系列| av资源站一区| 91精品国产手机| 国产精品毛片大码女人| 日韩专区欧美专区| 成人一级黄色片| 欧美三级视频在线| 欧美激情自拍偷拍| 日日夜夜免费精品| av亚洲精华国产精华| 欧美日韩精品一区二区| 日本一区二区三区视频视频| 一区二区三区在线看| 韩国一区二区视频| 色综合 综合色| 久久久久九九视频| 亚洲福利一区二区| av电影天堂一区二区在线观看| 7777精品伊人久久久大香线蕉的| 国产日韩视频一区二区三区| 亚洲丰满少妇videoshd| 成人午夜又粗又硬又大| 日韩一区二区三区四区| 亚洲精品高清在线| 成人激情综合网站| 欧美v国产在线一区二区三区| 亚洲男人电影天堂| 国产99精品国产| 欧美一二三四在线| 亚洲大型综合色站| 色视频一区二区| 国产精品久久久久久久久免费樱桃| 日本强好片久久久久久aaa| 91精彩视频在线观看| 中国色在线观看另类| 黑人巨大精品欧美一区| 日韩三级在线免费观看| 亚洲福利视频三区| 欧美性生活久久| 一区二区成人在线观看| 99精品1区2区| 一区视频在线播放| 成人免费福利片| 欧美国产精品劲爆| 懂色av一区二区夜夜嗨| 久久精品日产第一区二区三区高清版| 三级一区在线视频先锋| 欧美日韩视频不卡| 亚洲大片在线观看| 91麻豆精品国产自产在线| 亚洲综合色区另类av| 欧美亚洲日本国产| 亚洲高清视频的网址| 欧美久久久久久久久中文字幕| 亚洲国产精品一区二区尤物区| 欧美日韩高清影院|