高斯核函数(低通高斯滤波器核)
最近在看DIP(Digital Image Processing),虽然可以调用Opencv的函数,但还是被这高斯核函数所吸引,这可能也是高斯分态对我的吸引力。
高斯分布函数
G ( x ) = 1 2 π σ e − ( x − x 0 ) 2 2 σ 2 G(x) = \frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{(x-x_0)^2}{2\sigma^2}}G(x)=2πσ1e−2σ2(x−x0)2
这是我们常见的高斯分布概率密度函数(正态分布)
高斯核生成函数
DIP书上给出的高斯核函数
G ( s , t ) = K e − s 2 + t 2 2 σ 2 G(s, t) = K e^{-\frac{s^2 + t^2}{2\sigma^2}}G(s,t)=Ke−2σ2s2+t2
看起来跟高斯分布是不是有点相似,但却有点不同,其实没有关系的。这里的K可以看成是归一化因子,而重要是的e − s 2 + t 2 2 σ 2 e^{-\frac{s^2 + t^2}{2\sigma^2}}e−2σ2s2+t2这部分。
好了,有了函数,我们就可以写代码了。
代码
下面公式是我生成高期核的用到的公式:
G ( x , y ) = 1 2 π σ 2 e − ( x − x 0 ) 2 + ( y − y 0 ) 2 2 σ 2 G(x, y) = \frac {1} {2\pi\sigma ^2}e^{-\frac{(x-x_0)^2+(y-y_0)^2}{2\sigma^2}}G(x,y)=2πσ21e−2σ2(x−x0)2+(y−y0)2
# 高斯核生成函数
def creat_gauss_kernel(kernel_size=3, sigma=1, k=1):
if sigma == 0:
sigma = ((kernel_size - 1) * 0.5 - 1) * 0.3 + 0.8
X = np.linspace(-k, k, kernel_size)
Y = np.linspace(-k, k, kernel_size)
x, y = np.meshgrid(X, Y)
x0 = 0
y0 = 0
gauss = 1/(2*np.pi*sigma**2) * np.exp(- ((x -x0)**2 + (y - y0)**2)/ (2 * sigma**2))
return gauss
默认参数生成的高斯核:
[0.05854983, 0.09653235, 0.05854983],
[0.09653235, 0.15915494, 0.09653235],
[0.05854983, 0.09653235, 0.05854983]
- 为什么要判断sigma是否为0?
- k是什么,对核函数有何影响,对最终的图像有何影响?
- 代码有核的大小
- 代码有可定义的σ \sigmaσ
效果
左边是默认的3X3 高斯核,右边是自己生成的3X3的高斯核,从效果来看,没有什么差别,这也说明生成的高斯核可用。
高斯核函数的图像
