高斯滤波 openCV实现

高斯滤波:

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行 加权平均的过程,每一个 像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
3*3模板 5*5模板
 

g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16;
其中,f(x,y)为图像中(x,y)点的灰度值,g(x,y)为该点经过高斯滤波后的值。

opencv实现:

  1. #include "stdafx.h"  
  2. #include "highgui.h"  
  3. #include "cv.h"   
  4. //高斯滤波函数,在opencv里可以使用cvSmooth    
  5. void gaussianFilter(uchar* data, int width, int height)   
  6.  {      int i, j, index, sum;   
  7.      int templates[9] = { 1, 2, 1,   
  8.                          2, 4, 2,   
  9.                           1, 2, 1 };//模板的值   
  10.      sum = height * width * sizeof(uchar);//图像所占内存的大小   
  11.      uchar *tmpdata = (uchar*)malloc(sum);   
  12.      memcpy((char*)tmpdata,(char*)data, sum);   
  13.     for(i = 1;i < height - 1;i++)   
  14.      {   
  15.          for(j = 1;j < width - 1;j++)   
  16.         {             
  17.              index = sum = 0;   
  18.              for(int m = i - 1;m < i + 2;m++)   
  19.              {   
  20.                 for(int n = j - 1; n < j + 2;n++)   
  21.                  {   
  22.                     sum +=   
  23.                         tmpdata[m * width + n] *   
  24.                          templates[index++];  //处理   
  25.                 }   
  26.              }   
  27.             data[i * width + j] = sum / 16;   
  28.           
  29.         }   
  30.      }   
  31.     free(tmpdata);   
  32.  }   
  33.   
  34.   
  35.   
  36. void imgOperate( IplImage* image )  
  37. {  
  38.     cvNamedWindow( "image-in", CV_WINDOW_AUTOSIZE );  
  39.     cvNamedWindow( "image-out", CV_WINDOW_AUTOSIZE);  
  40.     cvShowImage( "image-in", image );  
  41.     /* 
  42.     IplImage* out = cvCreateImage( 
  43.         cvGetSize(image), 
  44.         IPL_DEPTH_8U, 
  45.         3 
  46.     ); 
  47.     */  
  48.       
  49.     //将色彩图像强制转化为灰度图像  
  50.     IplImage* pGrayImg=NULL;   
  51.   
  52.     pGrayImg=cvCreateImage(cvGetSize(image),8,1);     
  53.     cvCvtColor(image,pGrayImg,CV_RGB2GRAY);  
  54.   //  cvSmooth( image, out, CV_GAUSSIAN, 5,5 );  
  55.   
  56.   
  57.    gaussianFilter((unsigned char*)pGrayImg->imageData,pGrayImg->width,pGrayImg->height);  
  58.     cvShowImage( "image-out", pGrayImg );  
  59.   
  60.     cvReleaseImage( &pGrayImg );  
  61.     cvWaitKey( 0 );   
  62.     cvDestroyWindow("image-in" );  
  63.     cvDestroyWindow("image-out" );      
  64. }  
  65. int main( int argc, char** argv )  
  66. {  
  67.   IplImage* img = cvLoadImage("d:\\1.jpg");  
  68.   imgOperate( img );  
  69.   cvReleaseImage( &img );  
  70.   return 0;  
  71. }  


 

效果比较:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值