⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gausslowpass.cpp

📁 将数据进行高斯低通变化
💻 CPP
字号:
BOOL CDIB::GaussLowPass(unsigned char *lpDIBBits, LONG nWidth, LONG nHeight, int nRadius)
{
	unsigned char*	lpSrc;							// 指向源图像的指针
	int y ;										// 循环控制变量
	int x ;										// 循环控制变量
	double dTmpOne ;								//存放临时变量
	double dTmpTwo ;								//存放临时变量
	double H ;										// Gauss 滤波系数
	int nTransWidth ;								// 傅立叶变换的宽度(2的整数次幂)
	int nTransHeight;								// 傅立叶变换的高度(2的整数次幂)
	double dReal ;									// 傅立叶变换的实部
	double dImag;									// 傅立叶变换的虚部
	double unchValue;								// 存贮图像各像素灰度的临时变量
	CComplex * pCTData ;						// 指向时域数据的指针
	CComplex * pCFData ;						// 指向频域数据的指针
	// 计算进行傅立叶变换的点数-横向	(2的整数次幂)
	dTmpOne = log(nWidth)/log(2);
	dTmpTwo = ceil(dTmpOne)	;
	dTmpTwo = pow(2,dTmpTwo);
	nTransWidth = (int) dTmpTwo;	
	// 计算进行傅立叶变换的点数-纵向 (2的整数次幂)
	dTmpOne = log(nHeight)/log(2);
	dTmpTwo = ceil(dTmpOne)	;
	dTmpTwo = pow(2,dTmpTwo);
	nTransHeight = (int) dTmpTwo;	
	pCTData=new CComplex[nTransWidth * nTransHeight]; // 分配内存
	pCFData=new CComplex[nTransWidth * nTransHeight]; // 分配内存
	// 图像数据的宽和高不一定是2的整数次幂,所以pCTData有一部分数据需要补0
	for(y=0; y<nTransHeight; y++)
	{
		for(x=0; x<nTransWidth; x++)
		{
			pCTData[y*nTransWidth + x].Real=0;	// 补零
			pCTData[y*nTransWidth + x].Image=0;
		}
	}
	for(y=0; y<nHeight; y++)							// 把图像数据传给pCTData
	{
		for(x=0; x<nWidth; x++)
		{
			// 指向DIB第y行,第x个象素的指针
			lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;
			unchValue = *lpSrc;
			unchValue = unchValue*pow(-1,nHeight+nWidth);
			pCTData[y*nTransWidth + x].Real=unchValue;
			pCTData[y*nTransWidth + x].Image=0;
		}
	}	
	FFT_2D(pCTData, nWidth, nHeight, pCFData) ;			// 傅立叶正变换
	for(y=0; y<nTransHeight; y++)						// 开始实施ButterWorth低通滤波
	{
		for(x=0; x<nTransWidth; x++)
		{
			H = (double)(y*y+x*x) ; 
			H = -H / (nRadius * nRadius)/2.0f; 
			H = exp(H)  ;							// 求H值
			pCFData[y*nTransWidth + x].Real=pCFData[y*nTransWidth + x].Real*H;
			pCFData[y*nTransWidth + x].Image=pCFData[y*nTransWidth + x].Image*H;
		}
	}
	// 经过ButterWorth低通滤波的图象进行反变换
	IFFT_2D(pCFData, pCTData, nWidth, nHeight);
	for(y=0; y<nHeight; y++)							// 反变换的数据传给lpDIBBits
	{
		for(x=0; x<nWidth; x++)
		{
			dReal = pCTData[y*nTransWidth + x].Real ;
			dImag = pCTData[y*nTransWidth + x].Image ;
			unchValue = max(0,min(255,sqrt(dReal*dReal+dImag*dImag) ));
			// 指向DIB第y行,第x个象素的指针
			unchValue = unchValue*pow(-1,nHeight+nWidth);
			lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;
			*lpSrc =unchValue ;
		}
	}
	delete []pCTData;									// 释放内存
	delete []pCFData;									// 释放内存
	pCTData = NULL;
	pCFData = NULL;
	return true;									//返回结果	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -