1

現在、画像を小さなウィンドウに分割しようとしています。これは後で相互相関に使用されます。以下の関数は目的に適しています (window_size はピクセル単位のウィンドウ サイズの長さ (正方形であると想定)、overlap はウィンドウが重なるピクセル数です (32x32 ウィンドウの場合、16 個の重なりは半分の重なりを意味します)。

それはその目的のためにうまく機能します。ただし、現在、2 つの異なるサイズのウィンドウを比較したいと考えています (たとえば、1 つは 24x24 で、もう 1 つは 12x12 です。「課題」は、それらを中央に配置する必要があり、大きなウィンドウと小さなウィンドウの数を同じにする必要があることです。現在、ウィンドウをトリミングして小さなウィンドウを大きなウィンドウの中央に配置することでこれを実現しています (たとえば、256x256 の画像がある場合、すべての方向から 6px ずつトリミングして 244x244 の画像を取得します)。

ただし、トリミングは非常に高速ですが (何千もの画像があります)、他のサイズのウィンドウを試してみたい場合にパラメーターを変更するのは面倒です (小さなウィンドウをオーバーラップさせたい場合は不可能な場合もあります)。

基本的に、私の質問は、画像をトリミングせずに、2 つの異なるサイズのウィンドウを中央に配置する方法はありますか? いくつかのメモ:

1)サイズの増加が黒(またはグレースケール値0)の画像である場合、大きなウィンドウは画像の「範囲外」になる可能性があります。2) 大きなウィンドウと小さなウィンドウの数は同じでなければなりません。

def moving_window_array(array, window_size, overlap):
"""
Create from the array a new array
with three dimension, of size (n_windows, window_size, window_size), in which
each slice, (along the first axis) is an interrogation window.
"""

    sz = array.itemsize
    shape = array.shape

    strides = (sz*shape[1]*(window_size-overlap), sz*(window_size-overlap),
               sz*shape[1], sz)
    shape = (int((shape[0] - window_size)/(window_size-overlap))+1,
             int((shape[1] - window_size)/(window_size-overlap))+1 ,
             window_size, window_size)

    return numpy.lib.stride_tricks.as_strided(array, strides=strides,
                                              shape=shape ).reshape(-1, window_size,
                                                                    window_size)
4

0 に答える 0