を使用numpy.lib.stride_tricks.as_strided
して、画像のウィンドウ表示を取得できます。
import numpy as np
from numpy.lib.stride_tricks import as_strided
rows, cols = 500, 500
win_rows, win_cols = 5, 5
img = np.random.rand(rows, cols)
win_img = as_strided(img, shape=(rows-win_rows+1, cols-win_cols+1,
win_rows, win_cols),
strides=img.strides*2)
そして今、左上隅が position にwin_img[i, j]
ある配列です:(win_rows, win_cols)
[i, j]
>>> img[100:105, 100:105]
array([[ 0.34150754, 0.17888323, 0.67222354, 0.9020784 , 0.48826682],
[ 0.68451774, 0.14887515, 0.44892615, 0.33352743, 0.22090103],
[ 0.41114758, 0.82608407, 0.77190533, 0.42830363, 0.57300759],
[ 0.68435626, 0.94874394, 0.55238567, 0.40367885, 0.42955156],
[ 0.59359203, 0.62237553, 0.58428725, 0.58608119, 0.29157555]])
>>> win_img[100,100]
array([[ 0.34150754, 0.17888323, 0.67222354, 0.9020784 , 0.48826682],
[ 0.68451774, 0.14887515, 0.44892615, 0.33352743, 0.22090103],
[ 0.41114758, 0.82608407, 0.77190533, 0.42830363, 0.57300759],
[ 0.68435626, 0.94874394, 0.55238567, 0.40367885, 0.42955156],
[ 0.59359203, 0.62237553, 0.58428725, 0.58608119, 0.29157555]])
ただし、画像のウィンドウ表示をウィンドウ表示のコピーに変換しないように注意する必要があります。私の例では、25 倍のストレージが必要になります。numpy 1.7 では複数の軸を選択できるため、次のように簡単に実行できると思います。
>>> np.var(win_img, axis=(-1, -2))
私は numpy 1.6.2 で立ち往生しているので、それをテストすることはできません。それほど大きくないウィンドウで失敗する可能性がある他のオプションは、数学を正しく覚えていれば、次のようにすることです。
>>> win_mean = np.sum(np.sum(win_img, axis=-1), axis=-1)/win_rows/win_cols
>>> win_sqr_mean = np.sum(np.sum(win_img**2, axis=-1), axis=-1)/win_rows/win_cols
>>> win_var = win_sqr_mean - win_mean**2
そして今win_var
は形状の配列です
>>> win_var.shape
(496, 496)
で、左上隅win_var[i, j]
のウィンドウの分散を保持します。(5, 5)
[i, j]