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

📄 main.cpp

📁 指定方差和窗口的大小, 产生2维高斯平滑窗的源码.
💻 CPP
字号:
// gen 2D guass window
//

#define PI 3.1415926

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"

int main(int argc, char* argv)
{
	// 输入参数对么?	
 	//if (argc != 5)
 	//{	
		//printf("pls input 5 params\n");
 	// 	return 0;
 	//}
	
 	// range
 	// 注意 range 是奇数
	//int range = argv[0];
	//if (range % 2 != 0)
	//{
	//	printf("range must be odd number!\n");
	//	return 0;
	//}
	
	int range = 5;
	
	// sigma 1 1.2 1.4 1.5 1.6 1.8 2.0
	//double sigma = argv[2];
	double sigma_x = 1.0;
	double sigma_y = 1.0;

	//double sigma_x = 0.707;
	//double sigma_y = 0.707;

	//double sigma_x = 0.79358;
	//double sigma_y = 0.79358;

	//double sigma_x = 0.890762;
	//double sigma_y = 0.890762;

	//double sigma_x = 0.999849;
	//double sigma_y = 0.999849;

	//double sigma_x = 0.3535;	// 1.414/4
	//double sigma_y = 0.3535;	// 1.414/4

	//double sigma_x = 0.7070;	// 1.414/4
	//double sigma_y = 0.7070;	// 1.414/4

	//double sigma_x = 0.236;	// 1.414/6
	//double sigma_y = 0.236;	// 1.414/6

 	// dx 步长 0.1  dy 步长0.1
	//double dx = argv[1];
	double dx = 0.1;
	double dy = 0.1;

	// 窗口文件名
	char GuassWndwFileName[255] = "gs2DSigma_x1_y1";
	//strcpy(GuassWndwFileName, &argv[3]);
	
	// 数组记录数据
	int gsLoc = 0;
	// 目前257是足够大了
	double guassWin[257];
	//memset(guassWin, 0, 257);
	//ZeroMemory(guassWin, sizeof(257*sizeof(double));
	
	// 总的值
	double total_sum = 0;
	// 每个cell的值
	double cell_sum = 0;
	
	//  
	double mid_dx = dx/2;	
	double mid_dy = dy/2;	
	
	double start_x = -1 * (double(range)/2);
	double start_y = -1 * (double(range)/2);
	double end_x;
	double end_y;
	
	//while(start_x < (double)range/2 && 
	//		start_y < (double)range/2
	//		)
	for(; start_x < (double)range/2; start_x = start_x + 1.0 )
	{
		start_y = -1 * (double(range)/2);
		for(; start_y < (double)range/2; start_y = start_y + 1.0 )
		{
			// 当前计算的范围
			end_x = start_x + 1.0;
			end_y = start_y + 1.0;
			
			// 本单元格的高斯值清零
			cell_sum = 0.0;
			
			// 以一个步长为单位,从每个步长的中点开始计算
			for(double tag_x = start_x + mid_dx; tag_x < end_x; tag_x = tag_x + dx )
			{
				for(double tag_y = start_y + mid_dy; tag_y < end_y; tag_y = tag_y + dy )
				{
					// 前面的系数值
					double preComp = (double)1.0/(sigma_x * sigma_y * sqrt(2*PI));
							
					// 后面部分指数值
					double expComp_x = (-1)*(tag_x * tag_x)/(2*(sigma_x*sigma_x));
					double expComp_y = (-1)*(tag_y * tag_y)/(2*(sigma_y*sigma_y));
					double expComp = expComp_x + expComp_y;
					
					// 后面部分值
					double suffComp = (double)exp(expComp);
					// guass值
					double guassVal = preComp * suffComp;
					
					// 
					cell_sum += guassVal;
					
				}// end for
			}//end for
			
			// 记录到数组
			guassWin[gsLoc] = cell_sum; 
			gsLoc++;
			
			//start_x = start_x + 1.0;
			//start_y = start_y + 1.0;
			
			//total_sum
			total_sum += cell_sum;
		}
	}//end outer for
	
	// 
	FILE *resFile = fopen(GuassWndwFileName, "w");
	// 显示到文件
	int len_1D = (int)sqrtl(gsLoc);
	for(int i = 0; i < len_1D ; i++)
	{
		fprintf(resFile, "\n");
		for(int j = 0; j < len_1D ; j++)
		{
			int loc = i * len_1D + j;
			fprintf(resFile, "[%10.5f \t %10.5f]", guassWin[loc], guassWin[loc]/total_sum);
			
		}//end for
	}// end for

	// 归一化
	fprintf(resFile, " \n\n\n");
	for(int i = 0; i < len_1D ; i++)
	{
		fprintf(resFile, "\n");
		for(int j = 0; j < len_1D ; j++)
		{
			int loc = i * len_1D + j;
			fprintf(resFile, "%f, ", guassWin[loc]/total_sum);
			
		}//end for
	}// end for

	if (resFile)
	{
		fclose(resFile);
	}
	
	return 0;
	
	 
	
	
}



⌨️ 快捷键说明

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