AyeAye
AyeAye

Reputation: 63

Zero-Padding an image without numpy

I am a beginner with Python and I am learning how to treat images.

Given a square image (NxN), I would like to make it into a (N+2)x(N+2) image with a new layer of zeros around it. I would prefer not to use numpy and only stick with the basic python programming. Any idea on how to do so ?

Right now, I used .extend to add zeros on the right side and on the bottom but can't do it up and left.

Thank you for your help!

Upvotes: 0

Views: 2662

Answers (2)

Joe Iddon
Joe Iddon

Reputation: 20414

We can create a padding function that adds layers of zeros around an image (padding it).

def pad(img,layers):
    #img should be rectangular
    return [[0]*(len(img[0])+2*layers)]*layers    + \
           [[0]*layers+r+[0]*layers for r in img] + \
           [[0]*(len(img[0])+2*layers)]*layers

We can test with a sample image, such as:

i = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

So,

pad(i,2)

gives:

[[0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 2, 3, 0, 0],
 [0, 0, 4, 5, 6, 0, 0],
 [0, 0, 7, 8, 9, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]]

Upvotes: 2

Marcus Grass
Marcus Grass

Reputation: 1083

Im assuming that by image we're talking about a matrix, in that case you could do this:

img = [[5, 5, 5], [5, 5, 5], [5, 5, 5]]
row_len = len(img)
col_len = len(img[0])

new_image = list()
for n in range(col_len+2):  # Adding two more rows
    if n == 0 or n == col_len + 1:
        new_image.append([0] * (row_len + 2))  # First and last row is just zeroes
    else:
        new_image.append([0] + img[n - 1] + [0])  # Append a zero to the front and back of each row

print(new_image)  # [[0, 0, 0, 0, 0], [0, 5, 5, 5, 0], [0, 5, 5, 5, 0], [0, 5, 5, 5, 0], [0, 0, 0, 0, 0]]

Upvotes: 1

Related Questions