<p>因为<a href="https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.misc.lena.html" rel="nofollow noreferrer">scipy.misc.lena()</a>在>;0.17中不再可用,所以要更新@ali\u m answer's。下面是一个使用RGB图像<a href="https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.misc.face.html#scipy.misc.face" rel="nofollow noreferrer">scipy.misc.face()</a>的示例,对OP中提供的滑动窗口源代码稍作修改</p>
<pre><code>import numpy as np
from scipy.misc import ascent, face
from matplotlib import pyplot as plt
from numpy.lib.stride_tricks import as_strided as ast
def get_win_pixel_coords(grid_pos, win_shape, shift_size=None):
if shift_size is None:
shift_size = win_shape
gr, gc = grid_pos
sr, sc = shift_size
wr, wc = win_shape
top, bottom = gr * sr, (gr * sr) + wr
left, right = gc * sc, (gc * sc) + wc
return top, bottom, left, right
def norm_shape(shape):
'''
Normalize numpy array shapes so they're always expressed as a tuple,
even for one-dimensional shapes.
Parameters
shape - an int, or a tuple of ints
Returns
a shape tuple
'''
try:
i = int(shape)
return (i,)
except TypeError:
# shape was not a number
pass
try:
t = tuple(shape)
return t
except TypeError:
# shape was not iterable
pass
raise TypeError('shape must be an int, or a tuple of ints')
def sliding_window(a,ws,ss = None,flatten = True):
'''
Return a sliding window over a in any number of dimensions
'''
if None is ss:
# ss was not provided. the windows will not overlap in any direction.
ss = ws
ws = norm_shape(ws)
ss = norm_shape(ss)
# convert ws, ss, and a.shape to numpy arrays
ws = np.array(ws)
ss = np.array(ss)
shap = np.array(a.shape)
# ensure that ws, ss, and a.shape all have the same number of dimensions
ls = [len(shap),len(ws),len(ss)]
if 1 != len(set(ls)):
raise ValueError(\
'a.shape, ws and ss must all have the same length. They were %s' % str(ls))
# ensure that ws is smaller than a in every dimension
if np.any(ws > shap):
raise ValueError(\
'ws cannot be larger than a in any dimension.\
a.shape was %s and ws was %s' % (str(a.shape),str(ws)))
# how many slices will there be in each dimension?
newshape = norm_shape(((shap - ws) // ss) + 1)
# the shape of the strided array will be the number of slices in each dimension
# plus the shape of the window (tuple addition)
newshape += norm_shape(ws)
# the strides tuple will be the array's strides multiplied by step size, plus
# the array's strides (tuple addition)
newstrides = norm_shape(np.array(a.strides) * ss) + a.strides
a = ast(a,shape = newshape,strides = newstrides)
if not flatten:
return a
# Collapse strided so that it has one more dimension than the window. I.e.,
# the new array is a flat list of slices.
meat = len(ws) if ws.shape else 0
firstdim = (np.product(newshape[:-meat]),) if ws.shape else ()
dim = firstdim + (newshape[-meat:])
# remove any dimensions with size 1
#dim = filter(lambda i : i != 1,dim)
return a.reshape(dim), newshape
</code></pre>
<p>将返回变量<code>newshape</code>添加到<code>sliding_window()</code>可以传递<code>flatten=True</code>,并且仍然知道滑动窗口函数创建的网格的性质。在我的应用程序中,计算窗口的展平向量是可取的,因为这是一个很好的点来缩放应用于每个计算窗口的计算。在</p>
<p>如果一个96x96窗口(即<code>tile</code>x<code>tile</code>)在两个方向上有50%的重叠应用于形状为<code>(768,1024,3)</code>的图像,则可以对输入图像进行填充,以确保在创建滑动窗口之前,输入图像可以被N个没有余数的窗口整除。在</p>
^{pr2}$
<p>计算窗口的网格包含15行21列和315个计算窗口。<code>grid_pos</code>可以使用计算窗口的平坦向量(即<code>win</code>)、<code>ind[0]</code>和{<cd10>}的索引来确定。如果我们对第239个计算窗口感兴趣:</p>
<pre><code>grid_pos = np.unravel_index(239,(ind[0],ind[1]))
print(grid_pos1)
#(11, 8)
</code></pre>
<p>然后,可以使用以下方法找到原始图像中计算窗口的边界坐标:</p>
<pre><code>t, b, l, r = get_win_pixel_coords(grid_pos, (96, 96), (48,48))
print(np.all(pad_img[t:b, l:r] == win[239]))
#True
</code></pre>