У меня размер изображения 256x256
. Я извлечу изображение в патчи размером 32x32
, а центр патча будет скользить с шагом окна 20. Если извлеченный размер патча меньше 32x32
. Затем добавьте нулевое заполнение, чтобы получить 32x32
. Код для извлечения патча:
import numpy as np
image = np.random.randn(256,256)
patch_H, patch_W = 32, 32
step_H, step_W = 20, 20
lst_H = np.arange(0, image.shape[0] + patch_H, step_H)
lst_W = np.arange(0, image.shape[1] + patch_W, step_W)
image_patches =[]
for i in range(len(lst_H)):
for j in range(len(lst_W)):
h= lst_H[i]
w= lst_W[j]
patch = image[h : h + patch_H, w : w + patch_W]
# Zero padding
if (patch.shape[0]!= patch_H or patch.shape[1]!= patch_W):
patch = np.pad(patch,[(0, patch_H- patch.shape[0]), (0, patch_W- patch.shape[1])], mode='constant')
patch =patch[None,:,:]
image_patches.append(patch)
image_patches = np.vstack(image_patches) # (225, 32, 32)
Используя приведенный выше код, я получаю 225 патчей размером 32x32
. Из image_patches
я хочу создать новое изображение того же размера, что и исходное изображение (256x256
), и значения суммируются между перекрывающимися патчами.
Сложность в том, что на первом шаге мне нужно распаковать патчи с нулевым заполнением. Таким образом, я не могу назначить image_rec[h : h + patch_H, w : w + patch_W]+=image_patches[num_patches,:,:]
в приведенном ниже коде, если я не распаковал их. Как я мог решить проблему? На мой взгляд, я думаю, что мы должны сохранить словарь, чтобы сохранить другие ключи, такие как нулевой флаг, позиция ... Это то, что я сделал
# Recover the image
image_rec = np.zeros (image.shape)
num_patches=0
for i in range(len(lst_H)):
for j in range(len(lst_W)):
h= lst_H[i]
w= lst_W[j]
image_rec[h : h + patch_H, w : w + patch_W]+=image_patches[num_patches,:,:]
num_patches +=1