高斯滤波核计算 C版
2015-08-14 10:18
337 查看
#include <stdio.h> #include <memory.h> #include <stdlib.h> #include <math.h> const double eps=1e-6; // 高斯函数 double guassian(double x,double sigma) { return exp(-(x*x)/(2*sigma*sigma+eps)); } // 计算高斯核 void guassiankernel(double* kernel,int size, double sigma) { double sum=0; double* data=kernel; int i; for(i=0;i<size;++i) { double index=(size>>1)-i; if(size&1) // size为奇数 { *(data+i)=guassian(index,sigma); } else // size为偶数 { index-=0.5; *(data+i)=guassian(index,sigma); } sum+=*(data+i); } // 归一化 for(i=0;i<size;++i) { *(data+i)/=sum; } } void matproduct(double a[],double b[],double c[],int m,int n,int p) { int i,j,k; for(i=0;i<m;++i) { for(j=0;j<p;++j) { double sum=0; for(k=0;k<n;++k) { sum+=a[i*n+k]*b[k*p+j]; } c[i*p+j]=sum; } } } void matshow(double a[],int m,int n) { int i,j; for(i=0;i<m;++i) { for(j=0;j<n;++j) { printf("%lf\t",a[i*n+j]); } printf("\n");; } } // 计算二维高斯核 void guassiankernel2d(double* kernel,int sizeX,int sizeY,double sigmaX,double sigmaY) { double *matX=(double *)malloc(sizeX*sizeof(double)); double *matY=(double *)malloc(sizeY*sizeof(double)); guassiankernel(matX,sizeX,sigmaX); guassiankernel(matY,sizeY,sigmaY); matproduct(matX,matY,kernel,sizeX,1,sizeY); free(matX); free(matY); } int main() { int sizeX=3; int sizeY=3; double *kernel=(double *)malloc(sizeX*sizeY*sizeof(double)); guassiankernel2d(kernel,sizeX,sizeY,1,1); matshow(kernel,sizeX,sizeY); free(kernel); return 0; }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 【转】c语言位域操作—_结构体内冒号:的使用
- 海水淡化膜:反渗透预处理对于海水淡化技术必要性
- Safari实用技巧-保存主页为PDF文件
- Android性能优化典范 - 第3季
- HDU 1247 Hat’s Words(字典树简单应用)
- JToggleButton的重构状态以及ButtonGroup的使用
- Linux环境Nginx安装多版本PHP
- hive 安装配置
- Android开发大全
- excel表格vlookup函数
- leetcode 135 —— Candy
- M
- 利用frame进行页面跳转
- abstract class和interface的区别 及模板方法设计模式
- c/c++ 模拟http 协议,GET/POST 数据方法
- javascript之DOM操作
- jQuery 的基本过滤选择器
- 黑客成长之路---------(第7天)
- 95后基本不用微信!PM你了解你的用户么丨90后研究报告