Python – Resize rectangular image to square, keeping ratio and fill background with black

image processingnumpyopencvpythonpython-imaging-library

I'm trying to resize a batch of grayscale images that are 256 x N pixels (N varies, but is always ≤256).

My intention is to downscale the images.

The resize would have to output a square (1:1) image, with:

  • resized image centered vertically
  • aspect ratio maintained
  • remaining pixels rendered black

Visually this would be the desired result:

enter image description here

I have tried creating a numpy zeroes matrix with the target size (e.g. 200 x 200) but have not been able to paste the resized image into its vertical center.

Any suggestions using cv2, PIL or numpy are welcome.

Best Answer

You can use Pillow to accomplish that:

Code:

from PIL import Image

def make_square(im, min_size=256, fill_color=(0, 0, 0, 0)):
    x, y = im.size
    size = max(min_size, x, y)
    new_im = Image.new('RGBA', (size, size), fill_color)
    new_im.paste(im, (int((size - x) / 2), int((size - y) / 2)))
    return new_im

Test Code:

test_image = Image.open('hLarp.png')
new_image = make_square(test_image)
new_image.show()

For a white background you can do:

new_image = make_square(test_image, fill_color=(255, 255, 255, 0))

Result:

enter image description here

Related Topic