高斯函数
引言
2022年03月06日10:51:08
昨天,在组会上师弟提到了高斯模板,自己被导师抽查提问解释如何生成模板的。故,回忆一下过去的知识,并进行总结。学习如何通过高斯函数生成高斯模板,并用python代码实现生成高斯模板的过程。
参考文献
- 图像处理基础(4):高斯滤波器详解
- 高斯函数-keep going!-博客园
- 高斯滤波计算过程
一维高斯函数
f
(
x
)
=
1
σ
2
π
exp
(
−
(
x
−
μ
)
2
2
σ
2
)
f(x)=\\frac{1}{\\sigma \\sqrt{2 \\pi}} \\exp \\left(-\\frac{(x-\\mu)^{2}}{2 \\sigma^{2}}\\right)
f(x)=σ2π
1exp(−2σ2(x−μ)2)
二维高斯函数
G
(
x
,
y
)
=
1
2
π
σ
2
exp
−
(
(
x
−
u
)
2
+
(
y
−
u
)
2
)
/
2
σ
2
G(x, y)=\\frac{1}{2 \\pi \\sigma^2} \\exp^{-((x-u)^2+(y-u)^2) / 2 \\sigma^2}
G(x,y)=2πσ21exp−((x−u)2+(y−u)2)/2σ2
Word is Cheap Show you the Code
\"\"\"
Author: yida
Time is: 2022/3/5 20:42
this Code: 使用高斯函数生成高斯模板
\"\"\"
import numpy as np
def gauss(x, y, u=0, s=0.8):
\"\"\"
输入x, y,均值及标准差生成高斯函数对应的值
:param x:x坐标
:param y:y坐标
:param u:均值
:param s:sigma标准差
:return:结果
\"\"\"
g = (1 / (2 * np.pi * s ** 2)) * np.exp(-(((x - u) ** 2 + (y - u) ** 2) / (2 * s ** 2)))
return g
def make_template(k=3):
\"\"\"
输入模板要求为奇数, 生成对应的x, y坐标,
然后将x, y坐标拿进去生成高斯模板,
最后reshape
:param k:模板的大小
:return:
\"\"\"
print(\"初始化高斯模板坐标...大小为{}×{}...\".format(k, k))
# 找到行与列的关系 用于生成横纵坐标
if k % 2 == 1:
t = (k - 1) // 2
# 坐标的范围
m = np.arange(-t, t + 1)
# 重复得到x坐标
# x = np.array([k * [i] for i in range(-t, t + 1)]).flatten()
x = np.repeat(m, k)
# 重复得到y坐标
# y = np.array(k * [i for i in range(-t, t + 1)])
y = np.repeat(m.reshape(1, -1), k, axis=0).flatten()
# 利用zip得到坐标数组
point = list(zip(x, y))
# 循环输出坐标, 调整成行和列的形式
for i in range(k):
print(point[i * k:i * k + k])
return x, y
else:
print(\"请正确输入模板大小...\")
def normalization(arr):
\"\"\"
输入arr, 归一化权重和为1
:param arr:待归一化矩阵
:return:
\"\"\"
print(\"\\n正在进行归一化...权重和为1...\")
arr = arr / np.sum(arr)
print(arr)
return arr
def integer(arr):
\"\"\"
输入arr, 将其转换成整数高斯模板
:param arr:归一化后的高斯模板
:return:
\"\"\"
print(\"\\n整形化高斯模板...\")
# 取第一个值 然后将左上角第一个值变成1 其它的值对应改变 并转换成整形
v = arr[0][0]
arr = np.int32(arr / v)
s = np.sum(arr)
print(arr, \' 1/\' + str(np.sum(arr)))
return arr
if __name__ == \'__main__\':
# 设置高斯模板大小, 模板请输入奇数
kernel = 3
# 初始化高斯模板
x, y = make_template(k=kernel)
# 设置高斯函数的均值和标准差
mean = 0
sigma = 0.8
# 得到结果
result = gauss(x, y, u=mean, s=sigma)
# reshape
gauss_template = np.reshape(result, (kernel, kernel))
print(\"\\n高斯模板如下:\\n\", gauss_template)
# 归一化
arr_nor = normalization(gauss_template)
# 整数化
arr_int = integer(arr_nor)
输出
总结
- 使用均值为0的二维高斯函数,生成的模板是以中心原点
(0, 0)
左右对称的 - 将坐标代入高斯函数,通过公式计算得到高斯模板(此时为
小数模板
) - 需要
归一化
,让高斯模板的权重和为1(高斯函数的特性,积分为1),这样就同高斯函数保存一致,以中心点为中心,往四周衰减,且权重能与高斯函数变换形式保持一致 - 将高斯模板转换为(
整数模板
),将左上角第一个值a变为1(除以本身),其它值均除a得到结果(并向下取整) - 模板的使用
同卷积
,当为小数模板时直接点乘得到结果向下取整
;当为整数模板时直接点乘并除以全部系数的和(归一化权重为1)向下取整得到结果
来源:https://blog.csdn.net/weixin_43312117/article/details/123306688
本站部分图文来源于网络,如有侵权请联系删除。