user-0 提问: 不用matlab和opencv，只是用简单的C语言，能实现高斯滤波吗

回复:
user: user-1
content: 引用 8 楼 u013931282 的回复:[quote=引用 7 楼 lovesmiles 的回复:] [quote=引用 6 楼 u013931282 的回复:] [quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 4 楼 u013931282 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 搜“VC6 高斯滤波 源代码” int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements}  double conv[3][3];  double hg = 0;       //Convolution kernel for(i=0; i<3;i++) { for(j=0;j<3;j++) { int u=i-1; //subtract from centre element index in 3*3 (1,1) int v=j-1; conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  hg += conv[i][j]; } } for(int i=0; i<3;i++) { for(int j=0;j<3;j++) {                 conv[i][j] = conv[i][j] / hg; } }      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights for(int i =0; i < height ; i++) { for(int j =0; j < width ; j++) { for(int k =0; k < 3 ; k++) { double val = 0; double valw =0; if(j-1 > 0  && i-1 > 0) { val += conv[0][0] * XImage[i-1][j-1][k]; valw += conv[0][0]; } if(i-1 > 0 ) { val += conv[0][1] * XImage[i-1][j][k]; valw += conv[0][1];                                                                  } if(i-1 > 0 && j+1 < width) { val += conv[0][2] * XImage[i-1][j+1][k]; valw += conv[0][2]; }  if(j-1 > 0 ) { val += conv[1][0] * XImage[i][j-1][k]; valw += conv[1][0]; }  val += conv[1][1] * XImage[i][j][k]; valw += conv[1][1];                                                                 if(j+1 < width) { val += conv[1][2] * XImage[i][j+1][k]; valw += conv[1][2]; }  if(j-1 > 0  && i+1 < height) { val += conv[2][0] * XImage[i+1][j-1][k]; valw += conv[2][0]; } if(i+1 < height) { val += conv[2][1] * XImage[i+1][j][k]; valw += conv[2][1]; } if(j+1 < width  && i+1 < height) { val += conv[2][2] * XImage[i+1][j+1][k]; valw += conv[2][2]; }       	sXImage[i][j][k] = val / valw;    } }  }   return( sXImage);   } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！[/quote] K是RGB三色通道。看你是对彩图还是灰度图操作。对灰度图操作，这个代码要改一下。[/quote] 我的是对灰度图像操作，是将K去掉就可以了吗？高斯滤波结束后，图像的像素有什么规律吗，我怎么判断我的结果是否正确？谢啦！嘿嘿[/quote]  怎么判断你的结果是不是正确的，这个真是个难题，只能用同样的算法在matlab上面跑一下两个结果是不是一致。 话说你对高斯滤波的意义和算法步骤理解透彻没有？你说的结果正确是什么概念？[/quote] 老师让我自己看，查高斯滤波的代码，我在网上查到的，高斯滤波就是用邻域内像素的加权平均值代替邻域中心的像素值，先要通过公式产生一个模板，然后用这个模板和图像矩阵做卷积运算。我理解的是把卷积运算后的结果赋值给原图像，然后原图像就改变了，是这样吗？我也是刚学，所以也不知道查的对不对。双边滤波是和高斯滤波的步骤差不多，只是产生模板的公式不一样吗？[/quote] 模板也有大小的。

