ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

高斯函数生成高斯模板(含Python代码实现)

2022-03-06 11:17:43  阅读:228  来源: 互联网

标签:arr 高斯 Python 归一化 np 模板 函数


高斯函数


引言

2022年03月06日10:51:08
昨天,在组会上师弟提到了高斯模板,自己被导师抽查提问解释如何生成模板的。故,回忆一下过去的知识,并进行总结。学习如何通过高斯函数生成高斯模板,并用python代码实现生成高斯模板的过程。


参考文献


一维高斯函数

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π ​1​exp(−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πσ21​exp−((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)
    

输出

在这里插入图片描述


总结

  1. 使用均值为0的二维高斯函数,生成的模板是以中心原点(0, 0)左右对称的
  2. 将坐标代入高斯函数,通过公式计算得到高斯模板(此时为小数模板
  3. 需要归一化,让高斯模板的权重和为1(高斯函数的特性,积分为1),这样就同高斯函数保存一致,以中心点为中心,往四周衰减,且权重能与高斯函数变换形式保持一致
  4. 将高斯模板转换为(整数模板),将左上角第一个值a变为1(除以本身),其它值均除a得到结果(并向下取整)
  5. 模板的使用同卷积,当为小数模板时直接点乘得到结果向下取整;当为整数模板时直接点乘并除以全部系数的和(归一化权重为1)向下取整得到结果

标签:arr,高斯,Python,归一化,np,模板,函数
来源: https://blog.csdn.net/weixin_43312117/article/details/123306688

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有