这可能不是最节省空间的,但一种方法是创建一个新数组并将现有数组放置在该数组的中心。
>>> import numpy as np
>>> np.random.seed(444)
>>> arr = np.zeros((4, 5)) # your image array
>>> newsize = tuple(i + 2 for i in arr.shape)
>>> new = np.random.randint(low=0, high=50, size=newsize)
>>> new[1:-1, 1:-1] = arr
>>> new
array([[ 3, 48, 23, 8, 3, 39, 12],
[47, 0, 0, 0, 0, 0, 15],
[34, 0, 0, 0, 0, 0, 0],
[ 6, 0, 0, 0, 0, 0, 6],
[39, 0, 0, 0, 0, 0, 13],
[ 2, 15, 9, 34, 9, 24, 25]])
这是假设您的图像是灰度 (2d) 而不是 3 维 MxNx4 RGBA 数组。在这种情况下,您需要new[1:-1, 1:-1, 1:-1]。
您也可以通过将可调用对象传递给np.pad() 来执行此操作,但有一个警告(见下文):
from functools import partial
def _pad_random(vector, pad_width, iaxis, kwargs, low, high):
a, b = np.random.randint(low, high, size=2)
vector[:pad_width[0]] = a
vector[-pad_width[1]:] = b
return vector
pad_random = partial(_pad_random, low=0, high=50)
用法:
>>> np.pad(arr, 1, pad_random)
array([[23., 19., 6., 47., 17., 7., 26.],
[26., 0., 0., 0., 0., 0., 37.],
[39., 0., 0., 0., 0., 0., 39.],
[39., 0., 0., 0., 0., 0., 42.],
[28., 0., 0., 0., 0., 0., 47.],
[11., 32., 37., 2., 38., 30., 44.]])
警告:看起来,当您将函数传递给np.pad() 的mode 参数时,该函数会被多次调用。这是一个直接来自文档的示例,其中包含一些打印调用:
>>> def pad_with(vector, pad_width, iaxis, kwargs):
... pad_value = kwargs.get('padder', 10)
... print(vector[:pad_width[0]])
... print(vector[-pad_width[1]:])
... vector[:pad_width[0]] = pad_value
... vector[-pad_width[1]:] = pad_value
... return vector
...
>>> arr = np.arange(6).reshape(3, 2)
>>> np.pad(arr, 1, pad_with)
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[10]
[10]
[0]
[0]
[0]
[0]
[0]
[0]
[10]
[10]
array([[10, 10, 10, 10],
[10, 0, 1, 10],
[10, 2, 3, 10],
[10, 4, 5, 10],
[10, 10, 10, 10]])
因此,只要图像不太大,使用上述第一种方法可能会更省时。