user: user-0
content: 引用 7 楼 lovesmiles 的回复:[quote=引用 6 楼 u013931282 的回复:] [quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 4 楼 u013931282 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 搜“VC6 高斯滤波 源代码” int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements}  double conv[3][3];  double hg = 0;       //Convolution kernel for(i=0; i<3;i++) { for(j=0;j<3;j++) { int u=i-1; //subtract from centre element index in 3*3 (1,1) int v=j-1; conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  hg += conv[i][j]; } } for(int i=0; i<3;i++) { for(int j=0;j<3;j++) {                 conv[i][j] = conv[i][j] / hg; } }      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights for(int i =0; i < height ; i++) { for(int j =0; j < width ; j++) { for(int k =0; k < 3 ; k++) { double val = 0; double valw =0; if(j-1 > 0  && i-1 > 0) { val += conv[0][0] * XImage[i-1][j-1][k]; valw += conv[0][0]; } if(i-1 > 0 ) { val += conv[0][1] * XImage[i-1][j][k]; valw += conv[0][1];                                                                  } if(i-1 > 0 && j+1 < width) { val += conv[0][2] * XImage[i-1][j+1][k]; valw += conv[0][2]; }  if(j-1 > 0 ) { val += conv[1][0] * XImage[i][j-1][k]; valw += conv[1][0]; }  val += conv[1][1] * XImage[i][j][k]; valw += conv[1][1];                                                                 if(j+1 < width) { val += conv[1][2] * XImage[i][j+1][k]; valw += conv[1][2]; }  if(j-1 > 0  && i+1 < height) { val += conv[2][0] * XImage[i+1][j-1][k]; valw += conv[2][0]; } if(i+1 < height) { val += conv[2][1] * XImage[i+1][j][k]; valw += conv[2][1]; } if(j+1 < width  && i+1 < height) { val += conv[2][2] * XImage[i+1][j+1][k]; valw += conv[2][2]; }       	sXImage[i][j][k] = val / valw;    } }  }   return( sXImage);   } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！[/quote] K是RGB三色通道。看你是对彩图还是灰度图操作。对灰度图操作，这个代码要改一下。[/quote] 我的是对灰度图像操作，是将K去掉就可以了吗？高斯滤波结束后，图像的像素有什么规律吗，我怎么判断我的结果是否正确？谢啦！嘿嘿[/quote]  怎么判断你的结果是不是正确的，这个真是个难题，只能用同样的算法在matlab上面跑一下两个结果是不是一致。 话说你对高斯滤波的意义和算法步骤理解透彻没有？你说的结果正确是什么概念？[/quote] 老师让我自己看，查高斯滤波的代码，我在网上查到的，高斯滤波就是用邻域内像素的加权平均值代替邻域中心的像素值，先要通过公式产生一个模板，然后用这个模板和图像矩阵做卷积运算。我理解的是把卷积运算后的结果赋值给原图像，然后原图像就改变了，是这样吗？我也是刚学，所以也不知道查的对不对。双边滤波是和高斯滤波的步骤差不多，只是产生模板的公式不一样吗？

user: user-1
content: 引用 6 楼 u013931282 的回复:[quote=引用 5 楼 lovesmiles 的回复:] [quote=引用 4 楼 u013931282 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 搜“VC6 高斯滤波 源代码” int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements}  double conv[3][3];  double hg = 0;       //Convolution kernel for(i=0; i<3;i++) { for(j=0;j<3;j++) { int u=i-1; //subtract from centre element index in 3*3 (1,1) int v=j-1; conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  hg += conv[i][j]; } } for(int i=0; i<3;i++) { for(int j=0;j<3;j++) {                 conv[i][j] = conv[i][j] / hg; } }      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights for(int i =0; i < height ; i++) { for(int j =0; j < width ; j++) { for(int k =0; k < 3 ; k++) { double val = 0; double valw =0; if(j-1 > 0  && i-1 > 0) { val += conv[0][0] * XImage[i-1][j-1][k]; valw += conv[0][0]; } if(i-1 > 0 ) { val += conv[0][1] * XImage[i-1][j][k]; valw += conv[0][1];                                                                  } if(i-1 > 0 && j+1 < width) { val += conv[0][2] * XImage[i-1][j+1][k]; valw += conv[0][2]; }  if(j-1 > 0 ) { val += conv[1][0] * XImage[i][j-1][k]; valw += conv[1][0]; }  val += conv[1][1] * XImage[i][j][k]; valw += conv[1][1];                                                                 if(j+1 < width) { val += conv[1][2] * XImage[i][j+1][k]; valw += conv[1][2]; }  if(j-1 > 0  && i+1 < height) { val += conv[2][0] * XImage[i+1][j-1][k]; valw += conv[2][0]; } if(i+1 < height) { val += conv[2][1] * XImage[i+1][j][k]; valw += conv[2][1]; } if(j+1 < width  && i+1 < height) { val += conv[2][2] * XImage[i+1][j+1][k]; valw += conv[2][2]; }       	sXImage[i][j][k] = val / valw;    } }  }   return( sXImage);   } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！[/quote] K是RGB三色通道。看你是对彩图还是灰度图操作。对灰度图操作，这个代码要改一下。[/quote] 我的是对灰度图像操作，是将K去掉就可以了吗？高斯滤波结束后，图像的像素有什么规律吗，我怎么判断我的结果是否正确？谢啦！嘿嘿[/quote]  怎么判断你的结果是不是正确的，这个真是个难题，只能用同样的算法在matlab上面跑一下两个结果是不是一致。 话说你对高斯滤波的意义和算法步骤理解透彻没有？你说的结果正确是什么概念？

