numpy:用零填充数组

时间:2017-05-23 22:18:31

标签: numpy image-processing

我正在使用图像,我想用零填充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]

3 个答案:

答案 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)