<p>您可以使用<code>numpy.lib.stride_tricks.as_strided</code>获取图像的窗口视图:</p>
<pre><code>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)
</code></pre>
<p>现在<code>win_img[i, j]</code>是<code>(win_rows, win_cols)</code>数组,左上角位于<code>[i, j]</code>:</p>
<pre><code>>>> 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]])
</code></pre>
<p>不过,您必须小心,不要将图像的窗口化视图转换为窗口化副本:在我的示例中,这需要25倍的存储空间。我相信numpy 1.7允许您选择多个轴,因此您可以简单地:</p>
<pre><code>>>> np.var(win_img, axis=(-1, -2))
</code></pre>
<p>我被Numpy1.6.2困住了,所以我无法测试它。另一个可能在没有这么大的窗口时失败的选择是,如果我正确地记住了我的数学公式:</p>
<pre><code>>>> 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
</code></pre>
<p>现在<code>win_var</code>是一个形状数组</p>
<pre><code>>>> win_var.shape
(496, 496)
</code></pre>
<p>并且<code>win_var[i, j]</code>保持<code>(5, 5)</code>窗口的方差,左上角位于<code>[i, j]</code>。</p>