user: user-0
content: 引用 5 楼 lovesmiles 的回复:[quote=引用 4 楼 u013931282 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] 搜“VC6 高斯滤波 源代码” int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements}  double conv[3][3];  double hg = 0;       //Convolution kernel for(i=0; i<3;i++) { for(j=0;j<3;j++) { int u=i-1; //subtract from centre element index in 3*3 (1,1) int v=j-1; conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  hg += conv[i][j]; } } for(int i=0; i<3;i++) { for(int j=0;j<3;j++) {                 conv[i][j] = conv[i][j] / hg; } }      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights for(int i =0; i < height ; i++) { for(int j =0; j < width ; j++) { for(int k =0; k < 3 ; k++) { double val = 0; double valw =0; if(j-1 > 0  && i-1 > 0) { val += conv[0][0] * XImage[i-1][j-1][k]; valw += conv[0][0]; } if(i-1 > 0 ) { val += conv[0][1] * XImage[i-1][j][k]; valw += conv[0][1];                                                                  } if(i-1 > 0 && j+1 < width) { val += conv[0][2] * XImage[i-1][j+1][k]; valw += conv[0][2]; }  if(j-1 > 0 ) { val += conv[1][0] * XImage[i][j-1][k]; valw += conv[1][0]; }  val += conv[1][1] * XImage[i][j][k]; valw += conv[1][1];                                                                 if(j+1 < width) { val += conv[1][2] * XImage[i][j+1][k]; valw += conv[1][2]; }  if(j-1 > 0  && i+1 < height) { val += conv[2][0] * XImage[i+1][j-1][k]; valw += conv[2][0]; } if(i+1 < height) { val += conv[2][1] * XImage[i+1][j][k]; valw += conv[2][1]; } if(j+1 < width  && i+1 < height) { val += conv[2][2] * XImage[i+1][j+1][k]; valw += conv[2][2]; }       	sXImage[i][j][k] = val / valw;    } }  }   return( sXImage);   } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！[/quote] K是RGB三色通道。看你是对彩图还是灰度图操作。对灰度图操作，这个代码要改一下。[/quote] 我的是对灰度图像操作，是将K去掉就可以了吗？高斯滤波结束后，图像的像素有什么规律吗，我怎么判断我的结果是否正确？谢啦！嘿嘿

user: user-1
content: 引用 4 楼 u013931282 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 搜“VC6 高斯滤波 源代码” int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements}  double conv[3][3];  double hg = 0;       //Convolution kernel for(i=0; i<3;i++) { for(j=0;j<3;j++) { int u=i-1; //subtract from centre element index in 3*3 (1,1) int v=j-1; conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  hg += conv[i][j]; } } for(int i=0; i<3;i++) { for(int j=0;j<3;j++) {                 conv[i][j] = conv[i][j] / hg; } }      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights for(int i =0; i < height ; i++) { for(int j =0; j < width ; j++) { for(int k =0; k < 3 ; k++) { double val = 0; double valw =0; if(j-1 > 0  && i-1 > 0) { val += conv[0][0] * XImage[i-1][j-1][k]; valw += conv[0][0]; } if(i-1 > 0 ) { val += conv[0][1] * XImage[i-1][j][k]; valw += conv[0][1];                                                                  } if(i-1 > 0 && j+1 < width) { val += conv[0][2] * XImage[i-1][j+1][k]; valw += conv[0][2]; }  if(j-1 > 0 ) { val += conv[1][0] * XImage[i][j-1][k]; valw += conv[1][0]; }  val += conv[1][1] * XImage[i][j][k]; valw += conv[1][1];                                                                 if(j+1 < width) { val += conv[1][2] * XImage[i][j+1][k]; valw += conv[1][2]; }  if(j-1 > 0  && i+1 < height) { val += conv[2][0] * XImage[i+1][j-1][k]; valw += conv[2][0]; } if(i+1 < height) { val += conv[2][1] * XImage[i+1][j][k]; valw += conv[2][1]; } if(j+1 < width  && i+1 < height) { val += conv[2][2] * XImage[i+1][j+1][k]; valw += conv[2][2]; }       	sXImage[i][j][k] = val / valw;    } }  }   return( sXImage);   } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！[/quote] K是RGB三色通道。看你是对彩图还是灰度图操作。对灰度图操作，这个代码要改一下。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:搜“VC6 高斯滤波 源代码” int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements}  double conv[3][3];  double hg = 0;       //Convolution kernel for(i=0; i<3;i++) { for(j=0;j<3;j++) { int u=i-1; //subtract from centre element index in 3*3 (1,1) int v=j-1; conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  hg += conv[i][j]; } } for(int i=0; i<3;i++) { for(int j=0;j<3;j++) {                 conv[i][j] = conv[i][j] / hg; } }      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights for(int i =0; i < height ; i++) { for(int j =0; j < width ; j++) { for(int k =0; k < 3 ; k++) { double val = 0; double valw =0; if(j-1 > 0  && i-1 > 0) { val += conv[0][0] * XImage[i-1][j-1][k]; valw += conv[0][0]; } if(i-1 > 0 ) { val += conv[0][1] * XImage[i-1][j][k]; valw += conv[0][1];                                                                  } if(i-1 > 0 && j+1 < width) { val += conv[0][2] * XImage[i-1][j+1][k]; valw += conv[0][2]; }  if(j-1 > 0 ) { val += conv[1][0] * XImage[i][j-1][k]; valw += conv[1][0]; }  val += conv[1][1] * XImage[i][j][k]; valw += conv[1][1];                                                                 if(j+1 < width) { val += conv[1][2] * XImage[i][j+1][k]; valw += conv[1][2]; }  if(j-1 > 0  && i+1 < height) { val += conv[2][0] * XImage[i+1][j-1][k]; valw += conv[2][0]; } if(i+1 < height) { val += conv[2][1] * XImage[i+1][j][k]; valw += conv[2][1]; } if(j+1 < width  && i+1 < height) { val += conv[2][2] * XImage[i+1][j+1][k]; valw += conv[2][2]; }       	sXImage[i][j][k] = val / valw;    } }  }   return( sXImage);   } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！

