0

この質問 (および jorgeca の回答) へのフォローアップ: 画像を重複するパッチにスライスし、パッチを画像にマージする高速な方法 パッチが適用された配列のインデックスにオフセットを追加したい、つまり:

A = np.arange(W*H).reshape(H,W)
P = patchify(A,(X,Y)) 

X,Y が奇数であると仮定すると、P のサイズは W-X+1,H-Y+1 に等しくなるため、P[0,0] の中心にあるピクセルは実際には A[(Y-1) に対応します。 /2,(X-1)/2]。

P のインデックスを完全に対応させるために (データをコピーせずに) オフセットする方法はありますか?

参考までに、既存の patchify 関数を次に示します。

def patchify(img, patch_shape):
    img = np.ascontiguousarray(img)  # won't make a copy if not needed
    X, Y = img.shape
    x, y = patch_shape
    shape = ((X-x+1), (Y-y+1), x, y) # number of patches, patch_shape
    # The right strides can be thought by:
    # 1) Thinking of `img` as a chunk of memory in C order
    # 2) Asking how many items through that chunk of memory are needed when indices
    #    i,j,k,l are incremented by one
    strides = img.itemsize*np.array([Y, 1, Y, 1])
    return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
4

1 に答える 1

0

次の式です

P = np.roll(np.roll(P, X/2, 0), Y/2, 1)

何が必要?

デモ:

>>> W, H, X, Y =  10, 14, 5, 7
>>> A = np.arange(W*H).reshape(W,H)
>>> P = patchify(A,(X,Y))
>>> P = np.roll(np.roll(P, X/2, 0), Y/2, 1)
>>> all(map(all, P[X/2, Y/2] == A[:X, :Y]))
True    
于 2013-12-17T14:58:47.687 に答える