4

Pythonを使って物体検出の画像処理をしています。画像を可能なすべてのブロックに分割する必要があります。たとえば、次のおもちゃの画像があるとします。

x = np.arange(25)
x = x.reshape((5, 5))

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

特定のサイズの可能なすべてのブロックを取得したい。たとえば、2x2 ブロックは次のとおりです。

[[0 1]
 [5 6]]
[[1 2]
 [6 7]]

.. 等々。これどうやってするの?

4

3 に答える 3

3

次のようなものを使用できます。

def rolling_window(arr, window):
    """Very basic multi dimensional rolling window. window should be the shape of
    of the desired subarrays. Window is either a scalar or a tuple of same size
    as `arr.shape`.
    """
    shape = np.array(arr.shape*2)
    strides = np.array(arr.strides*2)
    window = np.asarray(window)
    shape[arr.ndim:] = window # new dimensions size
    shape[:arr.ndim] -= window - 1
    if np.any(shape < 1):
        raise ValueError('window size is too large')
    return np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides)

# Now:
slices = rolling_window(arr, 2)
# Slices will be 4-d not 3-d as you wanted. You can reshape
# but it may need to copy (not if you have done no slicing, etc. with the array):
slices = slices.reshape(-1,slices.shape[2:])
于 2012-12-03T12:08:15.063 に答える
0

2 つのループとスライスを使用した単純なコード:

>>> a = np.arange(12).reshape(3,4)
>>> print(a)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
>>> r = 2
>>> n_rows, n_cols = a.shape
>>> for row in range(n_rows - r + 1):
...     for col in range(n_cols - r + 1):
...         print(a[row:row + r, col:col + r])
...
[[0 1]
 [4 5]]
[[1 2]
 [5 6]]
[[2 3]
 [6 7]]
[[4 5]
 [8 9]]
[[ 5  6]
 [ 9 10]]
[[ 6  7]
 [10 11]]
于 2012-12-03T12:12:40.907 に答える