user: user-0
content: 引用 楼主 u013931282 的回复:如题，初学者，都还不懂，求知道的朋友指导一下！ 用visual c++ 6.0，C语言实现 怎么看高斯滤波产生的结果对不对呢

user: user-0
content: 引用 楼主 u013931282 的回复:如题，初学者，都还不懂，求知道的朋友指导一下！ 用visual c++ 6.0，C语言实现 int*** SmoothImage(int ***XImage ,int width, int height, int channel) {         double sigma =  1.85; //(n/2 -1)*0.3 +0.8  { n = 9 ,no. of elements} 	 double conv[3][3]; 	 double hg = 0;       //Convolution kernel 	for(i=0; i<3;i++) 	{ 		for(j=0;j<3;j++) 		{ 			int u=i-1; //subtract from centre element index in 3*3 (1,1) 			int v=j-1; 			conv[i][j] =exp ( - ((u*u) + (v*v)) / (2*sigma*sigma) );  			hg += conv[i][j]; 		} 	} 	for(int i=0; i<3;i++) 	{ 		for(int j=0;j<3;j++) 		{                 conv[i][j] = conv[i][j] / hg; 		} 	}      int*** sXImage = 0;      sXImage =  CreateImageMatrix( sXImage , width , height , channel );// allocating a 3d array       //Assigning weights 	for(int i =0; i < height ; i++) 		{ 			for(int j =0; j < width ; j++) 			{ 			for(int k =0; k < 3 ; k++) 				{ 					double val = 0; 					double valw =0; 					if(j-1 > 0  && i-1 > 0) 								{ 									val += conv[0][0] * XImage[i-1][j-1][k]; 									valw += conv[0][0]; 								} 								if(i-1 > 0 ) 								{ 									val += conv[0][1] * XImage[i-1][j][k]; 									valw += conv[0][1];                                                                  } 								if(i-1 > 0 && j+1 < width) 								{ 									val += conv[0][2] * XImage[i-1][j+1][k]; 									valw += conv[0][2]; 								}  								if(j-1 > 0 ) 								{ 									val += conv[1][0] * XImage[i][j-1][k]; 									valw += conv[1][0]; 								}  								val += conv[1][1] * XImage[i][j][k]; 								valw += conv[1][1];                                                                 if(j+1 < width) 								{ 									val += conv[1][2] * XImage[i][j+1][k]; 									valw += conv[1][2]; 								}  								if(j-1 > 0  && i+1 < height) 								{ 									val += conv[2][0] * XImage[i+1][j-1][k]; 									valw += conv[2][0]; 								} 								if(i+1 < height) 								{ 									val += conv[2][1] * XImage[i+1][j][k]; 									valw += conv[2][1]; 								} 								if(j+1 < width  && i+1 < height) 								{ 									val += conv[2][2] * XImage[i+1][j+1][k]; 									valw += conv[2][2]; 								} 								 						 							 					   	sXImage[i][j][k] = val / valw;  					 						 				} 			} 	 }   			return( sXImage); 		 		 } 我还想问一下，嘿嘿！这个是我在网上找到的，前半部分差不多懂了，是生成滤波模板，后面红色的部分，k是做什么的呢？拜托了，看不太懂！

user: user-2
content: 搜“VC6 高斯滤波 源代码”