yamaken1343’s blog

技術ブログもどき

pythonで二次元ガウス分布を得る

結論

インパルス画像にガウシアンフィルタを適用させることで得られる

まえがき

中央に重み付けして加算したい*1ことがあったので, 二次元ガウス分布が欲しかったのですが, ライブラリにはなさそうだし式から起こすのも面倒なのでいい方法を探しました.

そこで, 簡単に得る方法を見つけたのでまとめておきます.

コード

import scipy.ndimage.filters as fi
import numpy as np

def gkern(kernlen=21, nsig=3):
    # kernlen x kernlen のゼロ行列を作成
    inp = np.zeros((kernlen, kernlen))
    # 中央の要素を1にする
    inp[kernlen // 2, kernlen // 2] = 1
    # ガウシアンフィルタを適用し, 結果を返す
    return fi.gaussian_filter(inp, nsig)

解説

kernlenは得られるガウス分布のサイズ, nsigはガウス分布の広がりです. 大きい方がよりとんがってない分布になります. 1のときにいわゆる標準正規分布となります.

ためしてないですが, 中央の要素ではなく好きな場所を指定すればカーネルがずれてくれると思います

*1:普通にガウシアンフィルタを適用して総和を取れば良いことにあとから気づきました