matlab中fspecial中生成高斯模板的解释以及c语言实现
来源:互联网 发布:德军总部新巨人 知乎 编辑:程序博客网 时间:2024/05/16 10:48
下面这个函数是模拟fspecial中的生成高斯模板的函数。
运行结果:
- function h=makefilter(size,sigma)
- %size为模板大小
- %sigma为标准差
- %下面的代码其实是从fspecial中摘录出来的,我做了一些更改放到自己写的函数里面便于解释
- %计算高斯模板的中心位置
- siz = ([size size]-1)/2;
- sig = sigma;
- %用meshgrid是为了加速,不用for循环
- [x y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
- %计算exp(-(x^2+y^2)/(2*sig^2))
- %我想你肯定有一个疑问,那就是为什么不除以2*pi*sig^2
- %因为不除也没有关系,因为最后归一化之后会约掉
- arg = -(x.*x+y.*y)./(2*sig*sig);
- h = exp(arg);
- %不知道它为什么要这样,忘懂得人解释一下
- h(h<eps*max(h(:))) = 0;
- %求和,用来归一化
- sumh = sum(h(:));
- %防止求和之后出现为0的情况,然后再归一化一下使高斯,模板为小数
- if sumh ~=0
- h=h/sumh;
- end
- end
运行结果:
- >> makefilter(3,0.5)
- ans =
- 0.0113 0.0838 0.0113
- 0.0838 0.6193 0.0838
- 0.0113 0.0838 0.0113
下面给出C的代码
- #include <conio.h>
- #include <stdio.h>
- #include <math.h>
- double** makeGaussianFilter(int iSize, double sigma);
- double** malloc2DArray(int iRow, int iCol);
- void free2DArray(double** p,int iRow);
- int _tmain(int argc, _TCHAR* argv[])
- {
- double** filter = makeGaussianFilter(3,0.5);
- for (int i=0; i<3; i++)
- {
- for (int j=0; j<3; j++)
- {
- printf("%lf\t",filter[i][j]);
- }
- printf("\n");
- }
- _getch();
- free2DArray(filter,3);
- return 0;
- }
- double** makeGaussianFilter(int iSize, double sigma)
- {
- double** filter = malloc2DArray(iSize,iSize);
- int center = (iSize-1)/2;
- double sum = 0;
- double x2 = 0;
- double y2 = 0;
- for (int i=0; i<iSize; i++)
- {
- x2 = pow(double(i-center),2);
- for (int j=0; j<iSize; j++)
- {
- y2 = pow(double(j-center),2);
- sum += filter[i][j] = exp(-(x2+y2)/(2*sigma*sigma));
- }
- }
- if (sum!=0)
- {
- //归一化
- for (int i=0; i<iSize; i++)
- {
- for (int j=0; j<iSize; j++)
- {
- filter[i][j] /= sum;
- }
- }
- }
- return filter;
- }
- double** malloc2DArray(int iRow, int iCol)
- {
- double **filter = new double*[iRow];
- for (int i=0; i<iRow; i++)
- {
- filter[i] = new double[iCol];
- }
- return filter;
- }
- void free2DArray(double** p,int iRow)
- {
- for (int i=0; i<iRow; i++)
- {
- delete []p[i];
- }
- delete []p;
- }
结果:
0 0
- matlab中fspecial中生成高斯模板的解释以及c语言实现
- matlab中fspecial中生成高斯模板的解释以及c语言实现
- matlab中fspecial中生成高斯模板的解释以及c语言实现
- matlab中fspecial中生成高斯模板的解释以及c语言实现
- Matlab中fspecial的用法
- Matlab中fspecial的用法
- Matlab中fspecial的使用
- OPENCV2学习(1)_生成运动模糊核(OPENCV2 实现Matlab中fspecial的motion功能)
- Matlab中fspecial函数的用法
- matlab fspecial 与 高斯模板系数分析
- OpenCV实现Matlab的fspecial('gaussian',m,sigma) 生成高斯核
- matlab fspecial 用法解释
- matlab fspecial 用法解释
- matlab fspecial 用法解释
- Matlab中调用C语言生成Mex文件的方法
- matlab中二维高斯模板的计算
- C语言中随机数的生成,以及简单猜数游戏的实现。
- C语言实现MATLAB 6.5中M文件的方法
- Android -- 开源项目 SlidingMenu 的导入
- java 文件操作
- NavBarControl 左侧菜单
- auto_ptr的实现与剖析
- 一个比较复杂的多次拆分字符串的存储过程
- matlab中fspecial中生成高斯模板的解释以及c语言实现
- LUA constant
- 查看 并发请求数及其TCP连接状态
- 用C#实现网络爬虫(一)
- AspectJ AOP 简单示例2
- 【ViewPager的学习】一、简单使用
- 网络编程
- 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
- 自定义ViewGroup