我们知道在实现高斯滤波的时候,需要用到高斯模板,高斯模板也就是个点的值服从高斯分布。
这里主要参考这篇博客:点击打开链接
代码如下:
<span style="font-size:18px;">% 本程序目的在生成自己的高斯模板
% 公式: p(z) = exp(-(z-u)^2/(2*d^2) / (sqrt(2*pi)*d)
clear all;close all;clc;
size = 3;
sigma = 0.5;
% size为模板大小
% sigma为标准差
%下面的代码其实是从fspecial中摘录出来的,我做了一些更改放到自己写的函数里面便于解释
%计算高斯模板的中心位置
siz = ( [size size] - 1 ) / 2;
sig = sigma;
%用meshgrid是为了加速,不用for循环
[x y] = meshgrid(-siz(): siz(1),-siz(2): siz(2)); % 相当于围绕中心点(0,0)产生各个点的坐标,之后再根据坐标代公式得到各个点具体值
% 计算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
h</span>
运行结果:
<span style="font-size:18px;">h =
149/13135 431/5142 149/13135
431/5142 493/796 431/5142
149/13135 431/5142 149/13135 </span>