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:
Visually this would be the desired result:
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.
You can use Pillow
to accomplish that:
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_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))
Here is a code that solve your question with OPENCV module (using NUMPY module too)
#Importing modules opencv + numpy import cv2 import numpy as np #Reading an image (you can use PNG or JPG) img = cv2.imread("image.png") #Getting the bigger side of the image s = max(img.shape[0:2]) #Creating a dark square with NUMPY f = np.zeros((s,s,3),np.uint8) #Getting the centering position ax,ay = (s - img.shape[1])//2,(s - img.shape[0])//2 #Pasting the 'image' in a centering position f[ay:img.shape[0]+ay,ax:ax+img.shape[1]] = img #Showing results (just in case) cv2.imshow("IMG",f) #A pause, waiting for any press in keyboard cv2.waitKey(0) #Saving the image cv2.imwrite("img2square.png",f) cv2.destroyAllWindows()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With