在重新整形时,新数组应该具有相同数量的值。您需要的是裁剪图片(如果它大于 224x224)和填充(如果它小于 224x224)或在这两种情况下调整大小。
裁剪只是使用正确的索引进行切片:
def crop(np_img, size):
v_start = round((np_img.shape[0] - size[0]) / 2)
h_start = round((np_img.shape[1] - size[1]) / 2)
return np_img[v_start:v_start+size[1], h_start:h_start+size[0],:]
填充稍微复杂一些,这将创建一个所需形状的 zeros 数组并在里面插入图像的值:
def pad_image(np_img, size):
v_start = round((size[0] - np_img.shape[0]) / 2)
h_start = round((size[1] - np_img.shape[1]) / 2)
result = np.zeros(size)
result[v_start:v_start+np_img.shape[1], h_start:h_start+np_img.shape[0], :] = np_img
return result
你也可以使用np.pad函数:
def pad_image(np_img, size):
v_dif = size[0] - np_img.shape[0]
h_dif = size[1] - np_img.shape[1]
return np.lib.pad(np_img, ((v_dif, 0), (h_dif, 0), (0, 0)), 'constant', constant_values=(0))
您可能意识到两个函数的填充有点不同,我不想让问题过于复杂,只是在第二个函数的顶部和左侧填充。双方都在第一个,因为它更容易计算。
最后,为了调整大小,您最好使用另一个库。您可以使用scipy.misc.imresize,它非常简单。应该这样做:
imresize(np_img, size)