我正在使用图像,我想用零填充numpy数组。 我查看了np.pad
对于填充单个数组,它可以正常工作
x = np.array([[1,2],[3,4]])
y = np.pad(x,(1,1), 'constant')
x
=> array([[1, 2],
[3, 4]])
y
=> array([[0, 0, 0, 0],
[0, 1, 2, 0],
[0, 3, 4, 0],
[0, 0, 0, 0]])
如果列表/数组中有x type
个数组,如
c_x=np.array([[[2,2],[2,3]],[[3,2],[2,3]],[[4,4],[2,3]]])
c_y=np.pad(c_x,((0,0),(1,1),(0,0)),'constant') #padding is present only on top and bottom
由于此类数组包含R,G,B通道,填充时是否可以计算?
修改
Say c_x
存储带有RGB通道的28x28像素的10张图像的列表
现在我要填充所有10张图片,因此在修改10张图片后,这些图像的边长为30x30,边框上的像素为[0,0,0]
答案 0 :(得分:5)
我不清楚您想要的输出是什么,但我认为它是np.pad(c_x, ((1,1), (0,0), (0,0)), mode='constant')
或np.pad(c_x, ((0,0), (1,1), (1,1)), mode='constant')
:
In [228]: c_x
Out[228]:
array([[[2, 2],
[2, 3]],
[[3, 2],
[2, 3]],
[[4, 4],
[2, 3]]])
In [229]: np.pad(c_x, ((1,1), (0,0), (0,0)), mode='constant')
Out[229]:
array([[[0, 0],
[0, 0]],
[[2, 2],
[2, 3]],
[[3, 2],
[2, 3]],
[[4, 4],
[2, 3]],
[[0, 0],
[0, 0]]])
In [230]: np.pad(c_x, ((0,0), (1,1), (1,1)), mode='constant')
Out[230]:
array([[[0, 0, 0, 0],
[0, 2, 2, 0],
[0, 2, 3, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 3, 2, 0],
[0, 2, 3, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 4, 4, 0],
[0, 2, 3, 0],
[0, 0, 0, 0]]])
答案 1 :(得分:1)
这是使用zeros
初始化输出数组然后为其赋值的一种方法 -
def pad3D(c_x, padlen=1):
m,n,r = c_x.shape
c_y = np.zeros((m, n+2*padlen, r+2*padlen),dtype=c_x.dtype)
c_y[:, padlen:-padlen, padlen:-padlen] = c_x
return c_y
现在,考虑到数组可能是图像数据,通常你可能让通道由最后一个轴表示,而前两个轴代表高度和宽度,我们需要在那里更改索引。修改后的部分将是初始化和赋值:
c_y = np.zeros((m+2*padlen, n+2*padlen, r),dtype=c_x.dtype)
c_y[padlen:-padlen, padlen:-padlen, :] = c_x
所以,如果你注意到,我们正在沿着需要填充的轴切割padlen:-padlen
。使用这个一般理论,您可以处理各种图像数据数组以进行填充。
示例运行 -
In [422]: c_x
Out[422]:
array([[[2, 2],
[2, 3]],
[[3, 2],
[2, 3]],
[[4, 4],
[2, 3]]])
In [423]: pad3D(c_x, padlen=1) # pads all across not just top and bottom
Out[423]:
array([[[0, 0, 0, 0],
[0, 2, 2, 0],
[0, 2, 3, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 3, 2, 0],
[0, 2, 3, 0],
[0, 0, 0, 0]],
[[0, 0, 0, 0],
[0, 4, 4, 0],
[0, 2, 3, 0],
[0, 0, 0, 0]]])
答案 2 :(得分:0)
试试这个。使用np.pad
我知道我迟到了,但它可能对某人有所帮助。 :)
def padwithzero(vector, pad_width, iaxis, kwargs):
vector[:pad_width[0]] = 0
vector[-pad_width[1]:] = 0
return vector
tmp_mainImg = np.pad(mainImg, 1, padwithzero)
print(tmp_mainImg)