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

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

?? enhance.cpp

?? 《Visual C++數字圖像獲取 處理及實踐應用》一書的源代碼
?? 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丨porny丨首页| 青娱乐精品在线视频| 中文字幕精品三区| 91精品久久久久久蜜臀| 成人一区在线观看| 手机精品视频在线观看| 日韩一区二区三区电影在线观看 | 亚洲久草在线视频| 欧美一卡二卡三卡| 色综合欧美在线视频区| 免费观看91视频大全| 亚洲黄色免费网站| 日本一区二区高清| 日韩色视频在线观看| 91九色最新地址| 成人性色生活片| 亚洲超碰97人人做人人爱| 国产精品婷婷午夜在线观看| 91.xcao| www.亚洲在线| 国产一区二区0| 极品美女销魂一区二区三区| 午夜精品一区二区三区电影天堂| 综合激情成人伊人| 国产视频一区在线播放| 精品久久久三级丝袜| 欧美男人的天堂一二区| 99久久777色| 91精品国产aⅴ一区二区| 五月天久久比比资源色| 国产精品久久影院| 久久久久久久免费视频了| 欧美精品1区2区3区| 欧美亚洲国产bt| 91浏览器入口在线观看| 国产一区二区福利视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 一个色综合网站| 亚洲人成人一区二区在线观看| 国产亚洲欧美日韩在线一区| 精品国产乱码久久久久久影片| 欧美一区二区三区公司| 欧美一区二区在线免费观看| 欧美人妇做爰xxxⅹ性高电影| 成人免费高清在线| 成人高清在线视频| www.色综合.com| 国产麻豆精品theporn| 国产一区二区伦理| 国产99久久久国产精品潘金| 国产乱码精品一区二区三区忘忧草 | 美女视频黄 久久| 美女精品自拍一二三四| 日韩国产精品久久久久久亚洲| 亚洲不卡一区二区三区| 视频一区二区国产| 麻豆高清免费国产一区| 久久99精品视频| 久久99精品久久久久久动态图| 久久成人久久鬼色| 国产乱码精品一区二区三区av | 国产精品12区| 国产真实乱子伦精品视频| 蜜臀av性久久久久蜜臀aⅴ| 蜜桃传媒麻豆第一区在线观看| 丝袜亚洲另类欧美| 麻豆精品精品国产自在97香蕉| 精品午夜久久福利影院 | 成人中文字幕合集| gogo大胆日本视频一区| 91高清视频免费看| 日韩一区二区电影网| 26uuu色噜噜精品一区二区| 国产精品欧美一区喷水| 亚洲精品福利视频网站| 亚洲国产精品久久久男人的天堂| 青青草原综合久久大伊人精品| 国产乱码精品一区二区三区五月婷| 成人免费视频视频| 欧美亚洲高清一区二区三区不卡| 日韩欧美精品三级| 国产精品久久午夜| 亚洲成人精品一区二区| 国内久久婷婷综合| 国产精品美女www爽爽爽| 国产丝袜欧美中文另类| 亚洲免费av在线| 免费高清成人在线| 成人av在线电影| 7777精品久久久大香线蕉| 久久久久久一二三区| 国产精品嫩草99a| 午夜欧美在线一二页| 国产麻豆9l精品三级站| 色视频一区二区| 2021中文字幕一区亚洲| 亚洲蜜臀av乱码久久精品| 日一区二区三区| 国产成人在线看| 欧美日韩一区成人| 国产精品每日更新在线播放网址 | 北条麻妃一区二区三区| 6080亚洲精品一区二区| 国产午夜精品久久久久久久 | 一区二区三区在线视频免费| 国产一区二区在线观看免费| 欧美片在线播放| 亚洲一区av在线| 色悠悠亚洲一区二区| 国产日产欧美一区| 久久成人18免费观看| 欧美一区二区人人喊爽| 亚洲二区在线观看| 欧美亚洲动漫制服丝袜| 伊人婷婷欧美激情| 色综合色狠狠综合色| 亚洲视频免费看| 色综合天天综合色综合av| 中文字幕精品一区二区三区精品| 国产美女视频一区| 精品99999| 久久国产欧美日韩精品| 欧美成人在线直播| 久久精品国产秦先生| 精品久久久久久最新网址| 久久国产尿小便嘘嘘尿| 亚洲精品一区二区三区福利 | 在线观看免费成人| 一区二区久久久| 在线一区二区观看| 亚洲自拍偷拍网站| 欧美日韩精品是欧美日韩精品| 亚洲成国产人片在线观看| 欧美另类变人与禽xxxxx| 日韩电影在线一区| 日韩免费福利电影在线观看| 激情另类小说区图片区视频区| 久久欧美一区二区| 国产91丝袜在线观看| 亚洲私人影院在线观看| 91福利在线播放| 日本三级韩国三级欧美三级| 精品久久久久一区| 成人avav影音| 亚洲国产中文字幕| 欧美成人r级一区二区三区| 国产精品77777| 亚洲丝袜美腿综合| 欧美日韩国产系列| 久久99日本精品| 一区二区中文字幕在线| 欧美天堂一区二区三区| 久久er精品视频| 综合在线观看色| 在线成人av网站| 顶级嫩模精品视频在线看| 亚洲美女精品一区| 欧美一区二区人人喊爽| 国产69精品久久久久毛片| 亚洲激情中文1区| 日韩欧美国产1| 99精品国产一区二区三区不卡| 天天操天天综合网| 国产女主播一区| 欧美精品在线视频| 国产91精品露脸国语对白| 一区二区日韩av| 久久久噜噜噜久噜久久综合| 色综合久久综合| 激情综合色综合久久| 亚洲人成人一区二区在线观看| 日韩欧美www| 91日韩一区二区三区| 久久99热这里只有精品| 亚洲精品写真福利| www国产精品av| 欧美日韩国产一二三| 成人av电影在线网| 久久国产精品色| 亚洲电影第三页| 国产精品乱人伦| 91精品久久久久久蜜臀| 99久久久免费精品国产一区二区| 蜜桃视频第一区免费观看| 亚洲免费在线看| 久久女同精品一区二区| 欧美性猛交一区二区三区精品| 成人免费视频播放| 韩国成人在线视频| 日本中文字幕一区|