Разделение изображения на окна разных размеров, которые расположены по центру. питон
В настоящее время я пытаюсь разделить изображение на меньшие окна, которые позже используются для взаимной корреляции. Приведенная ниже функция хорошо работает для этой цели (window_size - это длина размера окна в пикселях (предполагается, что она квадратная), перекрытие на сколько пикселей перекрывают окна (так что для окна 32x32 перекрытие 16 подразумевает половину перекрытия).
Это хорошо работает для этой цели. Однако теперь я хочу сравнить два окна разных размеров (например, одно с размером 24x24, а другое с размером 12x12. "Задача" заключается в том, что они должны быть центрированы, а количество больших и маленьких окон должно быть одинаковым. Я могу в настоящее время достигаем этого, обрезая окно, чтобы центрировать меньшие окна с большими (например, если у меня есть изображение 256x256, я обрезаю его на 6 пикселей со всех сторон, получая изображение 244x244).
Однако, несмотря на то, что обрезка выполняется очень быстро (у меня есть тысячи изображений), но это становится утомительным (и иногда невозможным, если я хочу, чтобы меньшие окна перекрывались), меняя параметр, если я хочу поэкспериментировать с окнами других размеров.
Итак, в основном, мой вопрос, есть ли способ центрировать два окна разных размеров, не обрезая изображение? Некоторые заметки:
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)