亚洲欧美第一页_禁久久精品乱码_粉嫩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片在线免费观看| 精品欧美乱码久久久久久| 亚洲一区在线视频观看| 不卡电影一区二区三区| 欧美tickling网站挠脚心| 亚洲一区二区三区不卡国产欧美| 国产精品一区二区免费不卡| 91麻豆精品国产91久久久久久久久| 亚洲欧美自拍偷拍色图| 免费av网站大全久久| 欧美午夜免费电影| 亚洲精品日韩专区silk| 99热精品国产| 中文字幕av免费专区久久| 久久99蜜桃精品| 91精品国产一区二区三区| 亚洲欧美国产高清| 99精品国产热久久91蜜凸| 国产欧美精品一区aⅴ影院 | 国产精品资源在线| 日韩一区二区视频| 男人操女人的视频在线观看欧美 | 亚洲在线免费播放| 99精品热视频| 国产精品久久久久影院| 国产精品亚洲一区二区三区妖精| 欧美成人精品1314www| 六月丁香婷婷久久| 精品成人在线观看| 国产精品资源网站| 国产精品不卡一区| 91视频免费播放| 亚洲视频在线一区| 色综合久久中文字幕综合网| 亚洲三级在线播放| 在线视频亚洲一区| 午夜欧美视频在线观看| 欧美一区二区精品久久911| 麻豆一区二区三区| 精品国产一区二区三区久久久蜜月 | 日韩av中文字幕一区二区三区| 欧美午夜精品久久久| 偷拍一区二区三区| 日韩欧美国产综合在线一区二区三区| 美女网站在线免费欧美精品| 精品999久久久| 成人午夜激情视频| 亚洲欧美日韩小说| 88在线观看91蜜桃国自产| 久久国产三级精品| 欧美国产在线观看| 在线视频你懂得一区二区三区| 午夜视频在线观看一区| 欧美成人精品二区三区99精品| 国产精品 欧美精品| 成人免费一区二区三区在线观看| 色婷婷久久久亚洲一区二区三区| 亚洲国产cao| 欧美大度的电影原声| 国产成人综合亚洲网站| 亚洲色欲色欲www在线观看| 欧美日韩国产精品自在自线| 国产一区二区三区在线观看免费| 综合激情网...| 欧美高清一级片在线| 韩国成人福利片在线播放| 亚洲人快播电影网| 欧美大片一区二区三区| 一本色道久久加勒比精品| 久久国产精品无码网站| 一区二区三区在线免费播放| 日韩欧美一区在线| www.成人网.com| 久久精品久久99精品久久| 日韩美女视频一区二区| 欧美xfplay| 欧美日韩在线直播| 粉嫩绯色av一区二区在线观看| 亚洲综合精品自拍| 国产精品丝袜黑色高跟| 日韩一本二本av| 日本久久精品电影| 国产成人午夜视频| 免费成人深夜小野草| 亚洲国产欧美在线人成| 国产精品狼人久久影院观看方式| 日韩亚洲欧美在线| 欧美探花视频资源| 99久久精品国产导航| 极品少妇xxxx偷拍精品少妇| 丝袜亚洲精品中文字幕一区| 亚洲欧美电影院| 国产精品久久久久久久久搜平片 | 欧美日韩午夜精品| 91在线小视频| 波多野结衣91| 国产精品资源在线| 国产伦精品一区二区三区免费 | av在线不卡电影| 国产精品自在欧美一区| 久久精品国产免费| 久久精品噜噜噜成人av农村| 日韩电影在线看| 日韩精品一二三| 午夜精品福利久久久| 一区二区日韩电影| 亚洲高清中文字幕| 午夜日韩在线电影| 日韩成人一级片| 日本欧美韩国一区三区| 日韩在线观看一区二区| 日韩激情一区二区| 日韩—二三区免费观看av| 日本欧美一区二区| 蜜桃av一区二区三区电影| 日韩国产高清影视| 麻豆国产精品777777在线| 奇米综合一区二区三区精品视频| 日韩激情视频网站| 热久久一区二区| 久久精品国产一区二区| 国产美女一区二区三区| 成人精品一区二区三区中文字幕| 成人av资源站| 色八戒一区二区三区| 欧美日韩精品一区二区天天拍小说| 欧美日韩国产免费一区二区 | 久久69国产一区二区蜜臀| 国产精品资源网| 成人午夜激情片| 91久久人澡人人添人人爽欧美| 欧美性色黄大片手机版| 日韩一区和二区| 国产欧美日韩精品在线| 亚洲人成7777| 免费一级片91| 东方aⅴ免费观看久久av| 色88888久久久久久影院野外| 欧美日本一区二区三区| 久久综合av免费| 最新久久zyz资源站| 亚洲高清久久久| 国产一区二区在线视频| 91农村精品一区二区在线| 欧美日韩国产乱码电影| 国产欧美日韩亚州综合| 亚洲国产综合色| 国产成人精品在线看| 欧美午夜片在线观看| 久久综合色综合88| 亚洲蜜臀av乱码久久精品| 另类人妖一区二区av| 色综合久久99| 久久久久久久久久久久久夜| 一区二区三区在线影院| 国产精品资源在线看| 欧美日韩亚洲综合一区| 国产女人水真多18毛片18精品视频 | 99久久免费精品| 日韩午夜在线观看视频| 日韩一区中文字幕| 国产精品一区二区久久精品爱涩| 在线观看视频91| 中文字幕免费观看一区| 免费高清视频精品| 欧美综合色免费| 亚洲国产成人在线| 青青草国产精品97视觉盛宴| 91成人网在线| 国产精品福利一区| 国产精品影音先锋| 91精品久久久久久久久99蜜臂| 日韩一区在线看| 国内精品在线播放| 欧美日韩高清一区二区不卡| 日韩一区日韩二区| 国产成+人+日韩+欧美+亚洲| 日韩欧美一级片| 亚洲成va人在线观看| 91久久精品国产91性色tv| 日本一区二区三区四区 | 久久久www免费人成精品| 五月天欧美精品| 欧美丝袜第三区| 亚洲精品国久久99热| 夫妻av一区二区| 久久精品亚洲国产奇米99| 日韩高清中文字幕一区| 欧美美女直播网站| 亚洲国产人成综合网站| 欧美中文字幕一区| 亚洲图片欧美色图| 色婷婷av一区二区三区软件| 亚洲精品视频在线看| 一本色道久久综合狠狠躁的推荐| 亚洲人成影院在线观看| 91美女视频网站|