⾼斯函数(Gaussianfunction)的详细分析
摘要
论⽂中遇到很重要的⼀个元素就是⾼斯核函数,但是必须要分析出⾼斯函数的各种潜在属性,本⽂⾸先参考相关材料给出⾼斯核函数的基础,然后使⽤matlab⾃动保存不同参数下的⾼斯核函数的变化gif动图,同时分享出源代码,这样也便于后续的论⽂写作。
⾼斯函数的基础
2.1 ⼀维⾼斯函数
⾼斯函数,Gaussian Function, 也简称为Gaussian,⼀维形式如下:
对于任意的实数a,b,c,是以著名数学家Carl Friedrich Gauss的名字命名的。⾼斯的⼀维图是特征对称“bell curve”形状,a是曲线尖峰的⾼度,b是尖峰中⼼的坐标,c称为标准⽅差,表征的是bell钟状的宽度。
⾼斯函数⼴泛应⽤于统计学领域,⽤于表述正态分布,在信号处理领域,⽤于定义⾼斯滤波器,在图像处理领域,⼆维⾼斯核函数常⽤于⾼斯模糊Gaussian Blur,在数学领域,主要是⽤于解决热⼒⽅程和扩散⽅程,以及定义Weiertrass Transform。
从上图可以看出,⾼斯函数是⼀个指数函数,其log函数是对数凹⼆次函数 whose logarithm a concave quadratic function。
⾼斯函数的积分是误差函数error function,尽管如此,其在整个实线上的反常积分能够被精确的计算出来,使⽤如下的⾼斯积分
同理可得
当且仅当
上式积分为1,在这种情况下,⾼斯是正态分布随机变量的概率密度函数,期望值μ=b,⽅差delta^2 = c^2,即
2.2 ⼆维⾼斯函数
⼆维⾼斯函数,形如
round函数有几个参数
A是幅值,x。y。是中⼼点坐标,σx σy是⽅差,图⽰如下,A = 1, xo = 0, yo = 0, σx = σy = 1
2.3 ⾼斯函数分析
这⼀节使⽤matlab直观的查看⾼斯函数,在实际编程应⽤中,⾼斯函数中的参数有
ksize ⾼斯函数的⼤⼩
sigma ⾼斯函数的⽅差
center ⾼斯函数尖峰中⼼点坐标
bias ⾼斯函数尖峰中⼼点的偏移量,⽤于控制截断⾼斯函数
为了⽅便直观的观察⾼斯函数参数改变⽽结果也不⼀样,下⾯的代码实现了参数的⾃动递增,并且将所有的结果图保存为gif图像,⾸先贴出完整代码:
function mainfunc()
% 测试⾼斯函数,递增的⽅法实现⾼斯函数参数的改变对整个⾼斯函数的影响,
% 并⾃动保存为gif格式输出。
% created by zhao.buaa 2016.09.28
%% 保存gif动画
item = 10;      % 迭代次数
dt = 1;            % 步长⼤⼩
ksize =20;      % ⾼斯⼤⼩
sigma = 2;      % ⽅差⼤⼩
% filename = ['ksize-' num2str(ksize) '--' num2str(ksize+dt*item) '-sigma-' num2str(sigma) '.gif']; %必须预先建⽴gif⽂件filename = ['ksize-' num2str(ksize)  '-sigma-' num2str(sigma) '--' num2str(sigma+dt*item) '.gif']; %必须预先建⽴gif⽂件
% main loop
for i = 1:item
center  = round(ksize/2);          % 中⼼点
bias      = ksize*10/10;              % 偏移中⼼点量
ksigma = ksigma(ksize, sigma, center, bias);    % 构建核函数
tname  = ['ksize-' num2str(ksize) '-sigma-' num2str(sigma) '-center-' num2str(center)];
figure(i), mesh(ksigma), title(tname);
%设置固定的x-y-z坐标范围,便于观察,axis([xmin xmax ymin ymax zmin zmax])
axis([0 ksize 0 ksize 0 0.008]);  view([0, 90]);% 改变可视⾓度
% ksize 递增
%    ksize = ksize + 10;
% sigma 递增
sigma = sigma + dt;
% ⾃动保存为gif图像
frame = getframe(i);
im = frame2im(frame);
[I,map] = rgb2ind(im,256);
if i==1
imwrite(I,map,filename,'gif','Loopcount',inf, 'DelayTime',0.4);
else
imwrite(I,map,filename,'gif','WriteMode','append','DelayTime',0.4);
end
end;
close all;
%% 截断⾼斯核函数,截断的程度取决于参数bias
function ksigma = ksigma(ksize, sigma, center,bias)
%ksize = 80;    sigma = 15;
ksigma=fspecial('gaussian',ksize, sigma);  % 构建⾼斯函数
[m, n] =size(ksigma);
for i = 1:m
for j = 1:n
if(  (i<center-bias)||(i>center+bias)||(j<center-bias)||(j>center+bias)  )
ksigma(i,j) = 0;
end;
end;
end;
结果图:
固定ksize为20,sigma从1-9,固定center在⾼斯中间,并且bias偏移量为整个半径,即原始⾼斯函数。
随着sigma的增⼤,整个⾼斯函数的尖峰逐渐减⼩,整体也变的更加平缓,则对图像的平滑效果越来越明显。
保持参数不变,对上述⾼斯函数进⾏截断,即truncated gaussian function,bias的⼤⼩为ksize*3/10,则结果如下图:
truncated gaussian function的作⽤主要是对超过⼀定区域的原始图像信息不再考虑,这就保证在更加合理的利⽤靠近⾼斯函数中⼼点的周围像素,同时还可以改变⾼斯函数的中⼼坐标,如下图:
为了便于观察截断的效果,改变了可视⾓度。
⾼斯核函数卷积
论⽂中使⽤gaussian与feature map做卷积,⽬前的结果来看,要做到随着到边界的距离改变⾼斯函数的截断参数,因为图像的边缘如果使⽤原始⾼斯函数,就会在边界地⽅出现特别低的⼀圈,原因也很简单,⾼斯函数在与原始图像进⾏⾼斯卷积的时候,图像边缘外为0计算的,那么如何解决边缘问题呢?
先看⼀段代码:
[plain]
1. % 截断⾼斯核函数
2. ksize = 40; ksigma=fspecial('gaussian',  ksize, 6);
3. [m, n] =size(ksigma);
4. for i = 1:m
5.    for j = 1:n
6.        if( i<25 )
7.            ksigma(i,j) = 0;
8.        end;
9.    end;
10. end;
11. figure, mesh(ksigma);
在i,即row上对⾼斯核函数进⾏截断,bias为半径⼤⼩,则如图6

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。