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

📄 fretrans.cpp

📁 一个简单的打开位图程序,并实现正交傅立叶变换.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			// 计算频谱
			dTemp = sqrt(TD[j * h + i].real() * TD[j * h + i].real() + 
				         TD[j * h + i].imag() * TD[j * h + i].imag());
			
			// 判断是否超过255
			if (dTemp > 255)
			{
				// 对于超过的,直接设置为255
				dTemp = 255;
			}
			
			// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
			// 此处不直接取i和j,是为了将变换后的原点移到中心
		      lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			//lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 
				//(lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
			
			// 更新源图像
			* (lpSrc) = (BYTE)(dTemp);
		}
	}
	
	// 删除临时变量
	delete TD;
	delete FD;
	
	// 返回
	return TRUE;
}
/*************************************************************************
 *
 * 函数名称:
 *  BTWSLP()
 *
 * 参数:
 *   LPSTR lpDIBBits    - 指向源DIB图像指针
 *   LONG  lWidth       - 源图像宽度(象素数)
 *   LONG  lHeight      - 源图像高度(象素数)
 *
 * 返回值:
 *   BOOL               - 成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *   该函数用来对图像进行付立叶变换。
 *
 ************************************************************************/
 BOOL WINAPI BTWSLP(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
	
	// 指向源图像的指针
	unsigned char*	lpSrc;
	
	// 中间变量
	double	dTemp;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 进行付立叶变换的宽度和高度(2的整数次方)
	LONG	w;
	LONG	h;
	
	int		wp;
	int		hp;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	// 赋初值
	w = 1;
	h = 1;
	wp = 0;
	hp = 0;
	
	// 计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w * 2 <= lWidth)
	{
		w *= 2;
		wp++;
	}
	
	while(h * 2 <= lHeight)
	{
		h *= 2;
		hp++;
	}
	
	// 分配内存
	complex<double> *TD = new complex<double>[w * h];
	complex<double> *FD = new complex<double>[w * h];
	
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			// 指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			
			// 给时域赋值
			TD[j + w * i] = complex<double>(*(lpSrc), 0);
		}
	}
	
	for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶变换
		FFT(&TD[w * i], &FD[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			TD[i + h * j] = FD[j + w * i];
		}
	}
	
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶变换
		FFT(&TD[i * h], &FD[i * h], hp);
	}




	/////////////////////////对傅立叶变换结果进行转置
	complex<double> *FD11 = new complex<double>[w * h];
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD11[i + w * j] = FD[j + w * i];
		}
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[j + w * i] = FD11[j + w * i];
		}
	}
	//delete FD11;
	/////////////////////////////自己加的平移
	int ii,jj;
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			ii=i<h/2 ? i+h/2 : i-h/2;
	        jj=j<w/2 ? j+w/2 : j-w/2;
			FD11[jj+ w * ii] = FD[j + w * i];
		}
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[i+ w * j] = FD11[i+ w * j];
		}
	}
	delete FD11;
   //////////////////////////////////////////////////////自己加的平移

	////////////////////zjbian
	float D1;
	float D0=50.0;
	float HT;

	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
                D1=(float)sqrt((i-h/2)*(i-h/2)+(j-w/2)*(j-w/2));
                HT=1.0/(1+(D1/D0)*(D1/D0));// 一阶巴特沃斯
                FD[i+j*h]*=HT;
                
		}
     
	}
	///////////
	
	for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶逆变换
		IFFT(&FD[w * i], &TD[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[i + h * j] = TD[j + w * i];
		}
	}




	
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立逆叶变换
		IFFT(&FD[i * h], &TD[i * h], hp);
	}
	
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			// 计算频谱
			dTemp = sqrt(TD[j * h + i].real() * TD[j * h + i].real() + 
				         TD[j * h + i].imag() * TD[j * h + i].imag());
			
			// 判断是否超过255
			if (dTemp > 255)
			{
				// 对于超过的,直接设置为255
				dTemp = 255;
			}
			
			// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
			// 此处不直接取i和j,是为了将变换后的原点移到中心
		      lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			//lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 
				//(lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
			
			// 更新源图像
			* (lpSrc) = (BYTE)(dTemp);
		}
	}
	
	// 删除临时变量
	delete TD;
	delete FD;
	
	// 返回
	return TRUE;
}
/*************************************************************************
 *
 * 函数名称:
 * RELATIVITY()
 *
 * 参数:
 *   LPSTR lpDIBBits    - 指向源DIB图像指针
 *   LONG  lWidth       - 源图像宽度(象素数)
 *   LONG  lHeight      - 源图像高度(象素数)
 *
 * 返回值:
 *   BOOL               - 成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *   该函数用来对图像进行付立叶变换。
 *
 ************************************************************************/
 BOOL WINAPI RELATIVITY(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
	
	// 指向源图像的指针
	unsigned char*	lpSrc;
	
	// 中间变量
	double	dTemp;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 进行付立叶变换的宽度和高度(2的整数次方)
	LONG	w;
	LONG	h;
	
	int		wp;
	int		hp;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	// 赋初值
	w = 1;
	h = 1;
	wp = 0;
	hp = 0;
	
	// 计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w * 2 <= lWidth)
	{
		w *= 2;
		wp++;
	}
	
	while(h * 2 <= lHeight)
	{
		h *= 2;
		hp++;
	}
	
	// 分配内存
	complex<double> *TD = new complex<double>[w * h];
	complex<double> *FD = new complex<double>[w * h];
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			// 指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			
			// 给时域赋值
			TD[j + w * i] = complex<double>(*(lpSrc), 0);
		}
	}
	
	for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶变换
		FFT(&TD[w * i], &FD[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			TD[i + h * j] = FD[j + w * i];
		}
	}
	
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶变换
		FFT(&TD[i * h], &FD[i * h], hp);
	}




	/////////////////////////对傅立叶变换结果进行转置
	complex<double> *FD11 = new complex<double>[w * h];
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD11[i + w * j] = FD[j + w * i];
		}
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[j + w * i] = FD11[j + w * i];
		}
	}
	//delete FD11;
	/////////////////////////////自己加的平移
	int ii,jj;
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			ii=i<h/2 ? i+h/2 : i-h/2;
	        jj=j<w/2 ? j+w/2 : j-w/2;
			FD11[jj+ w * ii] = FD[j + w * i];
		}
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[i+ w * j] = FD11[i+ w * j];
		}
	}
	delete FD11;
   //////////////////////////////////////////////////////自己加的平移
	// 分配内存
	complex<double> *TDH = new complex<double>[w * h];
	complex<double> *FDH = new complex<double>[w * h];
// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
	         if((i>=(h-3)/2&&i<=(h+1)/2)&&(j>=(w-3)/2&&j<=(w+1)/2))
                    {
			           TDH[j + w * i] = 1/9;
                    }
                 else
                    {
                       TDH[j + w * i] = 0;
                    }
		}
	}
for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶变换
		FFT(&TDH[w * i], &FDH[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			TDH[i + h * j] = FDH[j + w * i];
		}
	}
	
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶变换
		FFT(&TDH[i * h], &FDH[i * h], hp);
	}
/////////////////////////对傅立叶变换结果进行转置
	complex<double> *FD22 = new complex<double>[w * h];
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD22[i + w * j] = FDH[j + w * i];
		}
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FDH[j + w * i] = FD22[j + w * i];
		}
	}
	//delete FD22;
	/////////////////////////////自己加的平移
	int iii,jjj;
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
		 iii=i<h/2 ? i+h/2 : i-h/2;
	         jjj=j<w/2 ? j+w/2 : j-w/2;
		 FD22[jjj+ w * iii] = FDH[j + w * i];
		}
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FDH[i+ w * j] = FD22[i+ w * j];
		}
	}
	delete FD22;
   //////////////////////////////////////////////////////自己加的平移
 ///////////////////////////////////////////////////////////频域乘积
//complex<double> *FD33 = new complex<double>[w * h];
double fResult1=0,fResult2=0;
for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
                /** for(j=0; j < w;j++)
                  {
                   fResult+=(FD[j+w*i].real ())+(FDH[i+w*j].imag() ) ;
                   }
	;*/
             fResult1= FD[j+w*i].real() *FDH[i+w*j].real()-FD[j+w*i].imag() *FDH[i+w*j].imag();
			 fResult2=FD[j+w*i].real() *FDH[i+w*j].imag()+FD[j+w*i].imag() *FDH[i+w*j].real();
	    	 FD[j + w * i] = complex<double>(fResult1, fResult2);
		}
	}
/*for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[i+ w * j] = FD33[i+ w * j];
		}
	}
	delete FD33;*/
///////////////////////////////////////////////////////////////
	for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶逆变换
		IFFT(&FD[w * i], &TD[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD[i + h * j] = TD[j + w * i];
		}
	}


   for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立逆叶变换
		IFFT(&FD[i * h], &TD[i * h], hp);
	}
	
	// 行
	for(i = 0; i < h; i++)
	{
		// 列
		for(j = 0; j < w; j++)
		{
			// 计算频谱
			dTemp = sqrt(TD[j * h + i].real() * TD[j * h + i].real() + 
				         TD[j * h + i].imag() * TD[j * h + i].imag());
			
			// 判断是否超过255
			if (dTemp > 255)
			{
				// 对于超过的,直接设置为255
				dTemp = 255;
			}
			
			// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
			// 此处不直接取i和j,是为了将变换后的原点移到中心
		      lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			//lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 
				//(lHeight - 1 - (i<h/2 ? i+h/2 : i-h/2)) + (j<w/2 ? j+w/2 : j-w/2);
			
			// 更新源图像
			* (lpSrc) = (BYTE)(dTemp);
		}
	}
	
	// 删除临时变量
	delete TD;
	delete FD;
	delete TDH;
	delete FDH;
	
	// 返回
	return TRUE;
}





⌨️ 快捷键说明

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