图像滤波之二维高斯核

转载自http://blog.csdn.net/quarryman/article/details/17475817,两个1维核生成一个二维核。

下面的代码是计算二维高斯核,代码是用纯C写的,可移植性应该不错。计算得到的二维高斯核可以用来对图像进行高斯滤波。由于高斯滤波器是可分的,所以可以用一维高斯核得到二维高斯核(其实中间涉及到一些证明,这里直接借用结论),如代码所示。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //====================================================================        
  2. // 作者   : quarryman        
  3. // 邮箱   : quarrying{at}qq.com        
  4. // 主页   : http://blog.csdn.net/quarryman        
  5. // 日期   : 2013年12月22日        
  6. // 描述   : 计算二维高斯核      
  7. //====================================================================     
  8. #include <stdio.h>  
  9. #include <memory.h>  
  10. #include <stdlib.h>  
  11. #include <math.h>  
  12. const double eps=1e-6;;  
  13.   
  14. // 高斯函数  
  15. double guassian(double x,double sigma)  
  16. {  
  17.     return exp(-(x*x)/(2*sigma*sigma+eps));  
  18. }  
  19.   
  20. // 计算高斯核  
  21. void guassiankernel(double* kernel,int size, double sigma)  
  22. {  
  23.     double sum=0;  
  24.     double* data=kernel;  
  25.     int i;  
  26.     for(i=0;i<size;++i)  
  27.     {  
  28.         double index=(size>>1)-i;  
  29.         if(size&1) // size为奇数  
  30.         {  
  31.             *(data+i)=guassian(index,sigma);  
  32.         }  
  33.         else // size为偶数  
  34.         {  
  35.             index-=0.5;  
  36.             *(data+i)=guassian(index,sigma);  
  37.         }  
  38.         sum+=*(data+i);  
  39.     }  
  40.     // 归一化  
  41.     for(i=0;i<size;++i)  
  42.     {  
  43.             *(data+i)/=sum;  
  44.     }  
  45. }  
  46.   
  47. void matproduct(double a[],double b[],double c[],int m,int n,int p)  
  48. {  
  49.     int i,j,k;  
  50.     for(i=0;i<m;++i)  
  51.     {  
  52.         for(j=0;j<p;++j)  
  53.         {  
  54.             double sum=0;  
  55.             for(k=0;k<n;++k)  
  56.             {  
  57.                 sum+=a[i*n+k]*b[k*p+j];  
  58.             }  
  59.             c[i*p+j]=sum;  
  60.         }  
  61.     }  
  62. }  
  63.   
  64. void matshow(double a[],int m,int n)  
  65. {  
  66.     int i,j;  
  67.     for(i=0;i<m;++i)  
  68.     {  
  69.         for(j=0;j<n;++j)  
  70.         {  
  71.             printf("%lf\t",a[i*n+j]);  
  72.         }  
  73.         printf("\n");;  
  74.     }  
  75. }  
  76.   
  77. // 计算二维高斯核  
  78. void guassiankernel2d(double* kernel,int sizeX,int sizeY,double sigmaX,double sigmaY)  
  79. {  
  80.     double *matX=(double *)malloc(sizeX*sizeof(double));  
  81.     double *matY=(double *)malloc(sizeY*sizeof(double));  
  82.     guassiankernel(matX,sizeX,sigmaX);  
  83.     guassiankernel(matY,sizeY,sigmaY);  
  84.     matproduct(matX,matY,kernel,sizeX,1,sizeY);  
  85.     free(matX);  
  86.     free(matY);  
  87. }  
  88.   
  89. int main()  
  90. {  
  91.     int sizeX=4;  
  92.     int sizeY=3;  
  93.     double *kernel=(double *)malloc(sizeX*sizeY*sizeof(double));  
  94.     guassiankernel2d(kernel,sizeX,sizeY,1,1);  
  95.     matshow(kernel,sizeX,sizeY);  
  96.     free(kernel);  
  97.     return 0;  
  98. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值